代理---观光代码

本文深入探讨了Spring中的AOP(面向切面编程)概念,通过动态代理增强类的方法。示例展示了如何使用Java动态代理和CGLIB实现方法拦截,开启和提交事务。代码示例包括UserService接口、实现类以及代理工厂类,最后通过测试类验证了代理功能。
摘要由CSDN通过智能技术生成
  • 动态代理

    这也是spring容器中aop概念的原理,aop意为面向切面编程,同时也是oop的衍生和扩展,主要是增强一个类中的方法。接下来直接上代码,观光即可。。。。。。。。。。

    被代理对象必须使用接口

    package com.userservice;
    
    
    public interface UserService {
      public void insert();
      public void delete();
      public void update();
      public void select();
    }
    
    
    

    被代理对象的实现类

    package com.userserviceimpl;
    
    
    import com.userservice.UserService;
    
    
    public class UserServiceImpl implements UserService {
    
    
      @Override
      public void insert() {
        System.out.println("这是添加方法");
        
      }
    
    
      @Override
      public void delete() {
        System.out.println("这是删除方法");
        
      }
    
    
      @Override
      public void update() {
        System.out.println("这是修改方法");
        
      }
    
    
      @Override
      public void select() {
        System.out.println("这是查询方法");
        
      }
    
    
    }
    
    
    
    
    

    实现一个代理类

    通过Proxy.newProxyInstance实现一个代理对象,最终返回出去,腹泻该类中的invoke方法作为一个增强方法,然后调用.invoke调用该方法即可。

    package com.userserviceproxyfacory;
    
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    
    import com.userservice.UserService;
    import com.userserviceimpl.UserServiceImpl;
    
    
    public class UserServiceProxyFacory implements InvocationHandler{
    
    
      private UserService us;
      //将代理对象传进来
      public UserServiceProxyFacory(UserService us) {
        super();
        this.us = us;
      }
    
    
      public UserService getUserService(){
        //生成动态代理
        UserService usProxy = (UserService)Proxy.newProxyInstance(UserServiceProxyFacory.class.getClassLoader(), 
            UserServiceImpl.class.getInterfaces(), 
            this);
        //返回对象
        return usProxy;
      }
    
    
      /**
       * Object proxy:当前代理对象
       * Method method:当前执行的方法
       * Object[] args:当前方法执行的参数
       */
      @Override
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("打开事务");
        //业务方法的执行
        Object invoke = method.invoke(us, args);
        System.out.println("提交事务");
        return invoke ;
      }
    }
    
    
    
    
    
    
    

    写一个DemoTest进行测试

    package com.test;
    
    
    import org.junit.Test;
    
    
    import com.userservice.UserService;
    import com.userserviceimpl.UserServiceImpl;
    import com.userserviceproxyfacory.UserServiceProxyFacory;
    
    
    public class Demo {
    
    
      @Test
      public void fun(){
        //被代理对象
        UserService us = new UserServiceImpl();
        //将被代理对象传入代理类中
        UserServiceProxyFacory facory=new UserServiceProxyFacory(us);
        //调用方法返回代理对象
        UserService usProxy = facory.getUserService();
        usProxy.delete();
      }
    }
    
    
    

    最终结果如下

  • CGLIB代理

    此代理是一个第三方代理,同时也是一个继承代理,即代理对象继承了被代理对象。

    被代理对象和动态代理一致,这里不再写出。

    package com.userserviceproxyfacory;
    
    
    import java.lang.reflect.Method;
    
    
    import org.springframework.cglib.proxy.Enhancer;
    import org.springframework.cglib.proxy.MethodInterceptor;
    import org.springframework.cglib.proxy.MethodProxy;
    
    
    import com.userservice.UserService;
    import com.userserviceimpl.UserServiceImpl;
    
    
    public class UserServiceProxyFacory2 implements MethodInterceptor{
    
    
    
    
      public UserService getUserService(){
        //生成动态代理
        Enhancer enhancer = new Enhancer();//创建CJLIB核心类
        enhancer.setSuperclass(UserServiceImpl.class);//设置父类,也就是被代理对象
        enhancer.setCallback(this);//设置要做的事情
        UserService us = (UserService)enhancer.create();//生成代理
        //返回代理对象
        return us;
      }
    
    
      /*
       * 使用此方法增强
       */
      @Override
      public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
        System.out.println("开启事务");
        Object invokeSuper = arg3.invokeSuper(arg0, arg2);
        System.out.println("提交事务");
        return invokeSuper;
      }
    }
    
    
    
    @Test
      public void fun1(){
        UserServiceProxyFacory2 facory=new UserServiceProxyFacory2();
        UserService userService = facory.getUserService();
        userService.insert();
      }
      
    

    结果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值