Spring的核心
Spring是一个容器,是IOC和AOP的容器,用来装javabean(java对象),中间层框架(万能胶)可以起一个连接作用,比如说把Struts和hibernate粘合在一起运用。简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
Spring的IOC初始化流程
- 配置Spring
一般情况配置Spring有两种方式:xml和注解,两种方式的类上下文加载器分别是:
Xml:new ClassPathXmlApplicationContext();
Annotation:new AnnotationConfigApplicationContext();
- 通过上下文加载器读取Bean定义
1.BeanDefinitionReader读取Bean定义
2. BeanDefinitionScanner扫描Bean包,看看哪些是被@Component注解的类
3.BeanDefinitionRegistry注册Bean定义,将Bean定义存入到BeanDefinitionMap中
- 通过BeanFactory的后置处理器,可以修改Bean定义或者是新增Bean定义
BeanFactoryPostProcessor:修改Bean定义
@FunctionalInterface
public interface BeanFactoryPostProcessor {
// 如果需要修改Bean定义,只需要自己实现这个类即可,实现该方法时,
//可以获取到BeanFactory,拿到BeanFactory后可以自行修改Bean定义等一系列参数
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
BeanDefinitionRegistryPostProcessor:注册Bean定义
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
// 如果需要注册Bean定义,只需要实现此方法即可,可以自动获取到BeanDefinitionRegistry
// 拿到BeanDefinitionRegistry在自己实现的代码里面创建Bean定义,然后调用注册方法即可
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
}
- 将生成好的Bean定义存放到BeanDefinitionMap中,Key为BeanName,Value为BeanDefinition的实体类
- 通过BeanFactory的getBean()方法,从BeanDefinitionMap中获取Bean定义,并且生成Bean实体。
Spring的Bean的生命周期
- 实例化Bean,此时还不可以被@Autowared
实例化Bean有两种常用的方式
- 工厂方式:自己实现工厂,可以自己控制Bean的生成的所有过程
- 反射方式:完全交给Spring管理,不可自控:@Component
- 填充属性,此时可以@Autowared
- 初始化Bean
- 将初始化的Bean存放到BeanMap中,key为BeanName,value为Bean实体(一级缓存,单例池)
- 在Spring创建Bean的过程中会调用九次后置处理器,各种各样的功能,AOP就在其中一次实现
- 在创建Bean的过程中会调用大量的Aware,可以对类进行各种操作
ApplicationContext和BeanFactory的异同点
- 相同点:他们都可以创建Bean
- 不同点:
BeanFactory只能用来创建Bean
ApplicationContext中集成了大量的扩展点,使其可以对Bean做各种操作。ApplicationContext还集成了国际化,事务等一系列复杂的扩展点。使其可以完成读取配置,生成Bean定义,修改Bean定义,新增Bean定义,生成Bean等等的操作。
但也是因为ApplicationContext中集成了太多的东西,所以在小内存设备比如移动穿戴设备上开发的时候不建议用ApplicationContext,反而更建议用BeanFactory
Spring的扩展点
BeanFactoryPostProcessor:BeanFactory的后置处理器,可以用来修改Bean定义
BeanDefinitionRegistryPostProcessor:Bean定义的后置处理器,可以用来注册Bean定义,新增一个Bean定义
其余的暂且不知道。。。以后再补充