深入Spring专题(29)

142 阅读2分钟

这是我参与2022首次更文挑战的第36天,活动详情查看2022首次更文挑战

解析顺序

所有初始化机制都可以在同一个bean实例上使用,在这种情况下,Spring首先调用使用了@PostConstruct注解的方法,然后调用afterPropertiesSet(),最后调用配置文件中指定的初始化方法。

在创建bean过程中主要完成以下步骤:

  1. 首先调用构造函数来创建bean。
  2. 注入依赖项(调用setter)。
  3. 现在bean已存在并且提供了依赖项,预初始化的BeanPostProcessor基础结构bean将被查询,以查看它们是否想从创建的bean中调用其他依赖项,这些都是特定于Spring的基础架构bean,它们在创建后执行bean修改操作。@PostConstruct注解由CommonAnnotationBeanPostProcessor注册,所以该bean将调用使用了@PostConstruct注解的方法。该方法在bean被构建之后,在类被投入使用之前且在bean的实际初始化之前(在afterPropertiesSet()和init-method之前)执行。
  4. InitializingBean的afterPropertiesSet()方法在注入依赖项后立即执行,如果BeanFactory设置了提供的所有Bean属性并且满足BeanFactoryAware和ApplicationContextAware,将会调用afterPropertiesSet()方法。
  5. 最后执行init-method属性,这是因为它是bean的实际初始化方法。

挂钩到bean的销毁

​ 当使用封装了DefaultListableBeanFactory接口的ApplicationContext实现(通过getDefaultListableBeanFactory()方法获取GenericXmlApplicationContext)时,可通过调用ConfigurableBeanFactory.destroySingletons()向BeanFactory发出信号,告知销毁所有单例实例。通常,在应用关闭时执行此操作,并允许清理bean可能保持打开的任何资源,从而使应用可正常关闭。在回调中还可以将存储在内存中的任何数据刷新到持久存储库中,并允许bean关闭可能已启动的长时间运行的任何进程。

​ 为了让bean接收到destroySingletons被调用的通知,存在三种选择,这些选择类似用来接收初始化回调机制。 销毁回调与初始化回调一起使用,在初始化回调中创建并配置资源,然后在销毁回调中释放资源。