spring生命周期方法,springboot接口的开发流程
目录
一背景二跳羚生命周期接口三后记
一 背景
最近在做一个项目启动时加载配置到跳羚容器中的功能,看到了弹簧中有很多在容器初始化时的接口,这些接口或注解包括InitializingBean 、@PostConstruct、SmartInitializingSingleton、BeanPostProcess等等,这么多都可以在初始化时使用,但是他们有什么区别呢,下面就来说说他们之间的区别
二 SpringBoot 生命周期接口
@施工后
这个注解在实际的开发中有较多的用到
@ component公共类TestP { @ post construct public void test(){ system。出去。println( @ post构造);}这样在容器启动过程中就回执行打印,看起来他像是对象的构造方法,其实他的作用是,当一个对象英语字母表中第一个字母中存在@Autowire修饰的依赖仓库时,正常来说,对象会先执行自己的构造方法,然后再去注入依赖,但是我们现在有一种情况,在对象实例化时,要执行构造方法,但是构造方法中用到依赖b,这个时候用@PostConstruct就能解决这个问题。
公共类TestP实现InitializingBean,SmartInitializingSingleton { @ auto wired Context Context;` ` public TestP(){ system。出去。println(上下文);} ` ` `` @ post construct public void test(){ system。出去。println(上下文);系统。出去。println( @ post构造);}输出
nullcom。举例。演示1。比恩。上下文@ 4f 96 a58 @ post构造
回调接口
他提供豆初始化的回调处理功能,看下这个接口的源码
受保护的void invokeInitMethods(字符串bean名称,最终对象bean,RootBeanDefinition mbd)抛出throwable { boolean isinitializigBean=(初始化bean的bean实例);//判断该豆是否实现了实现了回调接口接口,如果实现了回调接口接口,则只掉调用豆的afterPropertiesSet方法if(是initializingbean(mbd==null !mbd。isexternallymanagedinmethod( afterPropertiesSet ){ if(logger。isdebugenabled()){ logger。调试(在名为 beanName 的豆上调用afterPropertiesSet());} if (System.getSecurityManager()!=null){尝试{访问控制器。doprivileged(new privilegedexceptionobject(){ public Object run()抛出异常{ //直接调用afterPropertiesSet((InitializingBean)bean).afterPropertiesSet();返回null} },getAccessControlContext());} catch(PrivilegedActionException PAE){ throw PAE。get异常();
} } else { //直接调用afterPropertiesSet ((InitializingBean) bean).afterPropertiesSet(); } } if (mbd != null) { String initMethodName = mbd.getInitMethodName(); //判断是否指定了init-method方法,如果指定了init-method方法,则再调用制定的init-method if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) && !mbd.isExternallyManagedInitMethod(initMethodName)) { //进一步查看该方法的源码,可以发现init-method方法中指定的方法是通过反射实现 invokeCustomInitMethod(beanName, bean, mbd); } }可以看到,只要实现了这个接口的bean都会执行里面的afterPropertiesSet
方法,那他和 @PostConstruct
有什么区别呢,区别是他们的生命周期排序不同,@PostConstruct
是对单个Bean实例化时使用,而InitializingBean
是在所有spring bean实例化后对bean进行处理,⼤致的步骤是这样的
实例化bean,这⾥会调⽤构造⽅法
填充属性,就是依赖注⼊
初始化bean,
调⽤后置处理器,其中会执⾏@PostConstruct注解⽅法执⾏bean的⽣命周期中的初始化回调⽅法,也就是InitializingBean接⼝的afterPropertiesSet()⽅法BeanPostProcess
这个接口主要是对注册的bean中的属性进行初始化时的修改
@Componentpublic class BeanPostTest implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("执行1--------------- - " + bean.getClass().getName() + " - " + beanName); return null; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("执行2--------------- - " + bean.getClass().getName() + " - " + beanName); return null; }}
他和InitializingBean
区别一个是执行顺序不同
他有两个方法分别在在InitializingBean
执行前执行后执行,第二个区别就是InitializingBean
是一个可以进一步调整bean的实例的接口,不过并不是每个类都会来执行这个接口方法,这个接口只针对当前实现类,而BeanPostProcess是针对所有bean的,每一个bean被注册,都会被执行一次这两个方法
SmartInitializingSingleton
这个是在spring 4.1版本才推出的接口,他的执行时时机是在单例预实例化阶段结束时调用,并保证已经创建了所有常规单例bean,所以他的执行顺序是比较靠后的,考虑到一些bean的注册及修改使用SmartInitializingSingleton
是比较稳妥的一种方式
``` @Component public class GetuiAccountConfigInit implements SmartInitializingSingleton { @Override public void afterSingletonsInstantiated() { } } ```
Commandlinerunner 这个接口是springBoot的接口,他是在所有bean都加载后才会执行的,如果实现这个接口,可以很好的在启动时初始化资源,因为所有的bean都可以使用了
@Component public class Runner implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("执行初始化"); } }
如果我们要执行的程序有顺序要求,还可以使用@Order注解
@Component @Order(1) public class OrderRunner1 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("The OrderRunner1 start to initialize ..."); } } @Component @Order(2) public class OrderRunner1 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("The OrderRunner2 start to initialize ..."); } }
三 后记
Spring由于设计上比较灵活所以留了很多接口,让开发人员进行拓展,这本身是一个很好的学习借鉴的经验,现在大部分的开发使用的都是spring的框架,这就要求我们做一些设计时要了解框架的特性,才能进行更好的设计,上面的几个接口是相对来说比较常用的接口,里面的技术细节也值得推敲,希望对大家有所帮助。
到此这篇关于详细SpringBoot生命周期接口的使用的文章就介绍到这了,更多相关SpringBoot生命周期接口内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。