Spring 框架:
1. Spring 的两大核心是:IOC(控制反转)和 AOP(面向切面编程) DI(依赖注入)
2. IOC 的意思是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权和
时机是由自己把控的,而现在这种权力转移到 Spring 容器中,并由容器根据配置文件去创
建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。最
直观的表达就是,
IOC 让对象的创建不用去 new 了,可以由 spring 根据我们提供的配置文
件自动生产,我们需要对象的时候,直接从 Spring 容器中获取即可.
Spring 的配置文件中配置了类的字节码位置及信息, 容器生成的时候加载配置文件识
别字节码信息, 通过反射创建类的对象.
Spring 的 IOC 有三种注入方式 :构造器注入, setter 方法注入, 根据注解注入。
3. DI 的意思是依赖注入,和控制反转是同一个概念的不同角度的描述,即应用程序在
运行时依赖 Io c 容器来动态注入对象需要的外部资源。
4. AOP,一般称为面向切面编程,作为面向对象的一种补充,用于将那些与业务无关,
但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被
命名为“切面”(Aspect). SpringAOP 使用的动态代理,所谓的动态代理就是说 AOP 框
架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个 AOP 对象,这个 AOP
对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。
5. Spring AOP 中的动态代理主要有两种方式,JDK 动态代理和 CGLIB 动态代理:
(1)JDK 动态代理只提供接口代理,不支持类代理,核心 InvocationHandler 接口和
Proxy 类,InvocationHandler 通过 invoke()方法反射来调用目标类中的代码,动态地将
横切逻辑和业务编织在一起,Proxy 利用 InvocationHandler 动态创建一个符合某一接口
的的实例, 生成目标类的代理对象。
(2) 如果代理类没有实现 InvocationHandler 接口,那么 Spring AOP 会选择使用
CGLIB 来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,
可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从
而实现 AOP。CGLIB 是通过继承的方式做的动态代理,因此如果某个类被标记为 final,
那么它是无法使用 CGLIB 做动态代理的。