AOP快速入门笔记

1. AOP

1.1 概念

​ AOP为Aspect Oriented Programming的缩写,意为:面向切面编程。他是一种可以在不修改原来的核心代码的情况下给程序动态统一进行增强的一种技术。

1.1.1 核心

  • Joinpoint(连接点):所谓连接点是指那些可以被增强到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点

  • Pointcut(切入点):所谓切入点是指被增强的连接点(方法)

  • Advice(通知/ 增强):所谓通知是指具体增强的代码

  • Target(目标对象):被增强的对象就是目标对象

  • Aspect(切面):是切入点和通知(引介)的结合

  • Proxy (代理):一个类被 AOP 增强后,就产生一个结果代理类

1.1.2 通知分类

  • @Before:前置通知,在目标方法执行前执行

  • @AfterReturning: 返回后通知,在目标方法执行后执行,如果出现异常不会执行

  • @After:后置通知,在目标方法之后执行,无论是否出现异常都会执行

  • @AfterThrowing:异常通知,在目标方法抛出异常后执行

  • @Around:环绕通知,围绕着目标方法执行

1.1.3 切面表达式

可以使用切点表达式来表示要对哪些方法进行增强。
写法:execution([修饰符] 返回值类型 包名.类名.方法名(参数))

  • 访问修饰符可以省略,大部分情况下省略
  • 返回值类型、包名、类名、方法名可以使用星号* 代表任意
  • 包名与类名之间一个点 . 代表当前包下的类,两个点 . . 表示当前包及其子包下的类
  • 参数列表可以使用两个点 . .表示任意个数,任意类型的参数列表

例:

execution(* com.zijie.service.*.*(..))   表示com.zijie.service包下任意类,方法名任意,参数列表任意,返回值类型任意
   
execution(* com.zijie.service..*.*(..))   表示com.zijie.service包及其子包下任意类,方法名任意,参数列表任意,返回值类型任意
    
execution(* com.zijie.service.*.*())     表示com.zijie.service包下任意类,方法名任意,要求方法不能有参数,返回值类型任意
    
execution(* com.zijie.service.*.delete*(..))     表示com.zijie.service包下任意类,要求方法不能有参数,返回值类型任意,方法名要求已delete开头

1.2 快速入门

1.2.1 准备工作

  1. 导入AOP相关依赖
 
 <dependency>
     <groupId>org.springframeworkgroupId>
     <artifactId>spring-contextartifactId>
     <version>5.1.9.RELEASEversion>
 dependency>
 
 <dependency>
     <groupId>org.aspectjgroupId>
     <artifactId>aspectjweaverartifactId>
     <version>1.8.13version>
 dependency>
  1. 在配置文件中开启AOP组件扫描
<context:component-scan base-package="com.zijie">context:component-scan>
  1. 配置两个类并注入到容器中(UserServcie、MassageService)
@Service
public class UserService {

    public void deleteAll(){
        System.out.println("UserService中deleteAll的核心代码~~~~~");
    }
}
@Service
public class MassageService {

    public void deleteAll(){
        System.out.println("MassageService中deleteAll的核心代码~~~~");
    }
}
  1. 在配置文件中开启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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
       
    
    <context:component-scan base-package="com.zijie">context:component-scan>

    
    <aop:aspectj-autoproxy>aop:aspectj-autoproxy>
beans>
  1. 创建一个切面类

创建一个类,在类上加上@Component和@Aspect注解

使用@Pointcut注解来指定要被增强的方法

使用@Before注解来给我们的增强代码所在的方法进行标识,并且指定了增强代码是在被增强方法执行之前执行的。

使用@After注解来给我们的增强代码所在的方法进行标识,并且指定了增强代码是在被增强方法执行之后执行的。

@Component
@Aspect
public class MyAspect {
    //用Pointcut注解中的属性来指定对哪些方法进行增强
    @Pointcut("execution(* com.zijie.service.*.*(..))") //切面表达式
    public void pt(){}

    /*
        用@Before注解来指定该方法中是增强的代码,并且是在被增强方法执行前执行的
        @Before的属性写上加了@Pointcut注解的方法: 方法名()
    */
    @Before("pt()")
    public void methodbefore(){
        System.out.println("before方法被调用了");
    }

    /*
    用@After注解来指定该方法中是增强的代码,并且是在被增强方法执行后执行的
    @After的属性写上加了@Pointcut注解的方法: 方法名()
*/
    @After("pt()")
    public void methodafter(){
        System.out.println("after方法被调用了");
    }
}
  1. 测试类
public class APP {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        MassageService massageService= applicationContext.getBean(MassageService.class);
        UserService userService = applicationContext.getBean(UserService.class);
        massageService.deleteAll();
        userService.deleteAll();
    }
}

结果:
AOP快速入门笔记_第1张图片

想要学习的同学可以访问b站三更草堂老师的视频:三更草堂spring框架教程

你可能感兴趣的:(java,spring,开发语言)