如果使用@Bean标记创建bean,那么我们可以创建两个bean。它是如何按照applicationContext单例化的

问题描述 投票:0回答:3

这里,如果StudentInfo类是原型,那么它将创建两个单独的引用,这是Ok但是在单例的情况下它也创建两个bean命名student和student1然后它打破了每个应用程序上下文的单例规则。如果我遗失了什么,请告诉我。在这种情况下,我们如何为每个应用程序上下文创建一个单独的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");
    }
}
java spring singleton
3个回答
2
投票

来自Spring Docs

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

在您的示例中,您将创建同一类的两个不同的bean。由于范围特定于bean,因此它与类本身无关。


0
投票

依赖注入包括两个步骤:

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

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

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

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

请参考Bean ScopesBasic bean configuration


0
投票

这里如果StudentInfo类是原型...

如果StudentInfo是原型并不重要。你实际做的是用StudentInfo算子实例化new,如:

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

实际的bean定义是你所做的工厂方法,你有两个这样的两个bean。

所以 - 换句话说 - 当你注入一个实际上是StudentInfo实例的bean时,你不会注入StudentInfo而是注入一个名为student或student1的bean,如:

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

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

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