zoukankan      html  css  js  c++  java
  • spring 学习(三):aop 学习

    spring 学习(三):aop 学习

    aop 概念

    1 aop:面向切面(方面)编程,扩展功能不修改源代码实现

    2 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码

    3 aop底层使用动态代理实现
    (1)第一种情况,有接口情况,使用动态代理创建接口实现类代理对象
    (2)第二种情况,没有接口情况,使用动态代理创建类的子类代理对象

    aop 操作术语

    • Joinpoint(连接点):类里面可以被增强的方法,这些方法称为连接点。
    • Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义。
    • Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)。
    • Aspect(切面): 是切入点和通知(引介)的结合
    • Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field。
    • Target(目标对象):代理的目标对象(要增强的类)
    • Weaving(织入):是把增强应用到目标的过程.把advice 应用到 target的过程。
    • Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类。

    重点理解的几个术语

    1 切入点:在类里面可以有很多的方法被增强,比如在实际操作中,只是增强了类里面 add() 方法和 update() 方法,实际增强的方法称为切入点。

    2 通知/增强:增强的逻辑,称为增强,比如扩展日志功能,这个日志功能称为增强

    可以分为以下几种通知(增强):

    • 前置通知:在方法之前执行。
    • 后置通知:在方法之后执行。
    • 异常通知:方法出现异常。
    • 最终通知:在后置之后执行。
    • 环绕通知:在方法之前和之后执行。

    3 切面:把增强应用到具体方法上面,过程称为切面,把增强用到切入点过程。

    spring 的 aop 操作

    1 在spring里面进行aop操作,使用aspectj实现
    (1)aspectj不是spring一部分,和spring一起使用进行aop操作
    (2)Spring2.0以后新增了对AspectJ支持

    2 使用aspectj实现aop有两种方式
    (1)基于aspectj的xml配置
    (2)基于aspectj的注解方式

    aop 操作

    这里还是举个栗子

    1 还是以maven 工程为例,这里我们需要在 pom.xml 中多添加 aop 相关 jar 包的配置:

     <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-expression</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
         <!-- aop相关 jar 包配置 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>aopalliance</groupId>
                <artifactId>aopalliance</artifactId>
                <version>1.0</version>
            </dependency>
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.9.1</version>
            </dependency>
         <!-- 日志功能 -->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>2.11.1</version>
            </dependency>
            <dependency>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
                <version>1.2</version>
            </dependency>
    
        </dependencies>
    

    2 在 src/main/java 下创建一个 package: cn.itcast.aop, 并在当前包下新建 Book.java, MyBook.java:

    Book.java:

    package cn.itcast.aop;
    
    public class Book {
        public void add(){
            System.out.println("add........");
        }
    }
    
    

    MyBook.java:

    package cn.itcast.aop;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    
    public class MyBook {
        public void before1(){
            System.out.println("前置增强......");
        }
    
        public void after1(){
            System.out.println("后置增强...");
        }
    
        //环绕通知
        public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
            //方法之前
            System.out.println("方法之前......");
    
            //执行被增强的方法
            proceedingJoinPoint.proceed();
    
            //方法之后
            System.out.println("方法之后......");
        }
    }
    

    3 在 resources 下创建 spring 核心配置文件 applicationContext.xml , 导入 aop 约束,并进行 aop 操作

    <?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: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/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- bean definitions here -->
    
        <!-- 1 配置对象 -->
        <bean id="book" class="cn.itcast.aop.Book"></bean>
        <bean id="myBook" class="cn.itcast.aop.MyBook"></bean>
    
        <!-- 配置 aop 操作 -->
        <aop:config>
            <!-- 2.1 配置切入点 -->
            <aop:pointcut id="pointcut1" expression="execution(* cn.itcast.aop.Book.*(..))"/>
            <!-- 2.2 配置切面,把增强用到方法上面 -->
            <aop:aspect ref="myBook">
                <!-- 配置增强类型。method: 增强类里面使用哪个方法作为前置 -->
                <aop:before method="before1" pointcut-ref="pointcut1"/>
    
                <aop:after-returning method="after1" pointcut-ref="pointcut1"/>
                
                <aop:around method="around" pointcut-ref="pointcut1"/>
            </aop:aspect>
        </aop:config>
    </beans>
    

    这里说一下表达式配置切入点的常用表达式:

    execution(<访问修饰符>?<返回类型><方法名><(参数>)<异常>)

    • 具体到某个方法:execution(* cn.itcast.aop.Book.add(..))
    • 匹配类下面的所有方法:execution(* cn.itcast.Book.*(..))
    • 匹配全部:execution(* *.*(..))
    • 匹配所有 save 开头的方法:execution(* cn.itcast.Book.save*(..))

    创建测试文件 TestAop.java, 查看 Book.java 中的 add() 方法是否被增强了:

    package cn.itcast.aop;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class TestAop {
        @Test
        public void testBook(){
            ApplicationContext context = new ClassPathXmlApplicationContext("applicatioinContext.xml");
            Book book = (Book) context.getBean("book");
            book.add();
        }
    }
    
    

    运行测试文件,控制台输出信息:

  • 相关阅读:
    工作中遇到的java 内存溢出,问题排查
    java线上内存溢出问题排查步骤
    性能测试-java内存溢出问题排查
    164 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 04 终止finally执行的方法
    163 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 03 使用多重catch结构处理异常
    162 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 02 使用try-catch结构处理异常
    161 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 01 try-catch-finally简介
    160 01 Android 零基础入门 03 Java常用工具类01 Java异常 03 异常处理简介 01 异常处理分类
    159 01 Android 零基础入门 03 Java常用工具类01 Java异常 02 异常概述 02 异常分类
    158 01 Android 零基础入门 03 Java常用工具类01 Java异常 02 异常概述 01 什么是异常?
  • 原文地址:https://www.cnblogs.com/weixuqin/p/9501878.html
Copyright © 2011-2022 走看看