spring的aop代理

 AOP 的底层实现
1.1.1 JDK 动态代理 :
public class JDKProxy implements InvocationHandler {
//定义实现代理的接口
private UserDao userDao;
public JDKProxy(UserDao userDao) {
super();
this.userDao = userDao;
}
//创建代理接口的对象
public UserDao crateProxy() {
UserDao proxy=(UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), this);
return proxy;
}
@Override
//调用目标对象的任何一个方法都相当于调用invoke()方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
//设置增强对象中要被增强的方法
if("delete".equals(method.getName())) {
System.out.println("日志增强===============");
Object result=method.invoke(userDao, args);
return result;
}
return method.invoke(userDao, args);
}
1.1.2 CGLIB 动态代理 :
CGLIB(Code Generation Library) 是一个开源项目!是一个强大的,高性能,高质量的 Code 生成类库,它可以在运行期扩展 Java 类与实现 Java 接口。 Hibernate 支持它来实现 PO(Persistent Object 持久化对象 ) 字节码的动态生成
Hibernate 生成持久化类的 javassist.
CGLIB 生成代理机制 : 其实生成了一个真实对象的子类 .
 
下载 cglib jar .
* 现在做 cglib 的开发 , 可以不用直接引入 cglib 的包 . 已经在 spring 的核心中集成 cglib.
 
public class CGLibProxy implements MethodInterceptor {
//定义被代理的对象
private UserDao userDao;

public CGLibProxy(UserDao userDao) {
super();
this.userDao = userDao;
}

public UserDao crtaeProxy() {
//使用CGLib生成代理
//创建核心类
Enhancer enhancer=new Enhancer();
//为其设置父类
enhancer.setSuperclass(userDao.getClass());
//设置回调
enhancer.setCallback(this);
//设置代理
return (UserDao) enhancer.create();
}
@Override
public Object intercept(Object proxy, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
// TODO Auto-generated method stub
//设置对立对象被增强的属性
if("update".equals(method.getName())) {
System.out.println("增强代理------------");
Object result=methodProxy.invokeSuper(proxy, objects);
return result;
}
return methodProxy.invokeSuper(proxy, objects);
}
结论 :Spring 框架 , 如果类实现了接口 , 就使用 JDK 的动态代理生成代理对象 , 如果这个类没有实现任何接口 , 使用 CGLIB 生成代理对象 .


猜你喜欢

转载自blog.csdn.net/qq_40036979/article/details/80214935
今日推荐