IOC中Bean的生命周期

前言

Spring:

Spring是一个轻量级开发框架,其核心思想是Ioc(控制反转)以及AOP(面向切面编程),为java应用开发提供组件管理服务,用于组件之间的解耦,以及简化第三方Javaee中间件技术的使用,是是一个基础架构型的开发框架

Spring中的Bean:

简单来说,Bean指的是被IOC容器所管理的对象,我们通过配置文件或着注解,来告诉IOC容器帮助我们管理那些对象

Bean的生命周期

主要阶段:

        生产 -->   使用 -->  销毁

Bean的实例化过程(产生):

       在Spring程序启动时(即调用ClassPathXmlApplicationContext时),开始执行的过程。

 基本流程:

        用BeanDefinition方法(loadBeanDefinition 加载Bean定义),通过xml,注解扫描等各种方式,将定义在程序中的bean全部找到(将找到的结果封装成一个BeanDefinition对象),然后放在一个名为beanDefiniation的Map的集合中去,Spring框架通过遍历该集合,使用creatBean方法创造Bean对象{大体分为:构造对象,填充属性,初始实例化,注册销毁四个步骤}。创建好的Bean对象存储在一个名为singleObjects的Map集合中去,当调用getBean方法时,则最终从Map集合中取出Bean实例对象返回。

{

Spring Bean的生命周期是从 Bean 实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存 储到单例池中,这个过程被称为Spring Bean的生命周期。Spring Bean的生命周期大体上分为三个阶段
Bean的实例化阶段:Spring框架会取出BeanDefinition的信息进行判断当前Bean的范围是否是
singleton的, 是否不是延迟加载的,是否不是FactoryBean等,最终将一个普通的singleton的
Bean通过反射进行实例化;
Bean的初始化阶段:Bean创建之后还仅仅是个"半成品",还需要对Bean实例的属性进行填充、执
行一些Aware 接口方法、执行BeanPostProcessor方法、执行InitializingBean接口的初始化方
法、执行自定义初始化init方法等。该阶段是Spring最具技术含量和复杂度的阶段;
Bean的完成阶段:经过初始化阶段,Bean就成为了一个完整的Spring Bean,被存储到单例池
singletonObjects中去了,即完成了Spring Bean的整个生命周期。
IOC中Bean的生命周期_第1张图片

}

creatBean()的流程(Bean的生命周期):

 1.构造对象
      拿取机制

.              通过反射机制,从BeanDefinition(Bean定义)拿到这个类的构造方法

               当只有一个构造方式,选择该构造方法(无论该构造方法是否有参数);

               当有多个构造方法时,会优先拿取带有@Autowired注解的构造方法 ,当多个构造方法都添加了@Autowired注解时,系统无法分辨采用哪一种构造方法,就会发生报错。

                如果多个构造方法,都没有@Autowired注解,则会优先拿无参的构造方法,如果多个构造方法都是有参的 ,系统无法分辨就会产生报错   。

                tip:不建议在任何Bean中添加多个构造方法 ,可读性低,理解及维护困难。

          在拿取完构造方法后,需要进行参数的准备。

       参数准备过程:

        在Spring的单例池中,根据参数的Class类进行查找。

             如果有多个实例,则会根据参数名,进行匹配,如果没有找到匹配(名字一致的参数),Spring会认为构造信息不完整,产生报错

         通过反射进行Bean的构造

             实例化对象,如果选用是无参构造方法,则无需参数直接构造。

                       

2 填充属性      

        通过populateBean方法为Bean内部所需的属性进行赋值填充(通常的属性是带有@Autowired注解的变量),通过三级缓存的机制进行填充(依赖注入)。

3 初始化实例

        通过initalzeBean方法,对实例进行初始化。

        第一步:通过invokeAwareMethods方法,为实现了各种Aware的Bean设置如beanName,beanFactory等容器信息。Aware接口代表信息感知接口一但是实现了该接口,就可以在Bean实例中感知并获取到对应信息

        第二步: 通过invokeinitMethods(里面内容贼多)方法执行Bean的初始化方法,在执行该初始化方法之后与之后,还需要对 Bean后置处理器BeanPostProcessors进行处理,当处理器过多时,可以通过实现PriorityOrdered接口来实现指定顺序执行

  tip:在这一步完成后,Bean已经可以使用了

4 注册销毁

       通过registerDisposableBean方法将实现了销毁接口DisposeableBean方法的Bean进行注册,这样在销毁时就可以执行destory()方法了

添加单例池(addSingleton)

        将这些完整的Bean对象通过addSingleton方法,放入单例池singletonObjects中就可以获取和使用,到添加到单例池中后,产生bean的过程就全部结束了

销毁

        在销毁前,先调用"销毁前处理器" postProcessBeforeDestruction,在这里就会执行Bean中的@PreDestory方法,然后通过destoryBean方法逐一"销毁"Spring中的所有Bean。 销毁时会执行destory()方法(接口DisposeableBean),在destory()执行之后,会通客户销毁方法invokeCustomDestroyMethod来执行程序员定义在Bean中的destoryMethod方法

                

你可能感兴趣的:(spring,java,数据库)