当bean对象是采用实现接口的方式,一般采用Proxy方式实现AOP功能,当bean对象不是采用实现接口的方式,一般采用CGLIB方式实现AOP功能
AOP实现方式之CGLIB实现AOP功能
方式的实现神马的还是上代码更容易理解
CGlibProxyFactory.java
package liuyanxi.aop;
import java.lang.reflect.Method;
import liuyanxi.service.impl.PersonServiceBean;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CGlibProxyFactory implements MethodInterceptor{
private Object targetObject;
public Object createProxyIntance(Object targetObject){
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());//非final
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
PersonServiceBean bean = (PersonServiceBean) this.targetObject;
Object result = null;
if(bean.getUser()!=null){
result = methodProxy.invoke(targetObject, args);
}
return result;
}
}
完成的project代码剩余部分请参考上一篇博文:AOP之Proxy实现AOP功能
Proxy方式和CGLIB方式主要的区别还是createProxyIntance方法的实现不同,以及proxy方式应用在bean类实现接口,cglib方式应用在bean类非实现接口