总的来说是四个阶段:实例化、依赖注入、初始化、销毁
-
实例化:解析xml配置或注解,获得BeanDefintion(Bean的定义),推断构造方法实例化一个对象
-
依赖注入:实例化后的对象会被放到BeanWrapper中,然后Spring会根据BeanDefinition中的信息和BeanWrapper提供的属性注入的接口完成依赖注入
-
初始化:这个过程又可以细分几个流程
- 对于实现Aware接口的Bean,执行这个接口里的方法
- Bean对象初始化之前,如果这个Bean实现了BeanPostProcessor接口,就执行这个接口中的前置处理方法,叫做postProcessBeforeInitialization
- 真正初始化过程,执行@PostConstruct注解方法,InitializationBean接口方法,xml文件中定义的init-method方法
- Bean对象初始化之后,如果这个Bean实现了BeanPostProcessor接口,就执行这个接口中的后置处理方法,叫做postProcessAfterInitialization
-
销毁:执行@PreDestroy注解方法,执行DisposableBean接口方法,执行xml中定义的destroy-method方法
扩展
我在自己的线上项目中,用到了生命周期的一些知识,就是那个@PostConstract和InitializationBean接口。
我们当时有这样的一个策略模式,根据用户修改的类型枚举值,获取修改用户信息对应的处理类。我们把这个映射关系放入map,就可以根据枚举值获取对应类。
所以,如何放入Map中,就是一个问题。解决方案是,使用@PostConstract和InitializationBean接口,在这个策略初始化完成后,自动将其自身放入map中。