JDK实现动态代理需要代理类实现接口,这导致在使用中有很大的局限性,毕竟不是所有类都需要实现接口。而cglib通过继承的方式动态产生代理类,cglib是动态代理框架,功能很强大。
改造上节中的日志代理:
/**
* cglib的处理器
*
*/
public class LogProxyCglib implements MethodInterceptor {
private Object target;
public Object newProxyInstance(Object target) {
this.target = target;
//增强类
Enhancer enhancer = new Enhancer();
//代理类父类,通过继承的方式
enhancer.setSuperclass(this.target.getClass());
//多个拦截器 NoOp.INSTANCE 是 CGlib 所提供的实际是一个没有任何操作的拦截器,他们是有序的
enhancer.setCallbacks(new Callback[]{this,NoOp.INSTANCE});
//添加过滤器,最执行的方法进行过滤
enhancer.setCallbackFilter(new LogProxyFilter());
// 创建代理对象
return enhancer.create();
}
//扩展模块
private void before(String name){
System.out.println(name+"方法执行开始!");
}
//扩展模块
private void after(String name){
System.out.println(name+"方法执行结束!");
}
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
before(method.getName());
proxy.invokeSuper(obj, args);
after(method.getName());
return null;
}
}
/**
* 日志代理过滤器:查询方法不需要记录日志
*
*/
public class LogProxyFilter implements CallbackFilter{
public int accept(Method method) {
//返回值是拦截器的索引。如果是query则使用第二个拦截器,即不进行处理
if("query".equalsIgnoreCase(method.getName()))
return 1;
return 0;
}
}
public static void main(String[] args) {
//Service service = (Service)(new LogProxyHandler()).newProxyInstance(new UserServiceImpl());
Service service=(Service)(new LogProxyCglib()).newProxyInstance(new UserServiceImpl());
service.add();
service.query();
}
运行结果:只对add()进行前后处理
参考:http://blog.csdn.net/qq_25689397/article/details/51427164
http://www.cnblogs.com/cruze/p/3865180.html#lable3