当前位置: 首页 > 工具软件 > JFinal IOC > 使用案例 >

Spring的AOP和IOC还有IOC的三大注入方式

白昊乾
2023-12-01

Spring 的AOP 理解?
OOP 面向对象,允许开发者定义纵向的关系,但并适用于定义横向的关系,导致了
大量代码的重复,而不利于各个模块的重用。
AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但
却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命
名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了
系统的可维护性。可用于权限认证、日志、事务处理。
AOP 实现的关键在于代理模式,AOP 代理主要分为静态代理和动态代理。静态代
理的代表为AspectJ;动态代理则以Spring AOP 为代表。
(1)AspectJ 是静态代理的增强,所谓静态代理,就是AOP 框架会在编译阶段生
成AOP 代理类,因此也称为编译时增强,他会在编译阶段将AspectJ(切面)织入到Java 字
节码中,运行的时候就是增强之后的AOP 对象。
(2)Spring AOP 使用的动态代理,所谓的动态代理就是说AOP 框架不会去修改
字节码,而是每次运行时在内存中临时为方法生成一个AOP 对象,这个AOP 对象包含了
目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。
Spring AOP 中的动态代理主要有两种方式,JDK 动态代理和CGLIB 动态代理:
①JDK 动态代理只提供接口的代理,不支持类的代理。核心
InvocationHandler 接口和Proxy 类,InvocationHandler 通过invoke()方法反射来调用
目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy 利用
InvocationHandler 动态创建一个符合某一接口的的实例, 生成目标类的代理对象。

②如果代理类没有实现InvocationHandler 接口,那么Spring AOP 会选择
使用CGLIB 来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的
类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代
码,从而实现AOP。CGLIB 是通过继承的方式做的动态代理,因此如果某个类被标记为final,
那么它是无法使用CGLIB 做动态代理的。
Spring 的IoC 理解?
(1)IOC 就是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权
和时机是由自己把控的,而现在这种权力转移到Spring 容器中,并由容器根据配置文件去
创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。
DI 依赖注入,和控制反转是同一个概念的不同角度的描述,即应用程序在运行时依赖IoC
容器来动态注入对象需要的外部资源。
(2)最直观的表达就是,IOC 让对象的创建不用去new 了,可以由spring 自动
生产,使用java 的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并
调用对象的方法的。
Spring 的IOC 有三种注入方式
Spring 的IOC 有三种注入方式:构造器注入、setter 方法注入、根据注解注入。

 类似资料: