什么是AOP?
1.面向切面编程
2.不通过修改源代码的方式,在原始的功能模块里添加新的功能
3.目的是降低代码之间的耦合度,提高程序的复用性
AOP的底层
1.使用动态代理方式
- 有接口的情况,使用JDK动态代理
(1)重新创建接口实现类的代理对象
(2)使用Proxy类的newProxyInstance方法返回一个指定接口的代理类实例
方法有三个参数:
1.类加载器
2.增强方法所在的类,这个类实现的接口
3.实现接口InvocationHandler,创建代理的对象,写增强的方法
(2)增强类的方法
package cn.bob.dao;
/**
* @Created: IDEA.2019
* @Author:Bob
* @Date: 2022/08/18/16:56
*/
public interface UserDao {
void add();
int sum(int a,int b);
}
package cn.bob.dao.impl;
import cn.bob.dao.UserDao;
/**
* @Created: IDEA.2019
* @Author:Bob
* @Date: 2022/08/18/16:56
*/
public class UserDaoImpl implements UserDao {
@Override
public void add() {
System.out.println("userDao-----add");
}
@Override
public int sum(int a, int b) {
System.out.println("userDao-----sum");
return a+b;
}
}
package cn.bob.dao.impl;
import cn.bob.dao.UserDao;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @Created: IDEA.2019
* @Author:Bob
* @Date: 2022/08/18/19:41
*/
public class UserDaoJDKProxy {
public static void main(String[] args) {
Class[] interfaces = {UserDao.class};
UserDaoImpl userDao = new UserDaoImpl();
//创建代理对象
UserDao o = (UserDao) Proxy.newProxyInstance(
UserDaoJDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
o.add();
int sum = o.sum(1, 2);
System.out.println("sum:"+sum);
}
}
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("方法之前执行");
//书写增强的逻辑代码
Object invoke = method.invoke(obj, args);
//方法之后执行
System.out.println("方法之后执行");
return invoke;
}
}