在春季将单例注入原型

时间:2018-08-10 09:52:35

标签: spring dependency-injection inversion-of-control

将单例注入原型bean的类加载的行为是什么?

我已经尝试过以其他方式将原型注入单例并使用查找方法解决问题。

1 个答案:

答案 0 :(得分:0)

这取决于是否使用BeanFactory。 BeanFactory可以延迟加载类。

没有BeanFactory

如果从Spring上下文的开始到结束都知道Singleton和Prototype的具体实现,则至少在调用Context的开始方法时才加载它们。 java中Class的默认class初始化是由使用的ClassLoader完成的。

这意味着,在Bean可以自动处理之前,

  1. 实现接口和扩展类被初始化。
  2. 静态类作用域称为
  3. 初始化并设置静态字段。

然后,上下文开始使用start方法。

  1. 称为Singleton的默认构造函数。
  2. 称为{}范围。
  3. 所有@Autowired字段都已设置。
  4. 如果Singleton扩展了SmartSingletonInitializer,则会调用其继承的方法。
  5. 调用@PostConstruct方法。

然后,如果需要原型Bean(通过context.getBean或通过直接@Autowired,则是原型Bean。

  1. 称为Singleton的默认构造函数。
  2. 称为{}范围。
  3. 所有@Autowired字段都已设置。
  4. 如果原型扩展了SmartSingletonInitializer,则会调用其继承的方法。
  5. 调用@PostConstruct方法。
  6. 已插入原型实例。

使用BeanFactory

它的行为可能有所不同,因为Prototype Bean可以返回尚未从相应的类加载器加载的Bean实例。如果是这样,则会按此顺序按时加载原型bean:

  1. 实现接口和扩展类被初始化。
  2. 静态类作用域称为
  3. 初始化并设置静态字段。
  4. 称为Singleton的默认构造函数。
  5. 称为{}范围。
  6. 所有@Autowired字段都已设置。
  7. 如果原型扩展了SmartSingletonInitializer,则会调用其继承的方法。
  8. 调用@PostConstruct方法。
  9. 已插入原型实例。