1.切面编程 无需改变原有类的情况下对业务功能实现扩展或增强。
2.目前最流行的AOP框架有两个,分别为Spring AOP 和 AspectJ。
3.Spring AOP使用纯java实现,不需要专门的编译过程和类加载器,在运行期间通过代理方式向目标类织入增强的代码。
4.AOP术语
  ①Aspect 切面: 定义增强业务的地方
  ②JoinPoint 连接点:所有可以增强的对象
  ③Pointcut 切入点:可以理解为 连接点的子集
  ④Advice 通知/增强处理 : AOP框架在特定的切入点执行的增强处理,即在定义好的切入点处理所要执行的程序代码。
  ⑤Target Object 目标对象:是指所有被通知的对象,也称为被增强的对象。
  ⑥Proxy 代理:将通知应用到目标对象之后,被动态创建的对象。
  ⑦Weaving 织入:将切面代码插入到目标对象上,从而生成代理对象的过程。
5.Spring 中的aop代理,可以是JDK动态代理,也可以是CGLIB代理。
6.Spring的通知类型
  ①环绕通知
  ②前置通知
  ③后置通知
  ④异常通知
  ⑤引介通知

切面编程的两种方式:
  (1)Spring AOP实现代理:
  (2)AspectJ实现AOP:
    ①基于XML的声明式AspectJ
    ②基于注解的声明式AspectJ (推荐使用注解式切面编程)


编程实战:

以注解方式实现切面编程

  1. 引入依赖包
<dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.13</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>
  1. @Aspect定义一个切面
@Aspect  //注意
@Component  //注意将该 切面 声明注册成bean
public class AspectTest {

    //定义通知,并定义切入点表达式:注意第一个*后面有一个空格
    @Before(value = "execution(* com.example.demo.ObjectAdviceTest.abc(..))")
    public  void myBefore(JoinPoint joinPoint){
        System.out.println("前置通知----------------");
        System.out.println("被植入的增强方法是:" + joinPoint.getSignature().getName());

    }
}
  1. 创建ApplicationContext.xml文件,并启动基于注解的声明式aspectJ的支持。
<?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.example.demo"/>
    <!--启动基于注解的声明式aspectJ支持-->
    <aop:aspectj-autoproxy/>
</beans>
  1. 目标对象(要增强的目标方法)
package com.example.demo;

import org.springframework.stereotype.Component;

@Component
public class ObjectAdviceTest {
    public String ObjectAdviceMethod(){
        return "1234";
    }
}
  1. 直接调用目标方法验证切面编程是否生效。

注意事项:目标对象所在的类要使用@Component 注解将类注册成bean组件,不要使用new的方式调用要增强的方法(目标方法),否则,增强方法不生效。