如果我需要访问bean类的构造函数中的ApplicationContext
,有没有办法用XML配置bean而不是实现ApplicationContextAware
?
注意:我知道我可以使用注释驱动的配置并使用@Autowire
标记构造函数来完成此操作。我特别感兴趣的是XML配置是否可行。
答案 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...
}
}