请考虑以下代码:
public class AImpl implements A {}
public class BImpl implements B {
private final A a;
public B(A a){
this.a = a;
}
}
@Configuration
public class MyConfiguration {
@Bean
public A bean1(){
return new AImpl();
}
@Bean
public B bean2() {
return new BImpl(bean1());
}
@Bean
public B bean3() {
return new BImpl(bean1());
}
}
bean2
和bean3
对bean1
的引用是弹出托管单例还是新实例?即Spring的拦截方法是否在Java配置类中调用,并使用适当的应用程序上下文代理?
更新,CGLIB库参与java配置类来修改字节码,这是否意味着后一种情况是真的?我还没有完全了解它是如何运作的。
答案 0 :(得分:0)
Class A
应该在同一个bean2
的同一个对象中同时代表bean2
和ApplicationContext
(特别是如果您在Beans
中声明@Configuration
作为方法{1}}),但您也可以使用Spring Container中实现的依赖注入。我认为这段代码更清晰明确,但读者必须知道Autoriwiring的工作原理。
此代码等效:
@Configuration
public class MyConfiguration {
@Bean
public A bean1(){
return new AImpl();
}
@Bean
public B bean2(A bean1) {
return new BImpl(bean1);
}
@Bean
public B bean3(A bean1) {
return new BImpl(bean1);
}
}
第二种方式:
在声明的类上添加@Component和@Inject / @Autowired(在遗留代码中,不能在没有AOP的情况下执行此操作)。
@Component
public class AImpl implements A {}
@Component
public class BImpl implements B {
private final A a;
@Inject
public B(A a){
this.a = a;
}
}
但是此解决方案需要将@ComponentScan(packages="name.of.your.package")
添加到您的@Configuration
课程中。
@ComponentScan(packages="name.of.your.package")
@Configuration
public class MyConfiguration {
...
}