spring - 在 Spring 将单例注入(inject)原型(prototype)

标签 spring dependency-injection inversion-of-control

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

我已经尝试过在单例中注入(inject)原型(prototype)并使用查找方法解决问题的其他方法。

最佳答案

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

没有 BeanFactory

如果从 Spring-Context 的开始到结束,Singleton 和 Prototype 的具体实现是已知的,那么至少在调用 Context 的 start-method 时它们是加载的。 java中类的默认类初始化是由使用的ClassLoader完成的。

这意味着,在 bean 可 Autowiring 之前,

  • 实现接口(interface)和扩展类被初始化。
  • 调用静态类范围,
  • 静态字段被初始化和设置。

  • 之后,上下文开始使用 start -方法。
  • 调用单例的默认构造函数。
  • {} 范围被调用。
  • 所有@Autowired 字段均已设置。
  • 如果 Singleton 扩展了 SmartSingletonInitializer,则调用其继承的方法。
  • 调用@PostConstruct 方法。

  • 然后,如果需要原型(prototype) Bean(通过 context.getBean 或直接 @Autowired ,原型(prototype)的.
  • 调用单例的默认构造函数。
  • {} 范围被调用。
  • 所有@Autowired 字段均已设置。
  • 如果 Prototype 扩展了 SmartSingletonInitializer,则调用其继承的方法。
  • 调用@PostConstruct 方法。
  • 原型(prototype)实例被注入(inject)。

  • 使用 BeanFactory

    它的行为可能不同,因为 Prototype bean 可以返回尚未从相应类加载器加载的 Bean 实例。如果是这样,则按以下顺序及时加载原型(prototype) bean:
  • 实现接口(interface)和扩展类被初始化。
  • 调用静态类范围,
  • 静态字段被初始化和设置。
  • 调用单例的默认构造函数。
  • {} 范围被调用。
  • 所有@Autowired 字段均已设置。
  • 如果 Prototype 扩展了 SmartSingletonInitializer,则调用其继承的方法。
  • 调用@PostConstruct 方法。
  • 原型(prototype)实例被注入(inject)。
  • 关于spring - 在 Spring 将单例注入(inject)原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51783796/

    相关文章:

    java - 如何在jpa的@ManyToOne JoinColumn上执行 "in"查询而不查询实体

    java - 创建用户对象后无法正确获取它

    java - 了解 dagger2 的用法

    java - 仅 Autowiring 构造函数的某些参数

    c# - 我如何告诉 MEF 该接口(interface)需要哪种类型?

    java - 如何使resttemplate仅返回与发送的id有关系的类

    Java Spring : get current mapping in the controller

    java - 我们如何在 spring 中使用依赖注入(inject)动态加载特定类?

    c# - 重新设置单例httpclient的证书(Reconfiguring IHttpclientFactory?)

    asp.net-mvc - 有没有更好的方法在asp.net-mvc中进行IOC?