Spring是一个轻量级开发框架,其核心思想是Ioc(控制反转)以及AOP(面向切面编程),为java应用开发提供组件管理服务,用于组件之间的解耦,以及简化第三方Javaee中间件技术的使用,是是一个基础架构型的开发框架
简单来说,Bean指的是被IOC容器所管理的对象,我们通过配置文件或着注解,来告诉IOC容器帮助我们管理那些对象
生产 --> 使用 --> 销毁
在Spring程序启动时(即调用ClassPathXmlApplicationContext时),开始执行的过程。
用BeanDefinition方法(loadBeanDefinition 加载Bean定义),通过xml,注解扫描等各种方式,将定义在程序中的bean全部找到(将找到的结果封装成一个BeanDefinition对象),然后放在一个名为beanDefiniation的Map的集合中去,Spring框架通过遍历该集合,使用creatBean方法创造Bean对象{大体分为:构造对象,填充属性,初始实例化,注册销毁四个步骤}。创建好的Bean对象存储在一个名为singleObjects的Map集合中去,当调用getBean方法时,则最终从Map集合中取出Bean实例对象返回。
{
}
. 通过反射机制,从BeanDefinition(Bean定义)拿到这个类的构造方法
当只有一个构造方式,选择该构造方法(无论该构造方法是否有参数);
当有多个构造方法时,会优先拿取带有@Autowired注解的构造方法 ,当多个构造方法都添加了@Autowired注解时,系统无法分辨采用哪一种构造方法,就会发生报错。
如果多个构造方法,都没有@Autowired注解,则会优先拿无参的构造方法,如果多个构造方法都是有参的 ,系统无法分辨就会产生报错 。
tip:不建议在任何Bean中添加多个构造方法 ,可读性低,理解及维护困难。
在拿取完构造方法后,需要进行参数的准备。
在Spring的单例池中,根据参数的Class类进行查找。
如果有多个实例,则会根据参数名,进行匹配,如果没有找到匹配(名字一致的参数),Spring会认为构造信息不完整,产生报错
实例化对象,如果选用是无参构造方法,则无需参数直接构造。
通过populateBean方法为Bean内部所需的属性进行赋值填充(通常的属性是带有@Autowired注解的变量),通过三级缓存的机制进行填充(依赖注入)。
通过initalzeBean方法,对实例进行初始化。
第一步:通过invokeAwareMethods方法,为实现了各种Aware的Bean设置如beanName,beanFactory等容器信息。Aware接口代表信息感知接口,一但是实现了该接口,就可以在Bean实例中感知并获取到对应信息
第二步: 通过invokeinitMethods(里面内容贼多)方法执行Bean的初始化方法,在执行该初始化方法之后与之后,还需要对 Bean后置处理器BeanPostProcessors进行处理,当处理器过多时,可以通过实现PriorityOrdered接口来实现指定顺序执行
tip:在这一步完成后,Bean已经可以使用了
通过registerDisposableBean方法将实现了销毁接口DisposeableBean方法的Bean进行注册,这样在销毁时就可以执行destory()方法了
将这些完整的Bean对象通过addSingleton方法,放入单例池singletonObjects中就可以获取和使用,到添加到单例池中后,产生bean的过程就全部结束了
在销毁前,先调用"销毁前处理器" postProcessBeforeDestruction,在这里就会执行Bean中的@PreDestory方法,然后通过destoryBean方法逐一"销毁"Spring中的所有Bean。 销毁时会执行destory()方法(接口DisposeableBean),在destory()执行之后,会通客户销毁方法invokeCustomDestroyMethod来执行程序员定义在Bean中的destoryMethod方法