在这里,如果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");
}
}
答案 0 :(得分:2)
当一个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,而不是允许其再次调用。
答案 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,学生他们可能都是单身人士。