简介:
SpringIOC容器实例化的对象,SpringIOC容器管理的对象就是Bean。
创建Bean源码分析
执行AbstractApplicationContext 的 refresh()方法;
refresh()方法调用prepareRefresh()方法;
refresh()方法调用prepareBeanFactory(beanFactory)方法;
refresh()方法调用postProcessBeanFactory(beanFactory)方法,无任何代码实现;
*refresh()方法调用invokeBeanFactoryPostProcessors(beanFactory)方法;
invokeBeanFactoryPostProcessors(beanFactory)方法执行BeanFactoryPostProcessor后置处理器及其子接口BeanDefinitionRegistryPostProcessor【先执行BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry()方法会扫描到指定包下面的标有注解的类,然后将其变成BeanDefinition对象再放入BeanDefinitionMap中;再执行 BeanFactoryPostProcessor接口的postProcessBeanFactory()方法】
*refresh()方法调用registerBeanPostProcessors(beanFactory)方法实现了PriorityOrdered、Ordered接口,排序后注册所有的BeanPostProcessor后置处理器;
refresh()方法调用initMessageSource()方法;
refresh()方法调用initApplicationEventMulticaster()方法 ;
refresh()方法调用onRefresh()方法;
refresh()方法调用registerListeners()方法;
*refresh()方法调用finishBeanFactoryInitialization(beanFactory)方法完成非懒加载的Spring bean的创建;
refresh()方法调用finishRefresh()方法;
BeanDefinition加载过程
加载【xml | 注解 | java类】=>解析=>扫描=> 注册【BeanDefinitionMap中】
BeanDefinition扩展
实现BeanFactoryPostProcessor的postProcessBeanFactory()方法可以处理BeanDefinition对象。
Bean创建完成后扩展
①finishBeanFactoryInitialization(beanFactory)=>preInstantiateSingletons()=>实现SmartInitializingSingleton接口的afterSingletonsInstantiated();
②finishRefresh()=>publishEvent()监听事件ContextRefreshedEvent【@EventListener(ContextRefreshedEvent.class)】
Bean循环依赖【单例使用缓存 | 多例Bean不使用缓存 | 构造函数用@Lazy实现循环依赖】
三级缓存[Map]:
一级缓存:完整的bean。
二级缓存:避免多重循环依赖的情况,重复动态代理。
三级缓存:①缓存的是函数接口,通过lambda方法传进去(把bean的实例和名字传进去,通过aop创建);②并不会立即创建;③在二次获取依赖调用三级缓存(如果实现了aop才会动态代理,没有就直接返回bean的实例);④放入二级缓存(避免重复创建)。
配置Bean的方式
xml:bean标签
注解:@Compoment @Controller @Service @Repostory 需要配置scan扫描,反射调用构造方法
javaConfig:@Bean 自己控制实例化过程
@import:3种方式
Bean的作用域
单例 多例 request session application
并发线程安全
单例bean 成员变量声明在类中会有线程安全问题,声明在方法中不会出现安全问题。
多例线程安全。
成员变量放在ThreadLoacl中,绑定在各自的线程中。
加同步锁。
实例化Bean方式
构造器方式【反射】
静态工厂方式
实例工厂方式
FactoryBean方式
自动装配
no byName bytype constructor
Bean生命周期回调方法
注解方式:初始化@PostConstruct 销毁@PreDestory
实现接口InitializingBean的afterPropertiesSet()方法, DisposableBean的destroy()方法
设置bean的属性initMethod方法,destroyMethod方法