在使用 @Component 期间创建了多少个 @Autowired "prototype" bean 实例
How many instance(s) of @Autowired "prototype" bean is(are) created during the usage of a @Component
我有一个 Manager
class 注释 @Component
和 @Scope
@Component
@Scope(value = "prototype")
public class Manager {
...
}
所以我希望每次请求 bean 时都会创建一个 Manager
bean 的新实例。
然后我有一个 Adapter
class 使用这个 Manager
bean。要使用它,我有两种 Autowire 方法:1. 在 属性 上或 2. 在构造函数上:
@Component
public class Adapter {
@Autowired
Manager m_Manager;
...
}
或
@Component
public class Adapter {
Manager m_manager;
@Autowired
public Adapter(Manager manager) {
m_manager = manager;
}
...
}
由于 Adaptor
class 是单例 bean,所以 @Autowire
Manager
在 属性 或构造函数上都只会创建一个Manager
的实例?意思是 Manager
bean 实际上被用作单例 bean 而不是原型 bean,对吧?
如果您没有任何其他注入点,在其中注入一个管理器实例,那么您在应用程序上下文中将只有一个实例,这是正确的。
@Autowire 的行为方式与 ApplicationContext.getBean
相同
它为每个自动装配的实例创建一个原型 bean。可以看到两个单例中的原型对象有不同的标识符
所以每个单例都有自己的原型实例。如果您在构造函数或字段中使用 @Autowire 执行此操作,则没有任何区别。
在构造函数上执行自动装配只是避免注解重复的更方便的方法。
P.S。定义范围最好使用
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
我有一个 Manager
class 注释 @Component
和 @Scope
@Component
@Scope(value = "prototype")
public class Manager {
...
}
所以我希望每次请求 bean 时都会创建一个 Manager
bean 的新实例。
然后我有一个 Adapter
class 使用这个 Manager
bean。要使用它,我有两种 Autowire 方法:1. 在 属性 上或 2. 在构造函数上:
@Component
public class Adapter {
@Autowired
Manager m_Manager;
...
}
或
@Component
public class Adapter {
Manager m_manager;
@Autowired
public Adapter(Manager manager) {
m_manager = manager;
}
...
}
由于 Adaptor
class 是单例 bean,所以 @Autowire
Manager
在 属性 或构造函数上都只会创建一个Manager
的实例?意思是 Manager
bean 实际上被用作单例 bean 而不是原型 bean,对吧?
如果您没有任何其他注入点,在其中注入一个管理器实例,那么您在应用程序上下文中将只有一个实例,这是正确的。
@Autowire 的行为方式与 ApplicationContext.getBean
相同它为每个自动装配的实例创建一个原型 bean。可以看到两个单例中的原型对象有不同的标识符
所以每个单例都有自己的原型实例。如果您在构造函数或字段中使用 @Autowire 执行此操作,则没有任何区别。 在构造函数上执行自动装配只是避免注解重复的更方便的方法。
P.S。定义范围最好使用
@Scope(BeanDefinition.SCOPE_PROTOTYPE)