源码位置:
bean的创建时在 finishBeanFactoryInitialization(beanFactory); 方法。该方法中也有bean的生命周期的回调方法。 SpringBoot2x基础篇—Bean的生命周期方法(与容器耦合)
而实现了Lifecycle接口的bean,将会在 finishRefresh(); 方法中执行生命周期方法。(此时所有的bean均初始化完毕即Spring初始化完成,与Spring容器的创建解耦)。
常规的LifeCycle接口只是在容器上下文显式的调用start()/stop()方法时,才会去回调LifeCycle的实现类的start stop方法逻辑。并不意味着在上下文刷新时自动启动。
ApplicationContext本身接收启动和停止信号(例如在运行时停止/重启场景)时,spring容器将在容器上下文中找出所有实现了LifeCycle及其子类接口的类,并一一调用它们实现的类。spring是通过委托给生命周期处理器LifecycleProcessor来实现这一点的。
那么,如果Spring容器上下文没有显式的调用start和destory(或者close,stop)等方法时,我们也需要做到生命周期回调,怎么做
如果该 Lifecycle 类所在的上下文在调用 refresh 时,希望能够自己自动进行回调,则返回 true ,false的值表明组件打算通过显式的start()调用来启动,类似于普通的Lifecycle实现。
玩转Spring生命周期之Lifecycle
然后就可以引用了
上面可以发现,这种方式其实可以对初始化的Bean做一些其他预初始化 *** 作,简化 *** 作。
例如 redis默认的RedisTemplate 的key是查看不友好的,可以采用转码的方式来把key和value的值变为可读的形式
1场景描述
业务系统中,配置文件不同,使用的业务逻辑也不同。我们可以使用模板方法模式把业务分成多个service。如下图
2ConditionalOnProperty源码说明
3如何使用
AbstractServiceImpl1-- 默认使用的方法
UserServiceImpl1--
UserServiceImpl2--
使用时,直接注入service,会根据配置文件来选择哪个service生效
4上面是针对一个配置项,如果有多个配置项,可以使用@ConditionalOnExpression,来根据表达式来选择使用哪个service
ConditionalOnExpression 源码说明
使用起来也比较方便
@ConditionalOnExpression("!${sencecascadeenable:false} && ${sencecascadetest:0} == 2")
以上就是关于SpringBoot2.x基础篇—Bean的生命周期方法(实现Lifecycle接口)全部的内容,包括:SpringBoot2.x基础篇—Bean的生命周期方法(实现Lifecycle接口)、springboot 装配bean的方式、springboot 根据配置文件的不同,选择注入不同的bean等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)