@Configuration在Spring中使用@Configurable的奇怪行为

时间:2013-11-25 12:41:20

标签: spring configuration annotations components configurable

我一直在使用基于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),如何BeanBApplication得到它! / p>

你有什么想法为什么会发生?一旦我在web.xml中注释掉回到我以前的(基于XML的)配置的行,就会开始工作。

我很高兴的猜测是,XML Spring条目在封面下注册的内容比基于注释的对应项更多。我花了半天的时间试图找出,那可能是什么,但我放弃了。我很感激任何建议。

0 个答案:

没有答案