我一直在使用基于XML的配置 - 我们有一个Vaadin应用程序,Spring用作DI,但我们对DispacherServlet
不感兴趣 - 只有root上下文,我们用来注入全局(不是用户拥有的依赖项)。
工作方式
我已将root-context.xml
文件定义为内容:
<context:annotation-config />
<context:spring-configured />
<context:load-time-weaver />
<context:component-scan base-package="com.example" />
我的web.xml
就在其中:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
然后,我的一些类使用@Component
注释定义,而其他类使用@Configurable
定义(后者主要属于用户会话,因此对于使用new
关键字创建的每个实例都需要DI)
我有context.xml
个文件行:
<Loader delegate="false" loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader" />
Tomcat spring-instrument-tomcat-3.2.1.RELEASE.jar
目录中的lib
所有依赖项都正确地注入@Autowire
类@Configurable
类。
它不起作用的方式
最近我试图摆脱root-context.xml
并将上下文初始化移到Java @Configuration
类
我按如下方式创建了一个类:
@Configuration
@EnableSpringConfigured
@EnableLoadTimeWeaving
@ComponentScan("com.example")
public class BeansConfiguration
{
}
此外,我更改了web.xml
个条目:
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.example.spring.BeansConfiguration</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
不幸的是,奇怪的事情开始发生了。让我举个例子。简化我的类结构如下:
@Component
public class ComponentA
{
}
@Configurable
public class BeanB
{
@Autowired
private ComponentA componentA;
}
@Configurable
public class BeanC
{
@Autowired
private ComponentA componentA;
private BeanB beanB;
public BeanC(BeanB beanB)
{
this.beanB = beanB;
}
}
@Configurable
public class Application
{
@Autowired
private ComponentA componentA;
public Application()
{
}
public void init()
{
BeanC beanC = new BeanC(new BeanB());
}
}
使用XML设置,当它正常工作时,Spring会将ComponentA
正确地注入到我的所有@Configurable
个对象中。
奇怪的是,仅注释配置BeanC
没有注入ComponentA
(它总是null
),如何BeanB
和Application
得到它! / p>
你有什么想法为什么会发生?一旦我在web.xml
中注释掉回到我以前的(基于XML的)配置的行,就会开始工作。
我很高兴的猜测是,XML Spring条目在封面下注册的内容比基于注释的对应项更多。我花了半天的时间试图找出,那可能是什么,但我放弃了。我很感激任何建议。