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
生成代理对象
.