ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Cglib动态代理,拦截器,过滤器

2020-12-21 16:01:23  阅读:184  来源: 互联网

标签:事务 拦截器 arg0 Object Cglib 过滤器 new public



单个拦截器(setCallback)、多个拦截器(setCallbacks)、过滤器(setCallbackFilter)、简单例子


 

单个拦截器(setCallback)

拦截器实现MethodInterceptor重写interceptor方法,实现代理目标类的目标方法的拦截。

en.setCallback(new MethodInterceptor() {
            
            @Override
            public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
                return arg3.invokeSuper(arg0, arg2);
            }
        });

 也可设置多个拦截器(setCallbacks)

设置多个拦截器,可通过过滤器(CallbackFilter)返回的多个拦截器的数组下标值(int),确定使用哪个拦截器。

TestTranscation tProxy = new TestTranscation();
en.setCallbacks(new Callback[]{tProxy,new MethodInterceptor() { @Override public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable { System.out.println("没有事务的拦截器"); return arg3.invokeSuper(arg0, arg2); } }});
tProxy是另一个单个拦截器
/* 事务拦截器类 */
class TestTranscation implements MethodInterceptor{
    @Override
    public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
        System.out.println("加上事务的拦截器");
        return arg3.invokeSuper(arg0, arg2);
    }
}

之后可以通过过滤器(setCallbackFilter)筛选拦截器。

过滤器(setCallbackFilter)

这里通过判断方法的注解来筛选拦截器:

/**
 * 设置过滤器,过滤器实现CallbackFilter接口重写accept方法
 * 通过accept方法返回的int下标,用于指定调用哪个拦截器进行拦截处理。
 */
en.setCallbackFilter(new CallbackFilter() {
    
    /* 通过判断拦截的方法上是否有事务注解,从而选择是否需要事务 */
    @Override
    public int accept(Method arg0) {
        TestTransaction annotation = arg0.getAnnotation(TestTransaction.class);
        if(annotation == null){
            return 1;//不是事务拦截器
        }
        return 0;//使用事务拦截器
    }
});

完整例子

代理目标

class GTL{
    public void ydy(){
        System.out.println("没有事务注解的方法被执行");
    }
    @TestTransaction(name = "transactionAnno")
    public void dcq(){
        System.out.println("加上事务注解的方法被执行");
    }
}

事务注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface TestTransaction {
    String name();
}

cglib代理

public class TestCglibDemo {
    public static void main(String[] args) {
        final GTL gtl = new GTL();
        Enhancer en = new Enhancer();
        en.setSuperclass(gtl.getClass());
        /**
         * 设置拦截器,拦截器实现MethodInterceptor重写interceptor方法
         * 实现对代理目标类的方法拦截
         * 
         * 也可以设置多个拦截器     en.setCallbacks(new Callback[]{MethodInterceptor1 ...});
         * 通过过滤器返回的int下标选择调用哪个拦截器对代理目标方法进行处理。
         * 
         */

        // 多个拦截器
        TestTranscation tProxy = new TestTranscation();
        en.setCallbacks(new Callback[]{tProxy,new MethodInterceptor() {
            
            @Override
            public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
                System.out.println("没有事务的    拦截器");
                return arg3.invokeSuper(arg0, arg2);
            }
        }});
        /**
         * 设置过滤器,过滤器实现CallbackFilter接口重写accept方法
         * 通过accept方法返回的int下标,用于指定调用哪个拦截器进行拦截处理。
         */
        en.setCallbackFilter(new CallbackFilter() {
            
            /* 通过判断拦截的方法上是否有事务注解,从而选择是否需要事务 */
            @Override
            public int accept(Method arg0) {
                TestTransaction annotation = arg0.getAnnotation(TestTransaction.class);
                if(annotation == null){
                    return 1;//不是事务拦截器
                }
                return 0;//使用事务拦截器
            }
        });
        
        GTL proxy = (GTL)en.create();
        proxy.ydy();
        proxy.dcq();
    }
}

class GTL{
    public void ydy(){
        System.out.println("没有事务注解的方法被执行");
    }
    @TestTransaction(name = "transactionAnno")
    public void dcq(){
        System.out.println("加上事务注解的方法被执行");
    }
}

运行结果

没有事务的拦截器
没有事务注解的方法被执行
加上事务的拦截器
加上事务注解的方法被执行

 

 


标签:事务,拦截器,arg0,Object,Cglib,过滤器,new,public
来源: https://www.cnblogs.com/wyzbky/p/14168346.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有