在春季将单例注入原型

Avi*_*thy 5 spring dependency-injection inversion-of-control

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

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

Pet*_*der 2

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

没有 BeanFactory

如果从 Spring-Context 的开始到结束,单例和原型的具体实现是已知的,那么至少在调用 Context 的启动方法时它们会被加载。java 中类的默认类初始化是由使用的 ClassLoader 完成的。

这意味着,在 beans 可自动装配之前,

  1. 实现接口和扩展类被初始化。
  2. 静态类范围被称为,
  3. 静态字段被初始化和设置。

之后,Context 开始使用start- 方法。

  1. 调用单例的默认构造函数。
  2. 调用 {} 作用域。
  3. 所有@Autowired 字段均已设置。
  4. 如果 Singleton 扩展了 SmartSingletonInitializer,则调用其继承的方法。
  5. 调用 @PostConstruct 方法。

然后,如果需要原型 Bean(无论是通过context.getBean还是通过直接@Autowired),Prototype 的.

  1. 调用单例的默认构造函数。
  2. 调用 {} 作用域。
  3. 所有@Autowired 字段均已设置。
  4. 如果 Prototype 扩展了 SmartSingletonInitializer,则调用其继承的方法。
  5. 调用 @PostConstruct 方法。
  6. 原型实例被注入。

使用 BeanFactory

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

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