什么是spring
spring是一个轻量级的控制反转和面向横切面编程的框架。
springbean的生命周期
什么是springBean的生命周期?
Bean从在Spring中创建开始,到Bean被销毁结束,这一过程称之为Bean的生命周期。
soringbean的生命周期可以分为五个部分,对象的创建、依赖注入、初始化,使用和销毁。
1:对象的创建
构造器推断
首先实例化就是利用类的构造器创建对象的过程,那么在实例化之前一定要知道用哪一个构造器,这就是构造器推断,这个步骤是由AutowiredAnnotationBeanPostProcessor找出哪些构造器上有@Autowired注解,寻找的过程是
1:对beanClass中所有的构造器进行遍历,找到带有@Autowired注解的构造器加入到候选构造器集合中。
2:对候选构造器集合中的内容进行遍历,找到@Autowired注解中require属性是否是true(默认是true),如果是,则不能再有其他@Autowired注解的构造器,有的话就报异常。如果不是,那就可以继续添加带有@Autowired注解并且require属性为false的构造器。
3:如果候选构造器集合不为空,并且beanClass中还有空构造器。那么就将该空构造器加入到构造器集合中。如果构造器集合为空,且beanClass中只有一个有参的构造器那么就会将此构造器加入到构造器集合中。如果这种情况下还没有有参构造只有无参构造那就会使用无参构造,如果有多个构造器也会使用无参构造。
对象的实例化
ConstructorResolver根据候选构造器集合中构造器的优先级对beanClass进行实例化,这个过程主要有三个问题
1:在创建对象前后执行方法
创建前后的增强
postProcessBeforeInstantiation
这里返回的对象若不为 null 会替换掉原本的 bean,并且仅会走 postProcessAfterInitialization 流程 postProcessAfterInstantiation
这里如果返回 false 会跳过依赖注入阶段
2:构造器的优先级怎样确定
首先public修饰的构造器优先权高于private修饰的构造器。
修饰相同的情况下构造器参数多的优先权更高。
3:如果选定的构造器中需要的bean不在Spring容器中怎么办?
首先对根据优先级排序好的bean进行遍历尝试调用,如果正常调用就没问题,并直接退出遍历,如果出现了参数不在spring容器中则遍历下一个bean,如果没有一个可以调用的就会抛出异常。
2: 依赖注入(对属性进行填充)
依赖注入涉及到以下几个问题
依赖注入前的增强
postProcessProperties
如 @Autowired、@Value、@Resource
1:BeanDefination:找到被@Autowired、@Value,@Resource,@Inject等注解注解的属性
这个过程由下面两个处理器来进行处理
1、AutowiredAnnotationBeanPostProcessor:处理@Autowird,@Value,@Inject注解
2、CommonAnnotationBeanPostProcessor:处理@PostConstruct,@PreDestroy,@Resource注解
处理的过程是首先遍历bean中所有的属性和方法,判断是都有上面相关的注解,有的话就把他们都封装到一个叫做Injectionmetadata的对象中,然后对这个对象中的成员进行判断是否被注解了两次,比如被@Autowird、@Resource同时注解,没有被解析就会被放到已经检查的元素集合中,检查过了就不会放入,这样就避免了重复解析。
真正的依赖注入
使用beanName为key从缓存中取出Injectionmetadata,然后对它进行遍历,根据类型从spring容器中获取对应的对象,然后利用反射注入到bean的属性中。
3:初始化
初始化的过程涉及初始化前增强,初始化方法,初始化后的增强
初始化前的增强:postProcessBeforeInitialization
这里返回的对象会替换掉原本的 bean如 @PostConstruct、@ConfigurationProperties处理一系列Aware接口的回调方法
执行初始化的方法
初始化后的增强:postProcessAfterInitialization
这里返回的对象会替换掉原本的 bean如代理增强
4:使用
5:卸载
执行 @PreDestory的方法
如果 Bean 实现了 DisposableBean 这个接口,会调用那个其实现的 destroy()方法;
最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的
销毁方法。



