中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java?AOP動態代理是什么

發布時間:2022-08-26 10:07:35 來源:億速云 閱讀:134 作者:iii 欄目:開發技術

這篇文章主要介紹“Java AOP動態代理是什么”,在日常操作中,相信很多人在Java AOP動態代理是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java AOP動態代理是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    1.IOC與AOP概念

    IOC:控制反轉,把對象創建和對象之間的調用過程,交給Spring進行管理。使用IOC的目的是為了降低耦合度。

    AOP:面向切面編程,通過預編譯方式和運行期間動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生范型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。AOP的底層實現是基于動態代理(實現方式是當切入接口時,使用JDK原生動態代理;當切入普通方法時,使用cglib動態代理)。

    2.為何使用動態代理

    隨著業務的不斷擴展:

    (1)日志功能:如果日志代碼修改,需要修改多處。

    (2)校驗功能:如果多處需要校驗,需要修改多處。

    這時就需要使用動態代理來解決問題,動態代理的實現方式有兩種:

    [1]JDK原生動態代理:缺點是必須基于接口完成

    [2]cglib動態代理:他可以不用基于接口完成

    2.1 JDK原生動態代理

    Java?AOP動態代理是什么

    2.1.1 MathService接口類
    public interface MathService {
        //+
        public Double add(double a,double b);
        //-
        public Double sub(double a,double b);
        //*
        public Double mul(double a,double b);
        ///
        public Double div(double a,double b);
    }
    2.1.2 MathServiceImpl實現接口類
    public class MathServiceImpl implements MathService{
        @Override
        public Double add(double a, double b) {
            Double result=a+b;
            return result;
        }
        @Override
        public Double sub(double a, double b) {
            Double result=a-b;
            return result;
        }
        @Override
        public Double mul(double a, double b) {
            Double result=a*b;
            return result;
        }
        @Override
        public Double div(double a, double b) {
            Double result=a/b;
            return result;
        }
    }
    2.1.3 ProxyFactory動態代理工廠
    public class ProxyFactory {
        //被代理對象
        private Object target;
        public ProxyFactory(Object target) {
            this.target = target;
        }
        //獲取代理對象
        public Object getProxy(){
            /**
             * ClassLoader loader, 被代理對象的類加載器
             * Class<?>[] interfaces, 被代理對象實現的接口
             * InvocationHandler h: 當代理對象執行被代理的方法時,會觸發該對象中的invoke功能
             */
            ClassLoader loader=target.getClass().getClassLoader();
            Class<?>[] interfaces=target.getClass().getInterfaces();
            InvocationHandler h=new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    //可以加上需要的非業務代碼
                    //method.getName()獲取方法名
                    // Arrays.asList(args)獲取輸入值
                    System.out.println("this is "+method.getName()+" method begin with"+ Arrays.asList(args));
                    //method:表示代理對象要代理的方法
                    //invoke:回調該函數
                    //args:方法需要的參數
                    Object result = method.invoke(target, args);//代理對象回調該方法
                    return result;
                }
            };
            //先寫此處方法,才可找到上述三個方法填寫方式
            Object o = Proxy.newProxyInstance(loader, interfaces, h);
            return o;
        }
    }
    2.1.4 測試類
    public class Test01 {
        public static void main(String[] args) {
            MathServiceImpl target=new MathServiceImpl();
            ProxyFactory proxyFactory=new ProxyFactory(target);
            MathService proxy = (MathService) proxyFactory.getProxy();
            Double add = proxy.add(15.0, 5.0);
            System.out.println(add);
        }
    }

    2.2 cglib動態代理

    Java?AOP動態代理是什么

    2.2.1 MathServiceImpl類
    public class MathServiceImpl{
        public Double add(double a, double b) {
            Double result=a+b;
            return result;
        }
        public Double sub(double a, double b) {
            Double result=a-b;
            return result;
        }
        public Double mul(double a, double b) {
            Double result=a*b;
            return result;
        }
        public Double div(double a, double b) {
            Double result=a/b;
            return result;
        }
    }
    2.2.2 ProxyFactory動態代理工廠

    注意:

    (1)引入cglib的jar包.

    <dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib</artifactId>
      <version>3.2.5</version>
    </dependency>  

    (2)創建一個代理類工廠并實現接口MethodInterceptor

    public class ProxyFactory implements MethodInterceptor {
        private Object target;
        public ProxyFactory(Object target) {
            this.target = target;
        }
        //獲取代理對象
        public Object getProxy(){
            Enhancer enhancer=new Enhancer();
            //指定被代理對象的父類
            enhancer.setSuperclass(target.getClass());
            //指定回調類
            enhancer.setCallback(this);
            //創建代理對象
            return enhancer.create();
        }
        //當代理對象執行代理方法時觸發的方法
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    //        System.out.println("before++++++++++++++++++++");
    //        Object result = method.invoke(target, args);
            //可以加上需要的非業務代碼
            //method.getName()獲取方法名
            // Arrays.asList(args)獲取輸入值
            System.out.println("this is "+method.getName()+" method begin with"+ Arrays.asList(args));
            //method:表示代理對象要代理的方法
            //invoke:回調該函數
            //args:方法需要的參數
            Object result = method.invoke(target, args);//代理對象回調該方法
            return result;
        }
    }
    2.2.3 測試類
    public class Test01 {
        public static void main(String[] args) {
            MathServiceImpl target=new MathServiceImpl();
            ProxyFactory proxyFactory=new ProxyFactory(target);
            MathServiceImpl proxy = (MathServiceImpl) proxyFactory.getProxy();
            Double add = proxy.add(1, 2);
            System.out.println(add);
        }
    }

    3.AOP動態代理

    Java?AOP動態代理是什么

    3.1 添加對應依賴

    <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.2.15.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aspects</artifactId>
          <version>5.2.15.RELEASE</version>
        </dependency>

    3.2 配置spring.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
        <!--包掃描-->
        <context:component-scan base-package="com.qy151wd.proxy.proxy.aop"/>
        <!--開啟aop注解-->
        <aop:aspectj-autoproxy/>
    </beans>

    3.3 MathService接口類

    public interface MathService {
        public Double add(double a, double b);
        public Double sub(double a, double b);
        public Double mul(double a, double b);
        public Double div(double a, double b);
    }

    3.4 MathServiceImpl實現接口類

    @Service
    public class MathServiceImpl implements MathService {
        @Override
        public Double add(double a, double b) {
            Double result=a+b;
            return result;
        }
        @Override
        public Double sub(double a, double b) {
            Double result=a-b;
            return result;
        }
        @Override
        public Double mul(double a, double b) {
            Double result=a*b;
            return result;
        }
        @Override
        public Double div(double a, double b) {
            Double result=a/b;
            return result;
        }
    }

    3.5 LogAspect類

    @Service //若是使用@component也可以
    @Aspect //表示該類為切面類
    public class LogAspect {
        //任意返回類型 aop包下的所有類都有切面日志 使用通配符
        //第一個*:修飾符和返回值類型
        //第二個*:所有類
        //第三個*:所有方法
        @Before("execution(* com.qy151wd.proxy.proxy.aop.*.*(..))")
        public void before(){
            System.out.println("方法執行前的日志");
        }
        @After("execution(* com.qy151wd.proxy.proxy.aop.*.*(..))") //總會被執行,不管有沒有異常
        public void after(){
            System.out.println("方法執行后的日志");
        }
        @AfterReturning("execution(* com.qy151wd.proxy.proxy.aop.*.*(..))")//只有碰到return后才會執行
        public void afterReturning(){
            System.out.println("碰到return后執行");
        }
        @AfterThrowing("execution(* com.qy151wd.proxy.proxy.aop.*.*(..))")//異常通知
        public void afterThrowing(){
            System.out.println("出現異常了");
        }
    }

    3.6 測試類

    public class Test01 {
        public static void main(String[] args) {
            //從spring容器中獲取
            ApplicationContext app=new ClassPathXmlApplicationContext("spring.xml");
            MathService mathService = (MathService) app.getBean("mathServiceImpl");
            Double add = mathService.add(10, 5);
            System.out.println(add);
        }
    }

    到此,關于“Java AOP動態代理是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    天津市| 河南省| 金平| 左云县| 交口县| 兰坪| 万山特区| 武冈市| 珲春市| 鄂州市| 阳城县| 阿克陶县| 阳东县| 寿阳县| 进贤县| 太白县| 古田县| 那坡县| 临沧市| 玛曲县| 通辽市| 林西县| 康平县| 兴化市| 丰县| 济阳县| 九龙县| 连平县| 广宁县| 会宁县| 离岛区| 宜章县| 闸北区| 秦皇岛市| 山阳县| 蒙自县| 桓台县| 库尔勒市| 广安市| 邢台县| 威远县|