从完全相同的@Configuration类习语中注入@Beans
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从完全相同的@Configuration类习语中注入@Beans相关的知识,希望对你有一定的参考价值。
[过去我见过人们使用以下2种习语从同一@Configuration
注入依赖项:
@Configuration
public class MyConfiguration
@Bean
public MyBeanDependencyA myBeanDependencyA()
return new MyBeanDependencyA();
@Bean . //IDIOM 1
public MyBeanDependencyB1 myBeanDependencyB1()
return new MyBeanDependencyB1(myBeanDependencyA());
@Bean //IDIOM 2
public MyBeanDependencyB2 myBeanDependencyB2(MyBeanDependencyA myBeanDependencyA)
return new MyBeanDependencyB1(myBeanDependencyA);
它们之间有实际区别吗?
- Spring是否在每次调用IDIOM 1时都处理整个实例化方法? (有关方法是否有副作用,可能不是幂等的?)
- 在注入IDIOM 1时,Spring是否还会注入全局托管实例? (如果某些外部进程更改了原始单例bean的状态,则相关)
Spring容器这么聪明吗?
[这称为inter-bean dependencies,在@Bean
类中使用@Configuration
注释进行注释的方法将在spring IOC容器中创建一个bean
@Bean批注用于指示方法实例化,配置和初始化要由Spring IoC容器管理的新对象。对于熟悉Spring的XML配置的人,@Bean批注与元素。您可以将@Bean批注方法与任何Spring @Component一起使用,但是,它们通常与@Configuration bean一起使用。
[Basic concepts: @Bean and @Configuration此Bean间的依赖项仅可与@Bean
和@Configuration
组合使用,这也可以防止多次调用同一bean方法。
仅在@Configuration类中使用@Bean方法是确保始终使用“完全”模式的建议方法。这将防止相同的@Bean方法被意外调用多次,并有助于减少在“精简”模式下运行时难以跟踪的细微错误。
Spring是否在每次调用IDIOM 1时都处理整个实例化方法? (有关方法是否有副作用,可能不是幂等的?)
默认情况下,@Configuration
类在运行时被代理,因此MyBeanDependencyA
将被创建一次,并且myBeanDependencyA()
将仅被Spring调用一次,而下一次调用将被代理返回相同的实例。在上下文中,此bean只有一个实例,因为它的范围是Singleton
。
在注入IDIOM 1时,Spring是否还会注入全局托管实例? (如果某些外部进程更改了原始单例bean的状态,则相关)
IOC容器将被查询返回相同的Singleton bean实例。由于它是Singleton
,因此对该bean的所有更改(如果它是可变的)对于引用该bean的组件都是可见的。]
以上是关于从完全相同的@Configuration类习语中注入@Beans的主要内容,如果未能解决你的问题,请参考以下文章
从 int|double 到 string 的转换的简洁 C++ 习语是啥? [复制]