Spring
整体脉络
IOC加载过程
- 读取配置类
- 扫描配置类@Component @Configuration
- 注册bean定义
- 扩展节点修改,注册bean定义
- 通过bean工厂 getBean(可以生产可以读取)
- 实例化,填充属性,初始化,放到MAP(singletonObjects)
- 详细
// 加载spring上下文 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Application.class); // 调用父类构造函数,获取BeanFactory this.beanFactory = new DefaultListableBeanFactory(); // 创建读取注解的Bean定义读取器 this.reader = new AnnotatedBeanDefinitionReader(this); -> 会注册很多后置处理器(解析注解的类,解析autowired注解等等) // 创建扫描器,扫描包或类 this.scanner = new ClassPathBeanDefinitionScanner(this); // 注册配置类 this.register(annotatedClasses); // IOC容器刷新接口 refresh();
- refresh方法
// 1.准备刷新上下文环境 this.prepareRefresh(); // 2. 获取告诉子类初始化bean工厂,不同工厂不同实现 ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory(); // 3. 对bean工厂填充属性 this.prepareBeanFactory(beanFactory); try { // 留个子类实现该接口 this.postProcessBeanFactory(beanFactory); // 调用bean工厂后置处理器,将class扫描成beanDefinition(由BeanFactoryPostProcessor后置处理器解析配置类,这里才注册bean定义) this.invokeBeanFactoryPostProcessors(beanFactory); // 注册bean后置处理器 this.registerBeanPostProcessors(beanFactory); // 初始化国际化资源处理器 this.initMessageSource(); // 创建事件多播器 this.initApplicationEventMulticaster(); // 留个子类实现,springboot在这里启动tomcat this.onRefresh(); // 事件监听器注册到多播器上 this.registerListeners(); // 实例化剩余的单例bean(将bean定义调用getBean,去生产bean) this.finishBeanFactoryInitialization(beanFactory); // 容器刷新,发布刷新事件 spring cloud在这里启动 this.finishRefresh(); } catch (BeansException var9) { if (this.logger.isWarnEnabled()) { this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9); } this.destroyBeans(); this.cancelRefresh(var9); throw var9; } finally { this.resetCommonCaches(); }
- finishBeanFactoryInitialization(beanFactory)生产bean
// 为bean工厂创建类型转化器 // 处理aspectj ... // 冻结所有bean定义,不能修改了,开始生产 beanFactory.freezeConfiguration(); // 实例化剩余单例bean beanFactory.preInstantiateSingletons();
- getBean():判断是否符合工厂生产标准,先从一级缓存拿,拿到就返回,没有就createBean -> BeanPostProcessor(Bean后置处理器创建)
- BeanFactory:spring顶层核心接口,使用了简单工厂模式,负责生产Bean
- FactoryBean:被FactoryBean修饰的类成为一个特殊类,通过重写getObject可以在返回类的时候做处理
- BeanDefinition:spring顶层核心接口,封装了生产bean的一切原料,描述Bean,存储Bean的相关信息,Bean的属性、是否单例、延迟加载、Bean的名称、构造方法等
ApplicationContext BeanFactory
BeanFactory只负责bean的实例化/装配,
ApplicationContext包括BeanFactory所有功能,还具有很多其它功能,管理spring生命周期,加载配置文件,触发类路径扫描
Bean生命周期
- 实例化,通过反射(由spring控制)和工厂方法(更灵活 可以自己new)
- 填充属性 -> @Autowired @Value(循环依赖,解决用的三级缓存三个MAP)
- 初始化 imitMethod destory(AOP在初始化之后动态代理实现)
- BeanNameAware BeanClassLoaderAware BeanFactoryAware…
- 放到单例池(一级缓存)put -> Map<key,value> key:bean的名字
bean工厂后置属性,两个扩展点
用于集成spring框架
- BeanFactoryPostProcessor
修改bean定义public class TestBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { // 获得bean定义 GenericBeanDefinition user = (GenericBeanDefinition) beanFactory.getBeanDefinition("User"); // 修改 user.setBeanClassName("com.zwq.test.User"); } }
- BeanDefinitionRegistryPostProcessor
注册bean
spring除了IOC,其余都是通过扩展节点实现public class TestBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor { }