我有一个应用程序,我正在尝试使用基于注释的配置的最新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功能。
答案 0 :(得分:1)
所以......我猜这是一个错误?