Spring 3 Java Config:导入的@Configuration没有增强?

时间:2010-01-16 05:57:48

标签: java spring applicationcontext

我有一个应用程序,我正在尝试使用基于注释的配置的最新Spring 3约定,但我也有使用构造函数注入的遗留类。基于Spring文档,您应该只调用创建该依赖项的方法并将其传递给需要它的构造函数。这似乎在Configuration类增强时起作用,但是如果你@Inmport配置类,它似乎没有增强,所以它可能会注入非自动装配的实例。

具体来说,如果我的一个存储库被构造函数注入到另一个bean中,并且该存储库在与另一个bean相同的Configuration类中定义(我知道存储库应该在它们自己的配置类中),那么它就没有连线使用注入的EntityManager。

我的豆子:

public class MyBean {
    private ShouldBeSingleton d;
    public @Autowired MyBean(ShouldBeSingleton d) { this.d = d; }   
    public ShouldBeSingleton getMyDependency() { return d; }
}

public class ShouldBeSingleton { 
}

这样的两个配置类:

@Configuration
public class MyImportedConfig { 
    @Bean public ShouldBeSingleton mySingleton() {
        return new ShouldBeSingleton();
    }       
    @Bean public MyBean myBean() {
        return new MyBean(mySingleton());
    }       
}

@Configuration
@Import({MyImportedConfig.class})
public class MyConfig {
}

我的主要看起来像这样:

public static void main(String[] args) {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
    MyBean bean = context.getBean(MyBean.class);
    System.out.println("myInjectedSingleton=" + bean.getMyDependency());
    System.out.println("mySingleton=" + context.getBean(ShouldBeSingleton.class));
}

如果我加载了MyImportedConfig.class,我得到了正确的输出(例如,如果我从MyImportedConfig中调用该方法,则单例类是相同的):

myInjectedSingleton=test.ShouldBeSingleton@b42cbf
mySingleton=test.ShouldBeSingleton@b42cbf

但是,如果我更改AnnotationConfigApplicationContext以加载导入MyImportedConfig的MyConfig,则会发生这种情况:

myInjectedSingleton=test.ShouldBeSingleton@a9ae05
mySingleton=test.ShouldBeSingleton@1dff3a2

这是预期的行为吗?我目前的解决方法是移动任何需要将EntityManager注入另一个Configuration类,导入它,然后在Configuration类中设置需要构造函数注入它的@Autowired依赖项。

我在AnnotationConfigWebApplicationContext中加载它,如果我在contextConfigLocation中指定每个Configuration类,那么所有的Configuration类都会得到适当的增强,但这似乎并没有使用“模块化”的@Import功能。

1 个答案:

答案 0 :(得分:1)

所以......我猜这是一个错误?