从完全相同的@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的主要内容,如果未能解决你的问题,请参考以下文章

C++ 克隆习语中协变返回类型的用处?

常见的 Ruby 习语

从 int|double 到 string 的转换的简洁 C++ 习语是啥? [复制]

是否有“从列表的开头选择并减少直到结果满足谓词”的函数式编程习语?

您从经验中学到了哪些与 C++ 相关的习语、误解和陷阱?

耽在古汉语中啥意思