1. 什么是AOP?
1. 面向切面编程,利用 AOP 可以对业务逻辑的哥哥部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率。
2. 在不改变原有代码的情况下,在主干功能里添加新功能。
3. 通过登录的例子
2. AOP 底层原理
1. AOP底层使用动态代理
第一种 有接口情况,使用 JDK 动态代理
创建接口实现类代理对象,增强类的方法。
第二种 没有接口情况,使用 CJLIB的动态代理
创建子类的代理对象,增强类的方法。
3. AOP (JDK 动态代理)
1. 调用 newProxyInstance 方法
方法中有三个参数:
1. ClassLoader 类加载器
2. 类<?>[] interfaces 增强方法所在类,这个类实现的接口,支持多个接口
3. InvocationHandler 实现这个接口,创建代理对象,写增强的方法。
2. JDK 动态代理代码
1. 创建 dao 对象
package com.study.modules.proxy.dao;
/**
* UserDao.
*
* @author lipw
* @since 2021/12/4 10:40
*/
public interface UserDao {
public int add (int a, int b);
public String update(String id);
}
2. 创建dao实现类
package com.study.modules.proxy.dao;
/**
* UserDaoImpl.
*
* @author lipw
* @since 2021/12/4 10:40
*/
public class UserDaoImpl implements UserDao{
@Override
public int add(int a, int b) {
return a + b;
}
@Override
public String update(String id) {
return id;
}
}
3. 使用Proxy 类创建接口代理对象
package com.study.modules.proxy;
import com.study.modules.proxy.dao.UserDao;
import com.study.modules.proxy.dao.UserDaoImpl;
import java.lang.reflect.Array;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
/**
* JDKProxy.
*
* @author lipw
* @since 2021/12/4 10:44
*/
public class JDKProxy {
public static void main(String[] args) {
// 创建接口实现类代理对象
Class [] myInterfaces = {UserDao.class};
/*Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), myInterfaces,
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
});*/
UserDaoImpl userDaoImpl = new UserDaoImpl();
UserDao dao =
(UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),
myInterfaces,
new UserDaoProxy(userDaoImpl));
int result = dao.add(1, 2);
System.out.println(result);
}
// 创建代理对象代码
static class UserDaoProxy implements InvocationHandler {
// 创建是谁的代理对象, 把谁就传递过来
private Object obj;
public UserDaoProxy(Object obj) {
this.obj = obj;
}
// 增强的逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 方法之前
System.out.println("方法之前执行……" + method.getName() + ": 传递的参数……" + Arrays.toString(args));
// 被增强的方法执行
Object res = method.invoke(obj, args);
// 方法之后
System.out.println("方法之后执行……" + obj);
return res;
}
}
}
3. AOP (术语)
1. 连接点
类里面哪些方法可以被增强,这些方法称为连接点。
2. 切入点
实际被增强的方法,称为切入点。
3. 通知(增强)
1. 实际 增强的逻辑部分被称为通知(增强)
2. 通知有多种类型
前置通知
后置通知
环绕通知
异常通知
最终通知 (finally)
4. 切面
是动作
1. 把通知应用到切入点的过程。