2019-02-20 16:28:09 3

Spring Bean生命周期

前言

    Spring现在可以说是主流必备WEB开发框架了,这个也得益于其完整且快速迭代的生态圈。不过现在很多人说起Spring都只知道SpringBoot、SpringCloud等,其实这些都是Spring生态圈里目前比较火的一些技术技术体系。Spring是一个独立的开发框架,对于能熟练运用Spring的开发人员更有利于学习其他的生态技术。Spring框架包含了很多的知识点,包括Bean管理、IOC依赖注入、AOP切面等。这些知识点中都是以Bean的管理为基础,假如一个Bean没有托管在Spring容器中,其他的都免谈。


Bean生命周期

    Bean生命周期指的是Bean对象重创建到销毁的整个生命过程,而Spring中的Bean都是通过Spring容器内部管理的,所以对于Spring的Bean来说生命周期的运行过程包含了一些Spring相关的操作

    Spring中的Bean有两种方式标识,配置文件配置和注解配置。在Spring容器初始化完成之后(本文之间Bean生命周期,容器初始化自行百度)会对已标识的Bean进行初始化操作,具体流程如下:

    创建BeanDefinition:

    源码中父BeanDefinition是RootBeanDefinition,其中有两个子类,分别是ConfigurationClassBeanDefinition和ClassDerivedBeanDefinition,一个是通过配置文件定义Bean另一个是通过注解获取Bean定义。这里也可以自己手动创建根定义:

RootBeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClass(beanClass);
beanDefinition.setAutowireCandidate(true);
beanDefinition.setAutowireMode(RootBeanDefinition.AUTOWIRE_NO);
//定义需要注入的参数,可以是其他Bean对象或者基本数据类型
MutablePropertyValues values = new MutablePropertyValues();
values.add(name, value);
beanDefinition.setPropertyValues(values);
beanDefinition.setScope(SingleTon);
//通过实现BeanFactoryAware可以得到容器BeanFactory工厂对象
beanFactory.registerBeanDefinition(beanName, beanDefinition);

    BeanDefinition定义好Bean之后,Spring就会按照以下流程依次执行

    1. 通过定义的类路径反射new一个Bean对象

   2. 按照Spring上下文对实例化的Bean进行配置,也就是IOC注入
   3. 如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID
   4. 如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(),传递的是Spring工厂本身(可以用这个方法获取到其他Bean)
   5. 如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文,该方式同样可以实现步骤4,但比4更好,以为ApplicationContext是BeanFactory的子接口,有更多的实现方法
   6. 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用After方法,也可用于内存或缓存技术
   7. 如果这个Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法
   8. 如果这个Bean关联了BeanPostProcessor接口,将会调用postAfterInitialization(Object obj, String s)方法
注意:以上工作完成以后就可以用这个Bean了,那这个Bean是一个single的,所以一般情况下我们调用同一个ID的Bean会是在内容地址相同的实例
   9. 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean接口,会调用其实现的destroy方法
   10. 最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法




← Previous Next →

0 Responses to "Spring Bean生命周期"

  1. Reply

    Teknik Informatika

    2024-03-02 03:47:33

    Spring框架的生态系统对于Java开发者的吸引力在哪里?有哪些常用的Spring项目或模块?Regards <a href="https://telkomuniversity.ac.id/en/">Telkom University</a>

    回复

Leave a Reply

你没有登陆,必须填写name才能提交评论*

*

*

Copyright Obscura 2017. Design by zqliang. All Rights Reserved.Collect from 小梁
粤ICP备18034967号