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属性,会自动调用其配置的销毁方法
0 Responses to "Spring Bean生命周期"