AOP:面向切面编程,不修改源代码进行功能增强
步骤:
- 接口
package com.atguigu.spring5;
public interface UserDao {
public int add(int a,int b);
public String update(String id);
}
- 实现类实现接口
package com.atguigu.spring5;
public class UserDaoImpl implements UserDao {
@Override
public int add(int a, int b) {
System.out.println("add方法执行了。。。。。。。。。。。。。。。。。。。。。。。。。。");
return a+b;
}
@Override
public String update(String id) {
System.out.println("update方法执行了。。。。。。。。。。。。。。。。。");
return id;
}
}
- JDK动态代理实现增强
package com.atguigu.spring5;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
public class JDKProxy {
public static void main(String[] args) {
// 创建接口实现类的代理对象
// 接口是class数组类型
Class[] interfaces = {UserDao.class};
// 创建接口的实现类加载器
// Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interface,new InvocationHandler(){
// @Override
// public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// return null;
// }
// });
UserDaoImpl userDao = new UserDaoImpl();
// newProxyInstance 返回指定接口的代理类的实例,该接口讲方法调用分派给指定的调用处理程序
UserDao dao = (UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interfaces,new UserDaoProxy(userDao));
int result = dao.add(1,2);
System.out.println("result:"+result);
}
}
//创建代理对象代码
class UserDaoProxy implements InvocationHandler{
// 1把创建的是谁的代理对象,把谁传递过来
// 有参构造传递
private Object obj;
public UserDaoProxy(Object obj){ //UserDaoImpl userDao---->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;
}
}