cglib动态代理与jdk代理的区别:
首先要把导入工作环境中
//日志类:
public class Logger implements interceptor{
@Override
public void interceptor() {
System.out.println("logging");
}
}
//权限类
public class Privilege implements interceptor {
@Override
public void interceptor() {
System.out.println("privilege");
}
}
//安全框架类
public class SecurityAssist implements interceptor {
@Override
public void interceptor() {
System.out.println("i am security assist");
}
}
//目标类
public class showSalaryImpl{
public void showSalary() {
System.out.println("show salary");
}
}
/**
* 拦截器类,与jdk动态代理不一样的是,这里实现的时methodInterceptor接口。
* 而jdk的是invocationHandler接口
*/
public class showSalaryInterceptor implements MethodInterceptor {
//导入目标类
private Object target;
//导入切面
private List<interceptor> interceptors;
//用构造函数方法给它们赋值
public showSalaryInterceptor(Object target,List<interceptor> interceptors) {
this.target = target;
this.interceptors=interceptors;
}
/**
* 这个就是相对于jdk的invoke方法
* argo-2跟jdk的invoke的前三个参数一样
* arg3是新增的,有查看方法名称等功能
*/
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {
//先运行完拦截器里面的内容再操作
for(interceptor interceptor1:interceptors){
interceptor1.interceptor();
}
arg1.invoke(this.target, arg2);
return null;
}
/**获取代理对象。。固定写法
* 这个方法也可以写在客户端上,
* @return
*/
public Object getProxy(){
Enhancer enhancer=new Enhancer();
enhancer.setCallback(this);
enhancer.setSuperclass(this.target.getClass());
return enhancer.create();
}
}
//测试类:
public class testCGlib {
@Test
public void testCGLIB(){
//新建切面对象
Logger logger=new Logger();
Privilege privilege=new Privilege();
SecurityAssist assist=new SecurityAssist();
//把切面对象加到集合众
List<interceptor> interceptors=new ArrayList<interceptor>();
interceptors.add(logger);
interceptors.add(privilege);
interceptors.add(assist);
//新建目标类对象
Object target=new showSalaryImpl();
//新建拦截器对象
showSalaryInterceptor interceptor=new showSalaryInterceptor(target,interceptors);
//新建代理对象
showSalaryImpl showSalary=(showSalaryImpl) interceptor.getProxy();
//操作
showSalary.showSalary();
}
}
运行结果: