AOP常用有SpringAOP和AspectJ,其中SpringAOP有JDK动态代理和CGLIB代理,这里记录一下学习记录。
首先创建一个接口IDao:
public interface IDao {
void insert();
}
然后实现这个接口:
public class DaoImpl implements IDao {
@Override
public void insert() {
System.out.println("开始执行插入语句!");
}
}
创建一个切面类MyAspect对方法进行增强操作,这里暂时只输出语句:
(@Component注解的作用是把普通pojo实例化到spring容器中,相当于配置文件中的 详细来源:https://blog.youkuaiyun.com/weixin_37848710/article/details/79609130)
@Component
public class MyAspect {
public void checkPermission(){
System.out.println("检查权限");
}
public void log(){
System.out.println("记录日志");
}
}
创建一个代理类JdkDynamicProxy,它的creatrProxy方法用于传入一个需要代理的目标,执行切面类的操作后,封装返回新的同类型目标:
public class JdkDynamicProxy implements InvocationHandler {
private IDao jdkDynamicProxy;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
MyAspect myAspect=new MyAspect();
//前增强例子:检查权限
myAspect.checkPermission();
Object obj=method.invoke(jdkDynamicProxy,args);
//后增强例子:记录日志
myAspect.log();
return obj;
}
public Object createProxy(IDao jdkDynamicProxy){
//传进来一个需要代理的对象,对其进行权限检查和日志记录
//赋值
this.jdkDynamicProxy=jdkDynamicProxy;
//类加载器
ClassLoader classLoader=JdkDynamicProxy.class.getClassLoader();
//被代理对象实现的所有接口
Class[] classes=jdkDynamicProxy.getClass().getInterfaces();
//返回处理后的对象
return Proxy.newProxyInstance(classLoader,classes,this);
}
}
最后是我们的测试类:
public class TestJdkDynamicProxy {
@Test
public void test(){
//创建代理对象
JdkDynamicProxy JDP=new JdkDynamicProxy();
//创建目标对象
IDao dao=new DaoImpl();
/*接口=new 实现类*/
//从代理对象中获取增强后的目标对象
IDao dao1=(IDao) JDP.createProxy(dao);
//现在只要执行增强后的对象方法,就会有增强效果,即权限检查和日志记录
dao1.insert();
}
}
整个流程大概是:测试类创建一个代理对象JDP,创建一个Dao对象,把Dao传给JDP里面的createProxy方法,返回一个新的Dao对象保存在Dao1,执行Dao1的insert()方法时进行代理操作,控制台输出: