一.Spring的AOP简介
1.1 什么是AOP
AOP
为
Aspect Oriented Programming
的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代 理实现程序功能的统一维护的一种技术。AOP 是
OOP
的延续,是软件开发中的一个热点,也是
Spring
框架中的一个重要内容。利用
AOP
可以对业务 逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低
,提高程序的可重用性,同时提高了开发的效率。
1.2 AOP的作用及其优势
作用:在程序运行期间,在不修改源码的情况下对方法进行
增强
优势:减少重复代码,提高开发效率,并且便于维护
1.3 AOP的底层实现
实际上,
AOP
的底层是通过
Spring
提供的的动态代理技术实现的。在运行期间,
Spring
通过动态代理技术 动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能 的增强。
1.4 AOP的动态代理技术
常用的动态代理技术
JDK
代理:基于接口的动态代理技术
cglib
代理:基于父类的动态代理技术
1.5 JDK的动态代理
1.5.1
代理模式概述
为什么要有
''
代理
''?
生活中就有很多代理的例子,例如,我现在需要出国,但是我不愿意自己去办签证、预定 机票和酒店(觉得麻烦 ,那么就可以找旅行社去帮我办,这时候旅行社就是代理,而我自己就是被代理了。 代理模式的定义:被代理者没有能力或者不愿意去完成某件事情,那么就需要找个人代替自己去完成这件事, 这个人就是代理者,
所以代理模式包含了
3
个角色
:
被代理角色
代理角色
抽象角色
(
协议
)
1.5.2
静态代理
项目结构:
package wwx.test02;
public interface Sing {
public void sing();
}
-------------------------------------------
package wwx.test02;
public class JinLian implements Sing {
@Override
public void sing() {
System.out.println("jinlian在唱歌");
}
}
-------------------------------------------
package wwx.test02;
public class WangPo implements Sing{
JinLian jinLian;
public WangPo(JinLian jinLian) {
this.jinLian = jinLian;
}
@Override
public void sing() {
jinLian.sing();
}
}
-------------------------------------------
package wwx.test02;
public class XiMen {
public static void main(String[] args) {
JinLian jl=new JinLian();
WangPo wp=new WangPo(jl);
wp.sing();
//被代理者没有能力或者不愿意去完成某件事情,
//那么就需要找个人代替自己去完成这件事,这个人就是代理者
//静态代理模式:代理类是实际存在的,根据代理类生成一个代理对象
//动态代理模式:代理类是不存在的,直接动态生成一个代理对象
//实现了静态代理
}
}
------------------------------------------
1.5.3
动态代理
概述
:
动态代理就是直接通过反射生成一个代理对象
,
代理对象所属的类是不需要存在的 动态代理的获取:
jdk提供一个Proxy类可以直接给实现接口类的对象直接生成代理对象
参数
1:ClassLoader loader
被代理对象的类加载器
参数
2:Class<?>[] interfaces
被代理对象的要实现的接口
参数
3:InvocationHandler h (
接口
)
执行处理接口
返回值
:
代理对象
前
2
个参数是为了帮助在
jvm
内部生成被代理对象的代理对象
,
第
3
个参数
,
用来监听代理对象调用方
法
,
帮助我们调用方法
回调方法
:
当代理对象调用了方法
,
就会来执行该
invoke
方法
,
在该方法中就可以增强
被代理类的方法
参数
1:
生成的代理对象 这里就是
p
这个代理对象
(
慎用
)
参数
2:
当前代理对象执行的方法 这里
method
就是
happy()
方法对象
参数
3:
当前代理对象执行的方法
,
传入的实际参数
返回值
:
当前代理对象执行的方法的返回值
参数
1:
生成的代理对象 这里就是
p
这个代理对象
(
慎用
)的原因:
package wwx.test03;
public class JianLian implements Sing{
@Override
public void sing() {
System.out.println("金莲在唱歌");
}
}
------------------------------------------------------------------------------------
------------------------
package wwx.test03;
public interface Sing {
public void sing();
}
------------------------------------------------------------------------------------
------------------------
package wwx.test03;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;
public class DemoTest {
// 参数1:ClassLoader loader 被代理对象的类加载器
// 参数2:Class<?>[] interfaces 被代理对象的要实现的接口
//1.6 AOP相关概念
// 在正式讲解 AOP 的操作之前,我们必须理解 AOP 的相关术语,常用的术语如下:
// Target(目标对象):代理的目标对象
// Proxy (代理):一个类被 AOP 织入增强后,就产生一个结果代理类
// 参数3:InvocationHandler h (接口)执行处理接口
// 返回值: 代理对象
// 前2个参数是为了帮助在jvm内部生成被代理对象的代理对象,第3个参数,用来监听代理对象调用方
// 法,帮助我们调用方法
public static void main(String[] args) {
JianLian jianLian=new JianLian();
Sing p = (Sing) Proxy.newProxyInstance(JianLian.class.getClassLoader(),
JianLian.class.getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Date date=new Date();
System.out.println(date);
method.invoke(jianLian,args);
return null;
}
});
p.sing();
}
}
1.6 AOP相关概念
在正式讲解
AOP
的操作之前,我们必须理解
AOP
的相关术语,常用的术语如下:
Target
(目标对象):代理的目标对象
Proxy
(代理):一个类被
AOP
织入增强后,就产生一个结果代理类
Joinpoint
(连接点):类里面哪些方法可以被增强,这些方法称为连接点,
spring
只支持方法类型的连接点
Pointcut
(切入点):实际被真正增强的方法,称为切入点
Advice
(通知
/
增强):实际增强的逻辑部分称为通知(增强),通知有多种类型:
前置通知:指定增强的方法在切入点方法之前执行
后置通知:指定增强的方法在切入点方法之后执行
异常通知:指定增强的方法在出现异常时执行
最终通知:无论增强方式执行是否有异常都会执行
环绕通知:指定增强的方法在切入点方法之前和之后都执行
Aspect
(切面):是切入点和通知(引介)的结合
Weaving
(织入):是指把增强应用到目标对象来创建新的代理对象的过程。
spring
采用动态代理织入,而AspectJ
采用编译期织入和类装载期织入
1.7 AOP 开发明确的事项
1.7.1
需要编写的内容
编写核心业务代码(目标类的目标方法)
编写切面类,切面类中有通知
(
增强功能方法
)
在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合
1.7.2 AOP
技术实现的内容
Spring
框架监控切入点方法的执行。一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的代 理对象,根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行。
1.7.3 AOP
底层使用哪种代理方式
在
spring
中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。
二.基于XML的AOP开发
2.1
快速入门
1.
导入
AOP
相关坐标
2.
创建目标接口和目标类(内部有切点)
3.
创建切面类(内部有增强方法)
4.
将目标类和切面类的对象创建权交给
spring
5.
在
applicationContext.xml
中配置织入关系
6.
测试代码