一、Spring IOC
控制反转:控制是指对象对内部成员的控制权,反转是指控制权不是当前对应拥有,而是由容器管理。IOC(思想/设计模式)由两种实现形式:依赖注入、依赖查找。
1. IOC加载过程
1> BeanDefinitionReader加载指定的配置文件信息,生成Bean的定义信息,BeanDefinition用来保存Bean的定义信息
2> BeanDefinition与完整的BeanDefintion对象之间,可以通过一个后置增强器对Bean的定义信息进行修改或者扩展。只需要实现BeanFactoryPostProcessors接口。
3> 拿到完成的BeanDefinition对象就可以创建Bean对象了。这就是Bean的生命周期。
2. bean生命周期
大致流程
对象实例化->对象初始化->完整对象->销毁
细化流程
实例化:实例化都在InstantiationAwareBeanPostProcessor接口里。包括实例化前置、实例化、实例化后置、属性修改
初始化: 初始化前置、执行初始化方法、PostConstruct、初始化后置
销毁: 当Bean实现了DisposableBean接口,执行destry()方法,如果Bean在配置文件的定义包含destroy-method属性,执行指定方法
3. applicationContext和BeanFactory的关系
- BeanFactory采用延迟加载模式注入bean,ApplicationContext是容器启动时,一次性创建所有的Bean.
- beanFactory主要是面对与spring框架的基础设施,面对spring自己。Applicationcontext是面向spring使用者和开发者
4. spring如何解决循环依赖问题
spring内部三级缓存
二、Spring AOP
AOP是指面向切面编程,有AspectJ和SpringAOP。AOP的代理分为静态代理和动态代理。静态代理的代表是AspectJ,动态代理的代表是SpringAOP。springaop只能对方法进行拦截。
基本术语
切面:某个模块,比如日志模块
连接点:一般表示执行方法
Advice(通知):连接点上执行的动作
通知:
增强: 自定义
底层实现
动态代理: 代理类和委托类的关系是运行时才确定下来的
aop底层采用动态代理机制实现:接口+实现类
1. 基于JDK动态代理实现
如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建一个代理对象. 必须实现InvocationHandler, 重写invoke方法
2. 基于CGLIB动态代理实现
如果没有实现接口的对象,就无法使用JDK Proxy进行处理,这时候会使用Cglib生成一个被代理对象的子类来执行。
就是代理创建出一个和实现类平级的一个对象,但是这个对象不是一个真正的对象,只是一个代理对象,可以和实现类有相同的功能。这就是AOP横向机制的原理。