两大核心:IOC(控制反转)和AOP(面向切面编程);
SpringIOC的理解:
IOC(控制反转):是一个理论思想,原来的对象是由使用者来进行控制,有了spring之后,可以把整个对象交给spring来帮我们进行管理。
IOC也叫DI(依赖注入):把对应的属性的值注入到具体的对象中,@Autowired,populateBean完成属性值的注入。
Spring的IOC三种注入方式:构造器注入、setter方法注入、注解注入
容器:存储对象,使用map结构来存储,在spring中一般存在三级缓存,singletonObjects存放完整的bean对象,但是整个bean 的生命周期。从创建到使用到销毁的过程全部都是由容器来管理(带出问题bean的生命周期)
- 容器的创建过程(beanFactory,DefaultListableBeanFactory),向bean工厂中设置一些参数(BeanPostProcessor,Aware接口的子类)等等属性;
- 加载解析bean对象,准备要创建的bean对象的定义对象beanDefinition,(xml,或者注解的解析过程)
- BeanFactoryPostProcessor的处理,处理占位符PlaceHolderConfigurSupport,ConfigurationClassPostProcessor
- BeanPostProcessor的注册功能,方便后续对bean对象完成具体的扩展功能
- 通过反射的方式将BeanDefinition对象实例化成具体的bean对象
- Bean对象的初始化过程(填充属性,调用aware子类的方法,调用beanPostProcessor前置处理方法,调用init-method方法,调用BeanPostProcessor的后置处理方法)
- 生成完整的Bean对象,通过getBean方法可以直接获取
- 销毁过程
AOP(面向切面编程):可以说是对OOP(面向对象编程)的补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块。
Spring AOP 中的动态代理主要有两种方式:JDK 动态代理(目标对象实现接口)和 CGLIB 动态代理【子类代理】(目标对象未实现接口);
Spring Bean的生命周期?
大致可以分为五个阶段:创建前准备、创建实例、依赖注入、容器缓存、销毁实例。
- 创建前准备:bean在开始加载之前要从上下文和一些配置中去解析并且查找bean相关的扩展实现,比如像init-method,容器在初始化bean的时候会调用的方法,还有destory-method,容器在销毁bean的时候会调用的方法,以及BeanPostProcessor这一类的bean加载过程中的一些前置和后置的一些处理扩展实现,这些类或者是配置其实是spring提供给开发者用来去实现bean加载过程中的一些扩展;
- 创建实例阶段:主要作用通过反射去创建bean的实例对象,并且会扫描和解析bean声明的一些属性;
- 依赖注入阶段:如果实例化的bean存在依赖其他bean对象的一些情况,则需要对这些依赖的bean进行对象注入,比如常见的@Autowired,以及setter注入的配置形式,同时在这个阶段会触发一些扩展的调用,比如说常见的扩展类beanPostProcessors,用来去实现bean初始化前后的回调;
- 容器缓存阶段:把bean保存在容器里,以及spring的缓存中,到这个阶段我们就可以使用bean了,init-method这个属性配置的一些方法,会在这个阶段会被调用。以及像BeanPostProcessors的后置处理器方法也会在这个阶段被触发。
- 销毁实例阶段: