AOP是面向切面编程的意思。比如说我们在bean的某一个方法前后添加一些自己的方法,进行处理,这就是切面编程,把自己的方法嵌入到bean方法的前后。
举一个例子。
我们有一个系统类:
public class SystemService {
public static void doLog() {
System.out.println("执行日志代码");
}
public static void doTx() {
System.out.println("执行事务代码");
}
}
然后我们就可以在自己的bean中去使用这些系统类中的方法:
public class SomeServiceImpl implements ISomeService {
//主业务逻辑
public void doFirst() {
//交叉业务逻辑代码
SystemService.doTx();
System.out.println("doFirst");
//交叉业务逻辑代码
SystemService.doLog();
}
//主业务逻辑
public void doSecond() {
SystemService.doTx();
System.out.println("doSecond");
SystemService.doLog();
}
}
我们发现这种实现方式有一个弊端,如果我们的bean还要继承自其他的类怎么办呢?(java不支持多继承)。现在有一种解决办法,我们把这些交叉业务逻辑代码放在配置文件中,我们的bean需要用的时候把这些交叉业务逻辑代码拿过来用即可。
在这里需要用到的技术那就是动态代理。这是因为在动态代理中我们可以在一个方法的前后进行操作。
package com.fdd.test;
public class MyTest {
public static void main(String[] args) {
final ISomeService target = new SomeServiceImpl();
ISomeService service=(ISomeService) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
//织入
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//这个方法就是切面
SystemService.doTx();
//这个方法是主业务逻辑,也就是下面执行的doFirst和doSecond
Object result=method.invoke(target, args);
//这个方法就是切面
SystemService.doLog();
System.out.println("==========");
return result;
}
});
service.doFirst();
service.doSecond();
}
}
此时我们的bean就没有交叉业务逻辑的代码了:
public class SomeServiceImpl implements ISomeService {
public void doFirst() {
System.out.println("doFirst");
}
public void doSecond() {
System.out.println("doSecond");
}
}
以上我们认识了AOP是什么。接下来正式的看一看AOP
一、简介
从上面的代码看到,AOP底层其实是采用了动态代理的方式去实现的。这采用了两种代理:JDK的动态代理与CGIB的动态代理。
比如,我们的银行业务转账,我们在真正转账的前后需要做大量的工作,比如说转账之前我们需要权限控制、日志加载、加载事务。在转账之后我们需要结束事务。这些代码量如果在我们的主业务逻辑之间,就会极大地增加代码。影响代码的可读性和程序的性能。
1、切面
切面指的是交叉业务逻辑,在上面的例子中,事务处理、日志处理就是切面。
2、织入
织入是指将交叉业务逻辑代码插入到主业务逻辑前后
3、连接点
连接点指的是交叉业务逻辑中的每一个方法
4、切入点
切入点值得是具体需要增强的主业务逻辑之间的方法
5、目标对象
需要增强的bean
6、通知
通知是切面的一种实现,可以完成简单的织入功能。
7、顾问
顾问是切面的另外一种实现方式,能够以更加复杂的方式植入到目标对象中,他其实就是把通知包装成更加复杂的装配器
二、环境搭建
1、导入jar
再导入spring的时候,使用了七个jar包。包括四个spring的jar包,还有三个与日至相关的包。我们现在在原来的基础之上再添加两个jar包。这两个jar包网上搜名字就有。
这个两个jar包是AOP联盟的规范jar包。剩下两个就是AOP的jar包
2、使用bean的约束
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">