一、常用Bean初始化相关操作
一般情况下执行顺序为:构造方法 -> Setter方法 -> @Value注解 -> @Autowired注解 -> InitializingBean接口实现 -> @PostConstruct注解 -> BeanPostProcessor接口 -> ApplicationContextAware接口 -> ApplicationRunner接口实现 -> BeanFactoryAware接口实现
1.bean构造
首先执行构造方法Constructor,如果有定义setter方法,且使用了@Autowired注解注入,则会调用对应setter方法(setter方法的执行顺序与bean定义的顺序无关)
2.@Value注解
如果属性上使用了@Value注解,该注解可直接对属性赋值,@Value的值从配置文件中获取
3.@Autowired注解
Spring通过@Autowired注解,自动将依赖注入到bean中。执行顺序与bean定义的顺序无关
4.InitializingBean接口实现
所有的依赖注入完成后,Spring会调用其afterPropertiesSet()方法,用于初始化bean之后进行特定的逻辑处理,执行其整体配置和最终初始化验证
5.BeanPostProcessor接口的postProcessBeforeInitialization方法
如果存在注册的BeanPostProcessor,Spring会调用postProcessBeforeIntialization(bean,beanName)方法,该方法用于对bean进行自定义的前初始化操作
6.@PostConstruct注解
当所有依赖注入和InitializingBean接口的初始化方法完成后,如果bean中存在带有@PostConstruct注解的方法,则该方法会在bean初始化之后立即执行,且不需要实现Spring特定的接口。该注解执行顺序与bean的定义顺序无关
7.BeanPostProcessor接口的postProcessAfterInitialization方法
在Bean的初始化之后被调用,可以对bean进行一些自定义的后初始化操作
8.ApplicationContextAware接口
Spring容器会在bean创建完成后,将ApplicationContext注入到bean中,以便进行进一步操作,需要使用到ApplicationContext时使用
9.ApplicationRunner接口
如果bean实现了ApplicationRunner接口,springboot会在应用程序启动完成后调用其run方法,用于执行自定义初始化逻辑,数据加载等操作
10.BeanFactoryAware接口
如果bean实现了BeanFactoryAware接口,Spring容器会在bean创建完成后,将BeanFactory注入到bean中,以便访问和操作BeanFactory
1、自定义初始化操作使用:
@PostConstruct注解和InitializingBean接口都是在依赖注入完成后,方便用于自定义bean初始化后处理的方式,更推荐使用@PostConstruct注解,不需要实现额外spring接口
2、bean初始化后,对bean自定义后操作:
一般使用BeanPostProcessor接口的postProcessAfterInitialization(bean,beanName)方法,可以对指定bean进行特定逻辑处理,返回并覆盖原有bean
二、可能影响上述生命周期回调方法执行顺序的一些配置
1.@DependsOn注解
使用该注解指定bean之间的依赖关系,以确保正确的初始化顺序
2.@Order注解
通过@Order注解可以为bean设置一个优先级,当多个bean需要按照特定顺序进行初始化时,可以使用@Order注解来指定他们执行顺序
3.BeanPostProcessor接口的实现类顺序
如果有多个BeanPostProcessor接口实现类,它们的执行顺序可能会影响到bean的初始化过程。可以使用@Order注解或该类再实现Ordered接口来指定BeanPostProcessor的执行顺序
4.条件注解
Spring提供了多种条件注解,如@Conditional、@ConditionOnBean、@ConditionOnProperty等。可以根据特定的条件来控制bean的创建和初始化,从而影响整个执行顺序
5.自定义的ApplicationContextInitializer和ApplicationListernr
可以实现这两个接口来监听应用程序上下文的初始化和刷新时间,并在需要时进行相关的操作,这些自定义的初始化器和监听器的执行顺序可能会影响到其他生命周期回调方法的执行顺序