java - 从完全相同的 @Configuration 类习惯用法中注入(inject) @Beans

标签 java spring spring-boot inversion-of-control ioc-container

过去,我见过人们使用以下 2 个习惯用法从同一个 @Configuration 注入(inject)依赖项:

@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 时处理整个实例化方法? (如果方法有任何副作用,则相关,可能不是幂等的)?
  • Spring 在为 IDIOM 1 注入(inject)时是否会注入(inject)全局托管实例? (相关如果某个外部进程改变了原始单例 bean 的状态)

Spring容器有那么聪明吗?

最佳答案

Does Spring process the whole instantiation method in each call for IDIOM 1? (relevant if method has any side-effect, might be not idempotent)?

默认情况下,@Configuration类在运行时被代理,因此MyBeanDependencyA将被创建一次,并且myBeanDependencyA()将仅被调用一次Spring 和下一个调用将被代理以返回相同的实例(就您共享的示例而言)。上下文中只会有该 bean 的一个实例,因为它的范围是 Singleton

<小时/>

Does otherwise Spring inject the global managed instance when injecting for IDIOM 1? (relevant If some external process changes the state of the original singleton bean)

当 IOC 容器被查询时,它将返回 Singleton bean 的相同实例。由于它是一个 Singleton,对此 bean 的所有更改(如果它是可变的)对于引用它的组件来说都是可见的。

<小时/>

作为旁注,您可以禁用配置类的自动代理,因为 Spring 5.2通过使用:

@Configuration(proxyBeanMethods = false)

这将阻止从其他 @Bean 方法调用的用 @Bean 注释的方法的代理调用。

关于java - 从完全相同的 @Configuration 类习惯用法中注入(inject) @Beans,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59059368/

相关文章:

spring - :href in spring boot Thymeleaf?中如何传递参数

java - 为什么它甚至可以编译? - 使用 swig 生成的类从 java 编译和运行 native 方法

java - 在 Eclipse 插件中,获取与所选 java 文件相对应的 .class 文件的正确方法是什么?

java - 将Matlab中的快速MCLT算法转换为java

java - 服务的访问控制(设计决策)

java - 嵌套异常是 java.lang.NoClassDefFoundError : org/springframework/data/mapping/IdentifierAccessor

spring - 从 Spring Boot 1.3.0M1 切换到 1.3.0M2 时出现 "NoClassDefFoundError: GenericApplicationListener"

java - 如何使用 xuggler 从 Flash 视频创建一个缩略图?

java - 需要 Spring 源工具帮助

mysql - Spring 启动: Found shared references to a collection error