我有一个应用程序,我试图将最新的 Spring 3 约定与基于注释的配置结合使用,但我也有使用构造函数注入(inject)的遗留类。根据 Spring 文档,您应该只调用创建该依赖项的方法并将其传递给需要它的构造函数。这似乎在 Configuration 类被增强时起作用,但似乎如果您 @Import Configuration 类,它就不会被增强,因此它可能会注入(inject)非 Autowiring 的实例。
具体来说,如果我的一个存储库是通过构造函数注入(inject)到另一个 bean 中的,并且该存储库是在与另一个 bean 相同的配置类中定义的(我知道存储库应该在它们自己的配置类中),那么它就没有连接使用注入(inject)的 EntityManager。
我的 bean :
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 注入(inject)到另一个配置类中的任何东西,导入它,然后在需要构造函数注入(inject)它的配置类中设置 @Autowired 依赖项。
我在 AnnotationConfigWebApplicationContext 中加载它,如果我在 contextConfigLocation 中指定每个配置类,那么所有配置类都会得到适当增强,但这似乎没有使用“模块化”@Import 功能。
最佳答案
所以...我猜这是一个错误?
关于java - Spring 3 Java 配置 : Imported @Configuration not enhanced?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2076354/