BeanFactory Spring 顶层核心,使用了简单工厂模式
用唯一标识获得Bean对象:
Caer car = context.getBean("name",Cra.class);
获取bean
1.@(注解方式): new AnnotionConfigApplicationContext 上下文是bean工厂的搬运工牌
2.xml : new ClassPathXMLApplicationContext(“xml”)
这两种方式都要读成统一的一种方式:BeanDefinition ==》通过BeanDefinitionRegistry(注册器)到BeanDefinitionMap容器
1.还得有去读取去联系的类:BeanDefinitionReader
2.读到之后还需要扫描出来:BeanDefinitionScanner
3.注册BeanDefinitionRegistry(注册器)到BeanDefinitionMap容器
4.最后才可以getBean
Bean工厂和上下文的对比
1.有生产bean的能力,但是上下文是调用工厂生产的,不是自己生产
2.bean工厂需要先注册定义,再一个个的生产,context却可以直接扫描
3.context的职责比较多,bean工厂只生产bean
Bean的生命周期:
1.实例化(反射):实例化之后,@Autowired的属性并没有加载进来
2.注入属性:@Autowired@value
3.初始化:initMethod destroy
4.put(“beanName”,Bean的实例)进Map<BeanName,value>单例池,一级缓存
生产bean的时候一个问题:循环依赖
spring解决循环依赖的方法是:三级缓存(三个map)
实例化有两种方式:反射和工厂方法
在bean的生命周期中有9次可以调用bean后置处理器
bean后置处理器作用:
1.直接返回bean,停止创建
2.指定实例化构造函数
3.属性注入的预解析
4.解决循环依赖:getEarlyBeanRefenrence
5.中止赋值
6.注入属性进行DI:postProcessAfterinstantiation
7.初始化前调用@postContruct
7.1初始化中,使用了很多beanFactory的回调函数 BeanNameAware、beanClassLoaderAware、BeanFactoryAware、EnvironmentAware
8.初始化后 AOP:创建代理(为了与IOC解耦)