CGLib与java标准库提供的实现方案不同,
cglib主要是基于实现类(如StudentInfoServiceImpl.java)扩展一个子类 来实现。与Dynamic Proxy中的Proxy和InvocationHandler相对应,net.sf.
cglib.proxy.Enhancer和 MethodInterceptor在
CGLib中负责完成代理对象创建和方法截获处理,产生的是目标类的子类而不是通过接口来实现方法拦截的, Enhancer主要是用于构造动态代理子类来实现拦截,MethodInterceptor(扩展了Callback接口)主要用于实现around advice(AOP中的概念):
1)我们的业务处理(StudentInfoServiceImpl.java):
public class StudentInfoServiceImpl{
public void findInfo(String name){
System.out.println("你目前输入的名字是:"+name);
}
}
2)实行一个工具来处理日志功能(AOPInstrumenter.java):
import net.sf.
cglib.proxy.MethodInterceptor;
import net.sf.
cglib.proxy.Enhancer;
import net.sf.
cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
import org.apache.log4j.Logger;
public class AOPInstrumenter implements MethodInterceptor{
private Logger log=Logger.getLogger(AOPInstrumenter.class);
private Enhancer enhancer=new Enhancer();
public Object getInstrumentedClass(Class clz){
enhancer.setSuperclass(clz);
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) throws Throwable{
log.info("调用日志方法"+method.getName());
Object result=proxy.invokeSuper(o,args);
return result;
}
}
3)我们来测试一下(AOPTest.java):
public class AOPTest{
public static void main(String[] args){
AOPInstrumenter instrumenter=new AOPInstrumenter();
StudentInfoServiceImpl studentInfo=(StudentInfoServiceImpl)instrumenter.getInstrumentedClass(StudentInfoServiceImpl.class);
studentInfo.findInfo("阿飞");
}
}
输出结果与以上相同。
CGLib中为实现以上目的,主要提供的类
1)Enhancer:setCallback(Callback) ,setSuperclass(Class) ,create()返回动态子类Object
2)MethodInterceptor必须实现的接口:intercept(Object,Method,Object[],MethodProxy)返回的是原方法调用的结果。和Proxy原理一样
分享到:
相关推荐
NULL 博文链接:https://coolszy.iteye.com/blog/540457
Spring AOP实现方法之一:CGLIB 实现AOP功能
使用JDK中的Proxy技术实现AOP功能与使用CGLIB实现AOP功能
AOP-CGLIB学习-实现简单的注解权限系统
Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现.doc
基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)...
静态代理--不适合企业开发,适合初学者理解代理。 jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口...spring 的AOP功能中 会根据目标类是否实现了接口来判断使用 jdk Proxy还是cglib
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 如何强制使用CGLIB实现AOP? * 添加CGLIB库,SPRING_HOME/...
主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 ...6. CGLIB aop-config 7. AOP动态代理配置 8. AOP自动识别动态代理配置
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.net.sf.cglib-2.2.0.jar
spring-aop spring-beans spring-context spring-core spring-dao spring-hibernate3 spring-ibatis spring-jdbc spring-jdo spring-jpa-2.0-m2 spring-struts spring-web spring-webmvc sqljdbc struts velocity-...
JavaEE CGLIB字节码增强方式实现AOP编程
cglib代理 实现AOP 。java动态代理 cglib-nodep-3.3.0.jar最新包免费下载,
AOP、CGLIB
AOP之JDK动态代理和CGLib动态代理 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45195383
如果想使用CGLIB的技术来生成代理对象,那么需要引入CGLIB的开发的jar包,在Spring框架核心包中已经引入了CGLIB的开发包了。所以直接引入Spring核心开发包即可!
spring aop 编程,cglib ,切面编程
aop 相关jar包(aopalliance-1.0.jar,aspectjweaver-1.6.9.jar,cglib-2.2.jar)
springMVC springframework cglib asm aspectjtl aspectjweaver aopalliance common-logging等一些必要jar包
最流行的OR Mapping工具hibernate也使用CGLIB来代理单端single-ended(多对一和一对一)关联(对集合的延迟抓取,是采用其他机制实现的)。EasyMock和jMock是通过使用模仿(mock)对象来测试java代码的包。它们都通过...