AOP的概述
1. 什么是AOP的技术?自我解读:其实代理的本质是,通过生一个代理对象。然后,访问代理对象,代理对象去决定目标对象的执行。
1. 使用Proxy类来生成代理对象的一些代码如下:
/**
* 使用JDK的方式生成代理对象
*/
public class MyProxyUtils {
public static UserDao getProxy(final UserDao dao) {
// 使用Proxy类生成代理对象
UserDao proxy = (UserDao) Proxy.newProxyInstance(dao.getClass().getClassLoader(),
dao.getClass().getInterfaces(), new InvocationHandler() {
// 代理对象方法一直线,invoke方法就会执行一次
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ("save".equals(method.getName())) {
System.out.println("记录日志...");
// 开启事务
}
// 提交事务
// 让dao类的save或者update方法正常的执行下去
return method.invoke(dao, args);
}
});
// 返回代理对象
return proxy;
}
}
基于JDK的动态代理
2. 编写相关的代码
public class MyCglibUtils {
/**
* 使用CGLIB方式生成代理的对象
*/
// 生成子类,用父类来接收
public static BookDaoImpl getProxy() {
Enhancer enhancer = new Enhancer();
// 设置父类。因为cglib就是要生成子类嘛
enhancer.setSuperclass(BookDaoImpl.class);
// 设置回调函数
enhancer.setCallback(new org.springframework.cglib.proxy.MethodInterceptor() {
// 代理对象的方法执行,回调函数就会执行
// 注意:methodProxy是对前面的参数method,底层生成了一个代理对象
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy)
throws Throwable {
if (method.getName().equals("save")) {
System.out.println("记录日志...");
}
// 正常执行
return methodProxy.invokeSuper(obj, args);
}
});
// 生成代理对象
BookDaoImpl proxy = (BookDaoImpl) enhancer.create();
return proxy;
}
}
如果,你写程序,提供了接口,spring就选择jdk动态代理。如果没有提供接口,spring就选择cglib。