四 AOP-AspectJ准备

1 在spring里面进行aop操作,使用AspectJ实现

  • AspectJ不是spring一部分,和spring一起使用进行aop操作
  • Spring2.0以后增加了对AspectJ支持

2 使用AspectJ实现aop有两种方式基于AspectJ的xml配置基于AspectJ的注解方式3
jar包

图片 1jar包

  • aopalliance
  • aspectjweaver
  • aop
  • aspects

maven配置

<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance --> <dependency> <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> <version>1.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.7</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.2.4.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.2.4.RELEASE</version> </dependency>

创建spring核心配置文件,导入AOP操作5
使用表达式配置切入点切入点,实际增强的方法常用的表达式execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)

  • execution(* AOP.Book.add 增强AOP包下Book类中的add方法
  • execution(* AOP.Book.* 增强AOP包下Book类中所有方法
  • execution(* . 增强所有包下所有类中所有方法
  • 匹配所有save开头的方法execution(* save*

AOP 术语

public class user{
    public void add(){...}
    public void update(){...}
    public void delete(){...}
    public void findAll(){...}
}
  • Join point(连接点):类里面可以被增强的方法,这些方法称为连接点
  • Point
    cut(切入点):
    在类里面可以有很多方法被增强,比如实际操作中,只是增强了类里面的add方法和update方法,实际增强的方法称为切入点
  • Advice(通知/增强):增强的逻辑,比如扩展日志功能,这个日志功能称为增强

Advice类型:
前置通知:方法之前执行
后置通知:在方法执行之后执行
最终通知:在后置之后来执行
异常通知:方法出现异常时执行
环绕通知:方法之前和方法之后执行

  • Aspect(切面):把增强应用到具体的方法上面,这个过程称为切面,也就是把增强应用到切入点的过程
  • Introduction(引介):引介是一种特殊的通知,在不修改类代码的前提下,可以在运行期为类动态地添加一些方法或属性
  • Target(目标对象):代理的目标对象,也就是要增强的类(增强方法所在的那个类)
  • weaving(织入):把advice(通知/增强)应用到target(目标对象)的过程
  • Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类

  • 除了导入基本的jar包之外,还需要导入aop相关的jar包
六 基于AspectJ的注解方式

1 Books.java

package AOP;import org.springframework.stereotype.Component;/** * Created by yang on 17-10-22. *///类似bean@Component(value = "books")public class Books { public void add(){ System.out.println("add........"); }}

2 Mybooks.java

package AOP;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.springframework.stereotype.Component;/** * Created by yang on 17-10-22. */@Component(value = "myBooks")//切点@Aspectpublic class MyBooks { @Before(value = "execution(* AOP.Books.* public void mybooks(){ System.out.println("before........."); }}

3 .xml配置

 <!--开启aop扫描--> <aop:aspectj-autoproxy/> <!--开启注解扫描--> <context:component-scan base-package="AOP"></context:component-scan>

4 测试

 @Test public void test5(){ ApplicationContext context = new ClassPathXmlApplicationContext("Spring/applicationContext.xml"); Books books =  context.getBean; books.add(); }

图片 2执行结果

xml方式

  1. 导入相关jar包
  2. spring核心配置文件,添加aop约束

<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.springframe.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

</beans>
  1. 示例代码

package com.zhangjinbang.aop;

public class Book{

   public void add(){
       System.out.println("add book");
   }
}

package com.zhangjinbang.aop;

public class MyBook{

    public void before1{
        System.out.println("前置增强...");
    }
}

使用表达式配置切入点

常用的表达式

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

“*” 表示的是任意的意思

常用写法

execution(* com.zhangjinbang.aop.Book.add(..))

execution(* com.zhangjinbang.aop.Book.*(..))

execution(* *.*(..))

匹配所有save开头的方法 execution(* save*(..)) 

配置文件 bean.xml

<beans xmls="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.springframe.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
       <!--配置对象-->
       <bean id="book" class="com.zhangjinbang.aop.Book"></bean>
       <bean id="myBook" class="com.zhangjinbang.aop.MyBook"></bean>

       <!--配置AOP操作-->
       <aop:config>
           <!--配置切入点-->
           <aop:pointcut expression="execution(* com.zhangjinbang.aop.Book.*(..))" id="pointcut1">
           <!--配置切面  把增强用到方法上-->
           <aop:aspect ref="myBook">
               <!--配置增强类型-->
               <aop:before method="before1" pointcut-ref="pointcut1">
           </aop:aspect>
       </aop:config>

</beans>

测试

package com.zhangjinbang.aop;
import org.junit.Test;
...

public class BookTest{
    @Test
    public void testAdd(){
        ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
        Book book=(Book)context.getBean("book");
        book.add();
    }
}

控制台输出内容

前置增强…
add book

    2、表达式:execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)

五 基于AspectJ的xml配置

1 Book.java

package AOP;/** * Created by pc on 2017/9/16. */public class Book { public void add(){ System.out.println("add......."); }}

2 MyBook.java

package AOP;/** * Created by pc on 2017/9/16. */public class MyBook { public void before(){ System.out.println("前置增强........."); }}

3 .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: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 --> <bean /> <bean /> <aop:config> <!--1.配置切入点--> <aop:pointcut expression="execution(* AOP.Book.*" /> <!-- 2.配置切面 把增强用到方法上面--> <aop:aspect ref="mybook"> <!--配置增强类型 method:增强类里面使用哪个方法作为前置 --> <aop:before method="before" pointcut-ref="pointcut1" /> </aop:aspect> </aop:config></beans>

4 测试

 @Test public void test4(){ ApplicationContext context = new ClassPathXmlApplicationContext("Spring/bean.xml"); Book book =  context.getBean; book.add(); }

图片 3测试结果

AspectJ简介

  • AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的class文件。
  • AspectJ是一个基于Java语言的AOP框架
  • Spring2.0以后新增了对AspectJ切入点表达式支持
  • @AspectJ是AspectJ1.5新增功能,通过JDK5注解技术,允许直接在Bean类中定义切面
  • 新版本Spring框架,建议使用AspectJ方式开发AOP
  • 使用AspectJ需要导入Spring AOP和AspectJ相关的jar包

AspectJ不是spring一部分,只是和spring一起使用进行aop操作


    异常通知:方法出现异常

一 概念

1 AOP:面向切面编程,扩展功能不需要修改源代码2
AOP采用横向抽取机制,取代了传统纵向继承体系重复性代码

Spring的AOP操作

使用AspectJ实现aop的两种方式

  1. 基于AspectJ的xml配置
  2. 基于AspectJ的注解方式

图片 4

二 原理

图片 5原理

  • 第一种情况

图片 6第一种情况

  • 第二种情况

图片 7第二种情况

AspectJ

  • 导入AOP的约束
三 操作术语
  • *Pointcut:在类中可以增强很多方法,比如有4个方法可以被增强,可是只增强了其中两个方法,那这两个方法就叫切入点
  • *Advice:增强的逻辑,比如扩展日志功能,这个功能称为增强
    • 前置通知:在方法之前执行
    • 后置通知:在方法之后执行
    • 异常通知:方法出现异常
    • 最终通知:在后置之后执行
    • 环绕通知:在方法之前和之后执行
  • *Aspect:把增强应用到具体方法上,过程称为切面。把增强用应用到切入点的过程。
  • Joinpoint:类里面能被增强的方法
  • Introduction:向类中动态添加属性
  • Target:增强方法所在类
  • Weaving:把增强用到类的过程
  • Proxy:代理类

AOP准备工作

    最终通知:在后置之后执行

    前置通知:在方法之前执行

    1、切入点:实际要增强的办法

发表评论

电子邮件地址不会被公开。 必填项已用*标注