这里,如果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");
}
}
当bean是单例时,将只管理bean的一个共享实例,并且对具有与该bean定义匹配的id或id的bean的所有请求将导致Spring容器返回一个特定的bean实例。
在您的示例中,您将创建同一类的两个不同的bean。由于范围特定于bean,因此它与类本身无关。
依赖注入包括两个步骤:
使用@Bean批注声明bean定义时,将声明一个用于创建该bean定义所定义的类的实际实例的配方。这意味着您可以从单个配方创建许多对象实例。
当JavaConfig遇到这样的方法时,它将执行该方法并将返回值注册为Spring IoC容器中的bean。
在您的示例中,您声明了两个bean定义。因此,两者都在Spring IoC容器中注册为单独的bean。对于singleton bean,Spring将拦截对它的任何调用,并确保返回该方法生成的bean,而不是允许再次调用它。
这里如果StudentInfo类是原型...
如果StudentInfo
是原型并不重要。你实际做的是用StudentInfo
算子实例化new
,如:
return new StudentInfo("girraj1","gupta1");
实际的bean定义是你所做的工厂方法,你有两个这样的两个bean。
所以 - 换句话说 - 当你注入一个实际上是StudentInfo
实例的bean时,你不会注入StudentInfo
而是注入一个名为student或student1的bean,如:
@Qualifier("student1")
@Autowired
private StudentInfo studentInfo;
而学生1,学生他们可能都是单身人士。