内容简介:今天主要分享一下Springboot中Bean的生命周期的过程,如有不足,欢迎指正交流。Bean生命周期一般有下面的四个阶段:
springboot中Bean的生命周期
今天主要分享一下Springboot中Bean的生命周期的过程,如有不足,欢迎指正交流。
Bean生命周期的过程
Bean生命周期一般有下面的四个阶段:
-
Bean的定义
-
Bean的初始化
-
Bean的生存期
-
Bean的销毁
Bean的定义过程:
-
第一步,资源定位,就是Spring根据我们定义的注解(@Component),找到相应的类。
-
找到了资源就开始解析,并将定义的信息保存起来,此时,并没有初始化bean,这点需要注意。
-
然后将bean的定义发布到SpringIoc的容器中,此时,SpringIoc的容器中还是没有Bean的生成。只是定义的信息。
Bean的初始化
经过Bean的定义,初始化,SPring会继续完成Bean的实例和化和依赖注入,这样从IoC容器中就可以得到一个依赖注入完成的Bean。下图是初始化图的示例:
Bean的生命周期
通过代码测试Bean的生命周期
加入生命周期的接口
BeanNameAware,BeanFactoryAware,ApplicationContextAware,INitiali zingBean,DisposableBean这几个接口, 并实现里面的方法
代码实现
环境: jdk 1.8 springboot2.2 idea
-
定义接口Person类和Furit类
package chen.beanprocessor.model; public interface Person { void service(); // 设置水果类型 void eatFruit(Fruit fruit); } /** * @Author Chen * @Date 2020/4/18 17:04 **/ public interface Fruit { void use(); }
-
定义Person和Fruit的实现类Children和Apple,并将Apple类注入到Children中,在Children中加入生命那个周期的接口:
/** * @Author Chen * @Date 2020/4/18 17:07 * 水果实现类Apple **/ @Component public class Apple implements Fruit { @Override public void use() { System.out.println(this.getClass().getSimpleName()+"这个苹果很甜"); } } @Component public class Children implements Person, BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean { Fruit fruit = null; // 注入水果类 public Children(@Autowired Fruit fruit){ this.fruit = fruit; } @Override public void service() { fruit.use(); } @Override public void eatFruit(Fruit fruit) { this.fruit = fruit; } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { System.out.println("this"+this.getClass().getSimpleName()+"调用BeanFactory的setBeanFactory方法"); } @Override public void setBeanName(String name) { System.out.println("this"+this.getClass().getSimpleName()+"调用setBeanName的方法"); } @Override public void destroy() throws Exception { System.out.println("this"+this.getClass().getSimpleName()+"调用DisposableBean的方法"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("this"+this.getClass().getSimpleName()+"调用Initializing的afterPropertiesSet()的方法"); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("this"+this.getClass().getSimpleName()+"调用Application的setApplicationContext的方法"); } @PostConstruct public void init(){ System.out.println(this.getClass().getSimpleName()+"注解@PostConstruct的自定义的初始化方法"); } @PreDestroy public void destory1(){ System.out.println(this.getClass().getSimpleName()+"调用@dPrDestory的自定义销毁的方法"); } }
3.定义测试类
@SpringBootApplication public class BeanprocessorApplication { public static void main(String[] args) { SpringApplication.run(BeanprocessorApplication.class, args); AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class); Person person = applicationContext.getBean(Children.class); System.out.println("===========初始化完成=========="); person.service(); applicationContext.close(); } }
测试结果
thisChildren调用setBeanName的方法 thisChildren调用BeanFactory的setBeanFactory方法 thisChildren调用Application的setApplicationContext的方法 Children注解@PostConstruct的自定义的初始化方法 thisChildren调用Initializing的afterPropertiesSet()的方法 2020-04-18 17:28:38.902 INFO 9784 --- [ main] c.b.BeanprocessorApplication : Started BeanprocessorApplication in 0.682 seconds (JVM running for 1.29) thisChildren调用setBeanName的方法 thisChildren调用BeanFactory的setBeanFactory方法 thisChildren调用Application的setApplicationContext的方法 Children注解@PostConstruct的自定义的初始化方法 thisChildren调用Initializing的afterPropertiesSet()的方法 ===========初始化完成========== Apple这个苹果很甜 Children调用@dPrDestory的自定义销毁的方法 thisChildren调用DisposableBean的方法 Children调用@dPrDestory的自定义销毁的方法 thisChildren调用DisposableBean的方法
测试结果可以清晰的看到bean的生命周期的过程。从测试结果来看,Bean被初始化了两次,这是因为在初始化Children这个类时,还初始化了注入的Apple这个类。
码字不易,点个赞呗
码字不易,点个赞呗
码字不易,点个赞呗
追本溯源,方能阔步前行
参考资料:
《深入浅出SpringBoot》 杨开振
以上所述就是小编给大家介绍的《springBoot中Bean的生命周期》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Flash ActionScript 3.0 动画高级教程
Keith Peters / 苏金国、荆涛 / 人民邮电出版社 / 2010-1 / 65.00元
《Flash ActionScript 3.0 动画高级教程》是介绍Flash 10 ActionScript动画高级技术的经典之作,是作者在这一领域中多年实践经验的结晶。书中不仅涵盖了3D、最新绘图API以及Pixel Bender等Flash 10 ActionScript特性,深入介绍了碰撞检测、转向、寻路等Flash游戏开发技术,还通过实例具体讲解了等角投影和数值积分的基本理论和应用。 ......一起来看看 《Flash ActionScript 3.0 动画高级教程》 这本书的介绍吧!