亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

Java?Spring?AOP該怎么理解

發布時間:2022-01-05 11:56:35 來源:億速云 閱讀:183 作者:柒染 欄目:開發技術

這篇文章給大家介紹Java Spring AOP該怎么理解,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

    前言

    面向切面編程,利用 AOP 可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。
    即不改變源代碼而添加新功能,可插拔的.

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

    一.AOP底層原理

    1.AOP底層使用動態代理

    有接口:jdk動態代理,即創建接口實現類代理對象

    無接口:CGLIB動態代理,即創建子類代理對象

    jdk動態代理的實現

    Java?Spring?AOP該怎么理解

    創建接口

    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;
        }
    }

    Java?Spring?AOP該怎么理解

    jdk代理圖像解析

    Java?Spring?AOP該怎么理解

    Java?Spring?AOP該怎么理解

    二.AOP術語

    1.連接點

    類里可以被增強的方法,稱為連接點.

    2.切入點

    類中實際被增強的方法,成為切入點.

    3.通知(增強)

    (1)實際被增強的方法中的邏輯部分稱為通知(增強).

    (2)通知包含:前置通知,后置通知,環繞通知,異常通知,最終通知

    4.切面

    把增強應用到切入點的過程稱為切面

    三.AOP 操作(準備工作)

    Spring 框架一般都是基于 AspectJ 實現 AOP 操作

    (1)AspectJ 不是 Spring 組成部分,獨立 AOP 框架,一般把 AspectJ 和 Spirng 框架一起使用,進行 AOP 操作

    maven準備

    <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.9.8.RC1</version>
            </dependency>

    方式一:使用Spring的接口實現增添功能

    實現組合crud和日志功能結合

    applicationContext.xml

        <context:component-scan base-package="com.vector"/>
        <aop:config>
    <!--        切入點: expression:表達式 execution(要執行的位置!* * * * *)-->
            <aop:pointcut id="pointcut" expression="execution(* com.vector.service.UserServiceImpl.*(..))"/>
    
    <!--        執行環繞增加!-->
            <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
            <aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
        </aop:config>

    log.java

    package com.vector.log;
    
    import org.springframework.aop.MethodBeforeAdvice;
    import org.springframework.stereotype.Component;
    
    import java.lang.reflect.Method;
    
    @Component("log")
    public class Log implements MethodBeforeAdvice {
        //method: 要執行的目標對象的方法
        //args: 參數
        //target: 目標對象
        @Override
        public void before(Method method, Object[] args, Object target) throws Throwable {
            System.out.println(target.getClass().getName()+"的"+method.getName()+"被執行了");
    
        }
    }

    userService.java

    package com.vector.service;
    
    
    public interface UserService {
        public void add();
        public void delete();
        public void update();
        public void query();
    }

    userServiceImpl.java

    package com.vector.service;
    
    import org.springframework.stereotype.Service;
    
    @Service("userService")
    public class UserServiceImpl implements UserService{
        @Override
        public void add() {
            System.out.println("增加了一個用戶");
        }
    }

    MyTest.java

    public class MyTest {
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            //動態代理的是接口
            UserService userService = (UserService) context.getBean("userService");
            userService.add();
        }
    }

    Java?Spring?AOP該怎么理解

    方式二:自定義類

    DiyPoint.java

    package com.vector.diy;
    
    import org.springframework.stereotype.Component;
    
    @Component("diyPointCut")
    public class DiyPointCut {
        public void before(){
            System.out.println("===方法執行前===");
        }
        public void after(){
            System.out.println("===方法執行后===");
        }
    }

    UserServiceImpl.java

    package com.vector.service;
    
    import org.springframework.stereotype.Service;
    
    @Service("userService")
    public class UserServiceImpl implements UserService{
        @Override
        public void add() {
            System.out.println("增加了一個用戶");
        }
    }

    applicationContext.xml

        <aop:config>
    <!--        自定義切面,ref要引用的類-->
            <aop:aspect ref="diyPointCut">
    <!--            切入點-->
                <aop:pointcut id="pointcut" expression="execution(* com.vector.service.UserServiceImpl.*(..))"/>
    <!--            通知-->
                <aop:before method="before" pointcut-ref="pointcut"/>
                <aop:after method="after" pointcut-ref="pointcut"/>
            </aop:aspect>
        </aop:config>

    MyTest.java

    public class MyTest {
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            //動態代理的是接口
            UserService userService = (UserService) context.getBean("userService");
            userService.add();
        }
    }

    Java?Spring?AOP該怎么理解

    方式三:全注解配置實現

    UserServiceImpl.java

    package com.vector.service;
    
    import org.springframework.stereotype.Service;
    
    @Service("userService")
    public class UserServiceImpl implements UserService{
        @Override
        public void add() {
            System.out.println("增加了一個用戶");
        }
    }

    AnnotationPointCut.java

    package com.vector;
    
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.context.annotation.EnableAspectJAutoProxy;
    import org.springframework.stereotype.Component;
    
    //標注這個類是一個切面
    @Aspect
    @Component("annotationPointCut")
    //開啟aop注解驅動
    @EnableAspectJAutoProxy
    public class AnnotationPointCut {
        @Before("execution(* com.vector.service.UserServiceImpl.*(..))")
        public void before(){
            System.out.println("===方法執行前===");
        }
        @After("execution(* com.vector.service.UserServiceImpl.*(..))")
        public void after(){
            System.out.println("===方法執行后===");
        }
    }

    MyTest.java

    public class MyTest {
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            //動態代理的是接口
            UserService userService = (UserService) context.getBean("userService");
            userService.add();
        }
    }

    Java?Spring?AOP該怎么理解

    關于Java Spring AOP該怎么理解就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

    向AI問一下細節

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

    AI

    邵阳县| 沁阳市| 台东市| 射阳县| 安泽县| 沙雅县| 襄樊市| 清河县| 四川省| 黄浦区| 高要市| 屯门区| 庐江县| 盈江县| 车险| 山东省| 从江县| 四子王旗| 东台市| 永吉县| 大田县| 灌云县| 铁岭市| 涿州市| 本溪| 广元市| 黎平县| 吉水县| 惠东县| 阿尔山市| 瓮安县| 桂东县| 石楼县| 皮山县| 永安市| 尚义县| 抚州市| 宁陕县| 安泽县| 灵山县| 错那县|