通过方法调用VS新运营商获得的Spring bean

问题描述 投票:1回答:2

我很困惑这个小话题。我曾读到,如果一个类与@Component注解,它是春天的托管bean什么时候需要它,春天就会提供。我有一个bean的范围混淆它。让我解释:

比方说,一类

@Component
public class Example{ }

如果我实例化这个类中使用new Example()其他类中,将容器总是给我同样的例子中的物体所有的时间?还是会返回每次我新的目标?

这里谈到的混淆的部分:

如果在同一个班,我有两个豆是这样的:

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

}

将在此情况下,会发生什么? SqlDataSource的()方法调用将再次返回相同的对象,并再次要求每次SomeObject豆,或者数据源的新实例将被返回每次SomeObject要求?

请帮忙。

java spring
2个回答
1
投票

@Bean是一个方法级的注释,表明春天调用该方法时,创建一个bean。这意味着在XML配置相同的功能腋臭标签。

此注释必须在@Configuration注解类的内部使用,否则,如果你调用从另一个方法,该方法将是一个普通的Java新的操作,而不是春天的。看到这个帖子 - > @Bean inside class with @Configuration and witout it

考虑到新SomeObject到这一点(的SqlDataSource());将等于新SomeObject(新的SqlDataSource());

如果你注释实例与@Configuration会发生什么是你会得到总是新SomeObject实例与同一SqlDataSource的对象,这意味着春天将只创建一个SqlDataSource的,因为它是单身的照顾。


1
投票
@Bean DataSource sqlDataSource() {
     // some logic
}

这定义数据源的单一实例。所以每次你申请一个新的SomeObject将创建SomeObject的一个实例(当它在原型范围内定义),但他们都将共享同一个数据源对象(因为它是一个单例的bean)。

© www.soinside.com 2019 - 2024. All rights reserved.