通过方法调用与新运算符获取 Spring bean



我对这个小话题感到困惑。我在某处读到,如果一个类用 @Component 注释,它是 Spring 管理的 bean,在需要时,spring 会提供它。我将其与豆子的范围混淆了。让我解释一下:

假设一个类

@Component
public class Example{ }

如果我使用 new Example() 在其他类中实例化这个类,容器是否总是一直为我提供相同的 Example 对象?还是每次都会给我新对象?

这是令人困惑的部分:

如果在同一类中,我有两个这样的豆子:

@Component
public class Example {
    @Bean DataSource sqlDataSource() {
         // some logic
    }
    @Bean @Scope("prototype") SomeObject getSomeObject() {
         return new SomeObject(sqlDataSource()); //**
    }
}

在这种情况下会发生什么? sqlDataSource() 方法调用会在每次请求某个对象 bean 时一次又一次地返回相同的对象,或者每次请求某个对象时都会返回新的数据源实例?

@Bean是一个

方法级注释,指示 Spring 在调用该方法时创建 Bean。这意味着具有与 XML 配置中的标记相同的功能。

此注解必须在@Configuration注释类中使用,否则,如果您从另一个方法调用该方法,它将是一个正常的 java 新操作,而不是 spring 的操作。看到这篇文章 --> @Bean @Configuration 的课堂内部并机智地知道

记住这一点,新的 SomeObject(sqlDataSource()); 将等于新的 SomeObject(new SqlDataSource());

如果你用@Configuration注释示例,你将始终得到一个具有相同sqlDataSource对象的新SomeObject实例,这意味着Spring将负责只创建一个sqlDataSource,因为它是单例的。

@Bean DataSource sqlDataSource() {
     // some logic
}

这将定义数据源的单一实例。因此,每次您请求 SomeObject 的实例时,都会创建一个新的 SomeObject(虽然它是在原型作用域中定义的),但它们都将共享相同的 DataSource 对象(因为它是单例 bean)。

最新更新