😧 Spring_day03(二)

简介: 😧 Spring_day03

2.4 AOP实现步骤


步骤1:添加依赖

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.4</version>
</dependency>


网络异常,图片无法展示
|


  • 因为spring-context中已经导入了spring-aop,所以不需要再单独导入spring-aop
  • 导入AspectJ的jar包,AspectJ是AOP思想的一个具体实现,Spring有自己的AOP实现,但是相比于AspectJ来说比较麻烦,所以我们直接采用Spring整合ApsectJ的方式进行AOP开发。


步骤2:定义接口与实现类


环境准备的时候,BookDaoImpl已经准备好,不需要做任何修改


步骤3:定义通知类和通知


通知就是将共性功能抽取出来后形成的方法,共性功能指的就是当前系统时间的打印。

public class MyAdvice {
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

类名和方法名没有要求,可以任意。


步骤4:定义切入点


BookDaoImpl中有两个方法,分别是save和update,我们要增强的是update方法,该如何定义呢?


public class MyAdvice {
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void pt(){}
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}


说明:


  • 切入点定义依托一个不具有实际意义的方法进行,即无参数、无返回值、方法体无实际逻辑。
  • execution及后面编写的内容,后面会有章节专门去学习。


步骤5:制作切面


切面是用来描述通知和切入点之间的关系,如何进行关系的绑定?

public class MyAdvice {
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void pt(){}
    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

绑定切入点与通知关系,并指定通知添加到原始连接点的具体执行位置


网络异常,图片无法展示
|


说明:@Before翻译过来是之前,也就是说通知会在切入点方法执行之前执行,除此之前还有其他四种类型,后面会讲。


步骤6:将通知类配给容器并标识其为切面类


@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void pt(){}
    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

步骤7:开启注解格式AOP功能

@Configuration
@ComponentScan("com.itheima")
@EnableAspectJAutoProxy
public class SpringConfig {
}

步骤8:运行程序

public class App {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao = ctx.getBean(BookDao.class);
        bookDao.update();
    }
}

看到在执行update方法之前打印了系统时间戳,说明对原始方法进行了增强,AOP编程成功。


网络异常,图片无法展示
|


知识点1:@EnableAspectJAutoProxy

名称

@EnableAspectJAutoProxy

类型

配置类注解

位置

配置类定义上方

作用

开启注解格式AOP功能


知识点2:@Aspect

名称

@Aspect

类型

类注解

位置

切面类定义上方

作用

设置当前类为AOP切面类


知识点3:@Pointcut

名称

@Pointcut

类型

方法注解

位置

切入点方法定义上方

作用

设置切入点方法

属性

value(默认):切入点表达式


知识点4:@Before

名称

@Before

类型

方法注解

位置

通知方法定义上方

作用

设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前运行


3,AOP工作流程


AOP的入门案例已经完成,对于刚才案例的执行过程,我们就得来分析分析,这一节我们主要讲解两个知识点:AOP工作流程AOP核心概念。其中核心概念是对前面核心概念的补充。


3.1 AOP工作流程


由于AOP是基于Spring容器管理的bean做的增强,所以整个工作过程需要从Spring加载bean说起:


流程1:Spring容器启动


  • 容器启动就需要去加载bean,哪些类需要被加载呢?
  • 需要被增强的类,如:BookServiceImpl
  • 通知类,如:MyAdvice
  • 注意此时bean对象还没有创建成功


流程2:读取所有切面配置中的切入点


网络异常,图片无法展示
|


  • 上面这个例子中有两个切入点的配置,但是第一个ptx()并没有被使用,所以不会被读取。


流程3:初始化bean,


判定bean对应的类中的方法是否匹配到任意切入点


  • 注意第1步在容器启动的时候,bean对象还没有被创建成功。
  • 要被实例化bean对象的类中的方法和切入点进行匹配
    网络异常,图片无法展示
    |
  • 匹配失败,创建原始对象,如UserDao
  • 匹配失败说明不需要增强,直接调用原始对象的方法即可。
  • 匹配成功,创建原始对象(目标对象)的代理对象,如:BookDao
  • 匹配成功说明需要对其进行增强
  • 对哪个类做增强,这个类对应的对象就叫做目标对象
  • 因为要对目标对象进行功能增强,而采用的技术是动态代理,所以会为其创建一个代理对象
  • 最终运行的是代理对象的方法,在该方法中会对原始方法进行功能增强


目录
相关文章
|
XML druid Java
😧 Spring_day02 ✅(三)
😧 Spring_day02 ✅
104 0
😧 Spring_day02 ✅(三)
|
存储 Java Maven
😧 Spring_day01 ✅(二)
😧 Spring_day01 ✅
54 0
|
Java Maven 索引
😧 Spring_day01 ✅(四)
😧 Spring_day01 ✅
55 0
|
druid Java 关系型数据库
😧 Spring_day02 ✅(一)
😧 Spring_day02 ✅
57 0
😧 Spring_day02 ✅(一)
|
XML Java 关系型数据库
😧 Spring_day02 ✅(四)
😧 Spring_day02 ✅
50 0
|
XML Java 程序员
😧 Spring_day03(一)
😧 Spring_day03
84 1
|
Java Maven Spring
😧 Spring_day01 ✅(三)
😧 Spring_day01 ✅
100 0
|
Java 数据库连接 测试技术
😧 Spring_day03(六)
😧 Spring_day03
68 0
|
Java 数据库连接 数据库
😧 Spring_day03(五)
😧 Spring_day03
50 0
|
Java 数据安全/隐私保护 容器
😧 Spring_day03(三)
😧 Spring_day03
56 0