您现在的位置是:主页 > Web前端技术 > Web前端技术

Java Spring AOP该怎么理解开发技术

IDCBT2022-01-05服务器技术人已围观

简介这篇文章给大家介绍JavaSpringAOP该怎么理解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 前言 面向切面编程,利用 AOP 可以对业务逻辑的各个部分进行隔离

这篇文章给大家介绍Java Spring AOP该怎么理解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

      前言

      面向切面编程,利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
      即不改变源代码而添加新功能,可插拔的.

      提示:以下是本篇文章正文内容,下面案例可供参考

      一.AOP底层原理1.AOP底层使用动态代理

      有接口:jdk动态代理,即创建接口实现类代理对象

      无接口:CGLIB动态代理,即创建子类代理对象

      jdk动态代理的实现

      创建接口

      package com.vector.spring5;
      
      public interface UserDao {
          public int add(int a,int b);
          public String update(String id);
      }

      接口实现类

      接口实现类的方法,属于源代码,用aop思想增添新功能时这里不能动!

      package com.vector.spring5;
      
      public class UserDaoImpl implements UserDao{
      
          @Override
          public int add(int a, int b) {
              return a+b;
          }
      
          @Override
          public String update(String id) {
              return id;
          }
      }

      使用JDK动态代理对象,增添新功能

      package com.vector.spring5;
      
      import java.lang.reflect.Array;
      import java.lang.reflect.InvocationHandler;
      import java.lang.reflect.Method;
      import java.lang.reflect.Proxy;
      import java.util.Arrays;
      
      public class JDKProxy {
          public static void main(String[] args) {
              //创建接口实现类代理对象
              Class[] interfaces = {UserDao.class};
              UserDaoImpl userDao = new UserDaoImpl();
              UserDao dao= (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interfaces,new UserDaoProxy(userDao));
              int result = dao.add(1,2);
              System.out.println("result: "+result);
          }
      }
      
      //创建代理对象
      class UserDaoProxy implements InvocationHandler{
          //有参构造传递增强对象
          private Object obj;
          public UserDaoProxy(){};
          public UserDaoProxy(Object obj){
              this.obj=obj;
          }
          //增强的逻辑
          @Override
          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
              //方法之前
              System.out.println("方法之前执行: "+method.getName()+":传递的参数: "+ Arrays.toString(args));
              //被增强的方法执行
              //可以根据method.getName()判断选择增强
              Object res = method.invoke(obj,args);
              //方法之后
              System.out.println("方法之后执行: "+obj);
              return res;
          }
      }

      标签:

      很赞哦! ()

本栏推荐