
Spring框架一般是基于AspectJ实现AOP操作
基于注解方式实现(使用)
切入点表达式
可以对相同的切入点表达式做一个抽取
如果有多个增强类对同一个方法进行增强,设置增强类优先级
注意:需要在启动类上增加@EnableAspectJAutoProxy注解
//java.lang.reflect.Proxy#newProxyInstance
newProxyInstance(ClassLoader loader,Class>[] interfaces,InvocationHandler h)
参数介绍
1.loader 类加载器
2.interfaces 增强方法所在的类,这个类实现的接口,支持多个接口
3.invocationHandler 实现这个接口InvocationHandler,创建代理对象,写增强的方法
代码演示
public interface UserDao {
public int add(int a, int b);
public String update(String id);
}
public class UserDaoImpl implements UserDao {
@Override
public int add(int a, int b) {
return a + b;
}
@Override
public String update(String id) {
return 1+"";
}
}
public class CustomInvocationHandlerCGLB代理implements InvocationHandler { //1. 把创建的是谁的代理对象,把谁传递进来 private T t; public CustomInvocationHandler(T t) { this.t = t; } //增强的luo'ji @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //方法之前 System.out.println("方法执行之前..."+method.getName()+":传递的参数:"+ Arrays.toString(args)); //被增强的方法 Object result = method.invoke(t, args); //方法之后 System.out.println("方法执行之后..." + result); return result; } } public class JDKProxy { public static void main(String[] args) { Class[] interfaces = new Class[]{UserDao.class}; UserDaoImpl userDao = new UserDaoImpl(); //返回代理对象 UserDao proxyInstance = (UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new CustomInvocationHandler(userDao)); int add = proxyInstance.add(1, 2); System.out.println("=========>" + add); } }