spring cglib 与 jdk 动态代理
1.概述
JDK动态代理是利用java反射机制生成一个实现接口的匿名类,在调用具体方法前调用InvocationHandler来处理
Cglib动态代理是利用asm开源包把被代理类的class文件加载进来通过修改其字节码生成子类来处理
如果目标对象实现了接口那么默认使用jdk代理(可以强制使用cglib代理)
如果没有实现接口必须使用cglib代理
强制使用cglib代理需要
*引入cglibjar包
*配置spring
cglib因为是动态生成被代理类的子类并覆盖被代理类的方法来实现的所以被代理方法不要使用final修饰
2.代码示例
2.1cglib代理类
packagecom.rocky.spring;
importjava.lang.reflect.Method;
importnet.sf.cglib.proxy.Enhancer;
importnet.sf.cglib.proxy.MethodInterceptor;
importnet.sf.cglib.proxy.MethodProxy;
publicclassCglibProxy{
publicstaticvoidmain(String[]args){
finalUserServiceservice=newUserService();
Enhancerhancer=newEnhancer();
hancer.setSuperclass(service.getClass());
hancer.setCallback(newMethodInterceptor(){
@Override
publicObjectintercept(Objectproxy,Methodmethod,Object[]arg2,
MethodProxyarg3)throwsThrowable{
System.out.println("增强前...Cglib");
Objectinvoke=method.invoke(service,arg2);
System.out.println("增强后...Cglib");
returninvoke;
}});
UserServiceuserService=(UserService)hancer.create();
userService.sayHello();
}
}
//需要引入cglib-2.2.jar和org.objectweb.asm-3.3.1.jar
//输出
//增强前...Cglib
//thisuserServiceworks....
//增强后...Cglib
被代理类UserService
packagecom.rocky.spring;
publicclassUserService{
publicvoidsayHello(){
System.out.println("thisuserServiceworks....");
}
}
2.2jdk代理接口
packagecom.rocky.spring;
importjava.lang.reflect.InvocationHandler;
importjava.lang.reflect.Method;
importjava.lang.reflect.Proxy;
publicclassJdkProxy{
publicstaticvoidmain(String[]args){
finalActorServiceservice=newActorServiceImpl();
ActorServiceactorService=(ActorService)Proxy.newProxyInstance(
service.getClass().getClassLoader(),service.getClass()
.getInterfaces(),newInvocationHandler(){
@Override
publicObjectinvoke(Objectproxy,Methodmethod,
Object[]args)throwsThrowable{
System.out.println("增强前...jdk");
Objectinvoke=method.invoke(service,args);
System.out.println("增强后...jdk");
returninvoke;
}
});
actorService.sayHi();
}
}
//增强前...jdk
//Honestly,Idothework.
//增强后...jdk
被代理接口及实现类
packagecom.rocky.spring;
publicinterfaceActorService{
publicvoidsayHi();
}
-----------------
packagecom.rocky.spring;
publicclassActorServiceImplimplementsActorService{
@Override
publicvoidsayHi(){
doSomething();
}
privatevoiddoSomething(){
System.out.println("Honestly,Idothework.");
}
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!