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

时间:2019-02-03 08:49:31

标签: java spring

我对这个小话题感到困惑。我读到某个地方,如果用@Component注释了一个类,则它是spring托管的bean,只要需要,spring就会提供它。我把它与bean的范围混淆了。让我解释一下:

我们说一堂课

@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()); //**
    }

}

在这种情况下会发生什么?每次请求SomeObject bean时,sqlDataSource()方法调用会一次又一次返回相同的对象,还是每次请求SomeObject时都会返回新的DataSource实例?

请帮助。

2 个答案:

答案 0 :(得分:1)

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

这定义了DataSource的单例实例。因此,每次您请求SomeObject的实例时,都会创建一个新的SomeObject(在原型范围中定义),但是它们都将共享同一个DataSource对象(因为它是单例bean)。

答案 1 :(得分:1)

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

此注释必须在@Configuration带注释的类中使用,否则,如果您从另一个方法调用该方法,则它将是常规的Java新操作,而不是spring的操作。看到这篇文章-> @Bean inside class with @Configuration and witout it

请牢记这一点:new SomeObject(sqlDataSource());等于new SomeObject(new SqlDataSource());

如果使用@Configuration注释示例,将发生的情况是,您将始终获得带有相同sqlDataSource对象的新SomeObject实例,这意味着Spring将只创建一个sqlDataSource,因为它是单例的。