SSM框架学习笔记三-AOP入门案例

AOP是一种编程范式,用于在不修改原有代码的基础上添加功能。SpringAOP中,连接点是方法执行,切入点是匹配这些点的表达式,通知是在切入点执行的操作。@EnableAspectJAutoProxy用于开启注解驱动的AOP支持,@Aspect定义切面类,@Pointcut声明切入点,@Before定义前置通知。文章通过一个简单的例子展示了如何使用这些注解实现AOP。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AOP

AOP简介

AOP面向切面编程,一种编成范式, 指导开发者如何组织程序结构

  • 作用: 在不惊动原始设计的基础上为其进行功能增强

  • spring理念: 无侵入式/无入侵式编程

连接点(JoinPoint) :程序执行过程中的任意位置,粒度为执行方法,抛出异常,设置变量等

  • 在SpringAOP中,理解为方法的执行

切入点(Pointcut):匹配连接点的式子

在SpringAOP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法

  • 一个具体方法:com.yjm.dao包下的BookDao接口中的无形参无返回值的save方法

  • 匹配多个方法:所有的save方法,所有的get开头的方法,所有Dao结尾的接口中的任意方法,所有带有一个参数的方法

  • 切入点被连接点包含

通知(Advice):在切入点执行的操作,也就是共性功能

  • 在springAOP中,功能最终以方法的形式呈现

通知类:定义通知的类

切面(Aspect):描述通知与切入点的对应关系

AOP入门案例(注解版)

1.导入aop相关坐标

<!--导入aop相关坐标-->
<!--aop的包是默认导入的-->
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.4</version>
    </dependency>
</dependencies>

说明:spring-context坐标依赖spring-aop坐标

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

2.定义dao接口与实现类

//定义dao接口和实现类
public interface BookDao {
    public void save();
    public void update();
}
@Repository //设置为可扫描的bean
public class BookDaoImpl implements BookDao {

    public void save() {
        //打印当前运行时间
        System.out.println(System.currentTimeMillis());
        //save方法的打印测试
        System.out.println("book dao save ...");
    }

    public void update(){
        //update方法的打印测试
        System.out.println("book dao update ...");
    }
}

3.定义通知类,制作通知

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

4.定义切入点

public class MyAdivice1 {
    //4.定义切入点,执行到这个方法就是切入点
    // //设置切入点,要求配置在方法上方
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void pt() {
    }
    public void method() {
        System.out.println(System.currentTimeMillis());
    }
}

说明:切入点依托一个不具有实际意义的方法进行,即无参数,无返回值,方法体无实际逻辑。

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

public class MyAdivice1 {

    //4.定义切入点,执行到这个方法就是切入点
    // //设置切入点,要求配置在方法上方
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void pt() {
    }

    //5.绑定共性功能和切入点的关系
    //设置在切入点pt()的前面运行当前操作(前置通知)
    @Before("pt()")
    //3.制作共性功能
    public void method() {
        System.out.println(System.currentTimeMillis());
    }
}

6.定义通知类受Spring容器管理,并定义当前类为切面类

//通知类必须配置成Spring管理的bean
@Component //变成收控制的bean
//设置当前类为切面类类
@Aspect //识别成AOP ,让程序识别下面的
public class MyAdivice1 {

    //4.定义切入点,执行到这个方法就是切入点
    // //设置切入点,要求配置在方法上方
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void pt() {//该方法和下面的@Befpre绑定了,执行到该方法就添加下面的功能,先执行下面的方法再执行本方法
    }

    //5.绑定共性功能和切入点的关系
    //设置在切入点pt()的前面运行当前操作(前置通知)
    @Before("pt()")
    //3.制作共性功能
    public void method() {
        System.out.println(System.currentTimeMillis());
    }
}

7.开启Spring对AOP注解驱动支持

@Configuration
@ComponentScan("com.itheima")
//开启注解开发AOP功能
@EnableAspectJAutoProxy //启动配置里面的@Aspect
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();
 /*       System.out.println(bookDao);
        System.out.println(bookDao.getClass());*/
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kDgxQhXq-1680539038925)(D:\Java学习\Typora笔记\笔记图片\image-20230329004228841.png)]

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

知识点1:@EnableAspectJAutoProxy

名称@EnableAspectJAutoProxy
类型配置类注解
位置配置类定义上方
作用开启注解格式AOP功能

知识点2:@Aspect

名称@Aspect
类型类注解
位置切面类定义上方
作用设置当前类为AOP切面类

知识点3:@Pointcut

名称@Pointcut
类型方法注解
位置切入点方法定义上方
作用设置切入点方法
属性value(默认):切入点表达式

知识点4:@Before

名称@Before
类型方法注解
位置通知方法定义上方
作用设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前运行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值