随笔-95  评论-31  文章-10  trackbacks-0
代理模式(静态): 一个接口,两个实现类A(代理类)和B(业务类),A类持有B类,这两个类方法相同,那么A类方法内部调用B类的方法,就可以在B类核心业务前后进行前置处理、后置处理,异常环绕处理等等。

Jdk动态代理要求必须有接口I和实现类B(业务类),那么通过jdk动态代理生成的类就是类A(代理类),上面代理模式是静态代理,这里就是动态代理,代码运行时候会生成一个代理类。
Cglib动态代理不要求有接口I只需要一个核心业务类B,那么通过cglib动态代理生成的类就是类A(代理类), 同上。

JDK动态代理示例:
public static void main(String[] args) {    
        
//核心业务类B
        IBooService B = new BooServiceImpl();
        
//生成的代理类A
        Object A = Proxy.newProxyInstance(IBooService.class.getClassLoader(), new Class[]{IBooService.class}, new InvocationHandler() {
            @Override
            
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                
//代理类方法的通用处理逻辑
                System.out.println("开始事物");
                
//调用核心业务类B的方法
                ReflectionUtils.invokeMethod(method, B, args);    
                System.out.println(
"提交事物");
                
return method.getName();
            }
        });
        
//调用代理类A方法
        IBooService bs = (IBooService)A;
        bs.check();
    }
输出结果:
开始事物
2018-08-16 10:30:44.161 [main] INFO  com.tx.test.service.impl.BooServiceImpl - check()
提交事物

Cglib动态代理示例:
Enhancer enhancer = new Enhancer();
        
//设置业务类B
        enhancer.setSuperclass(FooServiceImpl.class);
        
//设置回调
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            
public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                Long bTime 
= System.currentTimeMillis();
                System.out.println(
"开始毫秒:"+ bTime);
                
//调用业务类B方法
                proxy.invokeSuper(object, args);
                Long eTime 
= System.currentTimeMillis();
                System.out.println(
"结束毫秒:"+ bTime);
                Long mills 
= eTime - bTime;
                System.out.println(
"毫秒:"+ mills);
                
return mills;
            }
        });
        
//生成代理类A
        Object A = enhancer.create();
        IFooService fs1 
= (FooServiceImpl) A;
        
//调用代理A方法
        fs1.check();
运行结果:
开始毫秒:1534387476396
2018-08-16 10:44:36.403 [main] INFO  com.tx.test.service.impl.FooServiceImpl - check()
结束毫秒:
1534387476396
毫秒:
7
完!
posted on 2018-08-16 10:46 朔望魔刃 阅读(196) 评论(0)  编辑  收藏 所属分类: java

只有注册用户登录后才能发表评论。


网站导航: