我可以将ApplicationContext定义为Spring XML配置中的构造函数arg吗?

时间:2015-02-03 06:46:45

标签: spring

如果我需要访问bean类的构造函数中的ApplicationContext,有没有办法用XML配置bean而不是实现ApplicationContextAware

注意:我知道我可以使用注释驱动的配置并使用@Autowire标记构造函数来完成此操作。我特别感兴趣的是XML配置是否可行。

1 个答案:

答案 0 :(得分:0)

需要

  

在我的bean类的构造函数中访问ApplicationContext

已经很“糟糕” ...:[1] [2](请首先尝试摆脱这种需要/改变主意!:)

当然,ref="applicationContext"会很好,但是它不起作用/没人知道如何...。但是这种“大锤”方法可以克服:[3](2007 ... mmmhk, ...“车轮”甚至更老了....))

.. a“ singelton应用程序上下文包装器bean”,您可以(构造器)在任何地方注入(几乎;)。 (如xml中一样,如java config中一样。)

ApplicationContextWrapper.java:

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
*  Thx to: http://sujitpal.blogspot.com/2007/03/accessing-spring-beans-from-legacy-code.html
**/
public class ApplicationContextWrapper implements ApplicationContextAware {
  /** the original post has static variable and get-method, but within spring context,
  * and clean initialisation&wiring, it can be oblet.**/
  private /*static*/ ApplicationContext CONTEXT;

  @Override
  public void setApplicationContext(ApplicationContext context) throws BeansException {
    CONTEXT = context;
  }

  public /*static*/ ApplicationContext getContext() {
    return CONTEXT;
  }
}

applicationContext.xml:

<bean id="myWrapper" class="[some.package.]ApplicationContextWrapper"/>

<bean id="myCtxtDependentBean" class="[some.package.]CrazyBean" >
   <constructor-arg ref="myWrapper" />
</bean>

CrazyBean.java:

public class CrazyBean {

    public CrazyBean(ApplicationContextWrapper wrapper) {
        ApplicationContext ctxt = wrapper.getContext();
        // do crazy stuff here :)
    }

    // or in a static variant, just:
    public CrazyBean() { // ...no arguments, no injection
       ApplicationContext ctxt = ApplicationContextWrapper.getContext();
       // but ensure setApplicationContext's been called...
    }
}