如果使用@Bean标签创建一个bean,那么我们可以创建两个bean。每个applicaton如何单例

时间:2019-04-14 04:37:24

标签: java spring singleton

在这里,如果StudentInfo类是原型,那么它将创建两个单独的引用,这很好,但是在单例的情况下,它还将创建两个将student和student1命名为bean,那么它将打破每个应用程序上下文的单例规则。如果我缺少什么,请告诉我。在这种情况下,如何为每个应用程序上下文创建一个单例bean?

@Configuration
@ComponentScan("com.spring")
public class AnnotationConfiguration {
    @Bean(name="student")
    public StudentInfo info() {
        return new StudentInfo("girraj","gupta");
    }
    @Bean(name="student1")
    public StudentInfo info1() {
        return new StudentInfo("girraj1","gupta1");
    }
}

3 个答案:

答案 0 :(得分:2)

来自Spring Docs

  

当一个bean是单例时,将仅管理该bean的一个共享实例,并且所有具有与该bean定义匹配的id或id的bean请求都将导致该特定的bean实例由Spring容器返回。

在您的示例中,您正在创建同一类的两个不同的bean。由于作用域是特定于bean的,因此它与类本身无关。

答案 1 :(得分:0)

依赖注入是一个分为两个步骤的过程,包括:

  • 定义一个豆子。
  • 注入豆子。

当您声明带有@Bean批注的bean定义时,您将声明一个配方,用于创建该bean定义所定义的类的实际实例。这意味着您可以从一个配方中创建许多对象实例。

当JavaConfig遇到这样的方法时,它将执行该方法并将返回值注册为Spring IoC容器中的bean。

在您的示例中,您声明了两个bean定义。因此,两者都在Spring IoC容器中注册为单独的bean。对于单例bean,Spring将拦截对其的任何调用,并确保返回该方法产生的bean,而不是允许其再次调用。

请参考Bean ScopesBasic bean configuration

答案 2 :(得分:0)

  

如果StudentInfo类是原型...

StudentInfo是否为原型并不重要。您实际上正在做的是使用StudentInfo运算符实例化new,例如:

return new StudentInfo("girraj1","gupta1");

实际的bean定义是您已经创建的工厂方法,并且您有两个,所以两个bean。

所以-以及以其他方式-当您注入实际上是StudentInfo实例的bean时,您不会注入StudentInfo而是一个名为 student student1 ,例如:

@Qualifier("student1")
@Autowired
private StudentInfo studentInfo;

学生1,学生他们可能都是单身人士。