SpringJava配置bean方法调用是否在运行时被注入托管bean?
考虑以下代码:SpringJava配置bean方法调用是否在运行时被注入托管bean?,java,spring,Java,Spring,考虑以下代码: 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 AIm
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管理的单例还是新实例?也就是说,spring是否在Java配置类中拦截方法调用,并将其代理到适当的应用程序上下文
更新据我所知,CGLIB库涉及java配置类来修改字节码,这是否意味着后一种情况是正确的?我只是还没有完全了解它是如何工作的。
A类
应该在bean2
和bean2
中由相同的ApplicationContext
对象表示(特别是如果您在@Configuration
中将bean
声明为方法时),但您也可以使用Spring容器中实现的依赖注入。在我看来,这段代码更加清晰和明确,但读者必须知道自动换行是如何工作的
此代码等效为:
@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,您无法在遗留代码中执行此操作)
但此解决方案需要将@组件扫描(packages=“name.of.your.package”)
添加到@配置
类中
@ComponentScan(packages="name.of.your.package")
@Configuration
public class MyConfiguration {
...
}
所以你要说的是,它确实是托管bean的代理,但是为了清晰起见,我应该使注入显式化。顺便说一句,你的第一个建议中没有@Autowired/@Inject有什么关系,还是你把它们漏掉了?
@ComponentScan(packages="name.of.your.package")
@Configuration
public class MyConfiguration {
...
}