基于jdk动态代理。cglib代理

 

public class UserServiceFactory1 {
    //被代理对象
    private static UserServiceImpl us = new UserServiceImpl();
    
    //获得UserService代理对象
    public static UserService getUserServiceProxy(){
        //动态代理
        //参数1: 类加载器,加载代理类 => 应用类加载器
        //参数2: 指定代理类实现哪个接口
        //参数3: 告诉虚拟机,我们在代理类中想要做什么
        return (UserService) Proxy.newProxyInstance(UserServiceFactory1.class.getClassLoader(), 
                                        new Class[]{UserService.class}, 
                                        new InvocationHandler() {
                                            
                                            @Override
                                            //参数1: 代理对象(没啥用)
                                            //参数2: 当前增强的业务方法
                                            //参数3: 当前业务方法参数
                                            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                                                //如果是find方法,不增强
                                                if(method.getName().equals("find")){
                                                    return method.invoke(us, args);
                                                }
                                                
                                                //增强的代码
                                                System.out.println("开启事务");
                                                //调用原有业务代码
                                                Object invoke = method.invoke(us, args);
                                                //增强的代码
                                                System.out.println("关闭事务");
                                                
                                                //代理方法的返回值与原有业务方法返回值一致
                                                return invoke;
                                            }
                                        });
    }
    
}
 


 

public class UserServiceFactory2 {
    
    //获得UserService代理对象
    public static UserServiceImpl getUserServiceProxy(){
        //cglid代理核心对象
        Enhancer en = new Enhancer();
        
        //指定被代理类(去继承)
        en.setSuperclass(UserServiceImpl.class);
        
        //指定代理类中方法的代码
        en.setCallback(new MethodInterceptor(){

            @Override
            //参数1:代理对象
            //参数2:当前业务方法
            //参数3:业务方法参数
            //参数4:代理方法
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                System.out.println("开启事务~~~~");
                //通过代理方法调用父类方法  =>  super.业务方法()
                Object object = methodProxy.invokeSuper(proxy, args);
                System.out.println("关闭事务~~~~");
                return object;
            }});
        
        
        return (UserServiceImpl) en.create();
    }
    
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值