Spring基于注解的AOP的实现

107 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情

1.Spring AOP 面向切面编程

1.1 Spring的AOP模块是Spring框架体系中十分重要的内容,该模块一般适用于具有横切逻辑的场景,如访问控制、事务管理和性能监控等。

1.2 AOP的全称是Aspect Oriented Programming,即面向切面编程。和OOP不同,AOP主张将程序中相同的业务逻辑进行横向隔离,并将重复的业务逻辑抽取到一个独立的模块中,以达到提高程序可重用性和开发效率的目的。

1.3 未使用AOP的面向切面编程案例

例如,订单系统中有添加订单信息、更新订单信息和删除订单信息3个方法,这3个方法中都包含事务管理业务代码,订单系统的逻辑如图所示。

image.png

AOP面向切面编程的优势

由订单系统可知,添加订单信息、修改订单信息、删除订单信息的方法体中都包含事务管理的业务逻辑,这就带来了一定数量的重复代码并使程序的维护成本增加。

基于AOP的面向切面编程,可以为此类问题提供解决方案,AOP可以将事务管理的业务逻辑从这三个方法体中抽取到一个可重用的模块,进而降低横向业务逻辑之间的耦合,减少重复代码。

AOP的使用,使开发人员在编写业务逻辑时可以专心于核心业务,而不用过多地关注其他业务逻辑的实现,不但提高了开发效率,而且增强了代码的可维护性。

1.4 AOP 术语

AOP并不是一个新的概念,AOP中涉及很多术语,如切面、连接点、切入点、通知/增强处理、目标对象、织入、代理和引介等,下面针对AOP的常用术语进行简单介绍。

1.4.1切面(Aspect)

切面是指关注点形成的类(关注点是指类中重复的代码),通常是指封装的、用于横向插入系统的功能类(如事务管理、日志记录等)。在实际开发中,该类被Spring容器识别为切面,需要在配置文件中通过元素指定。

1.4.2 连接点(Joinpoint)

连接点是程序执行过程中某个特定的节点,例如,某方法调用时或处理异常时。在Spring AOP中,一个连接点通常是一个方法的执行。

1.4.3切入点(Pointcut)

当某个连接点满足预先指定的条件时,AOP就能够定位到这个连接点,在连接点处插入切面,该连接点也就变成了切入点。

image.png

1.4.4通知/增强处理(Advice)

通知/增强处理就是插入的切面程序代码。可以将通知/增强处理理解为切面中的方法,它是切面的具体实现。

1.4.5目标对象(Target)

目标对象是指被插入切面的方法,即包含主业务逻辑的类对象。或者说是被一个或者多个切面所通知的对象。

image.png

1.4.6织入(Weaving)

将切面代码插入到目标对象上,从而生成代理对象的过程。织入可以在编译时,类加载时和运行时完成。在编译时进行织入就是静态代理,而在运行时进行织入则是动态代理。

1.4.7代理(Proxy)

将通知应用到目标对象之后,程序动态创建的通知对象,就称为代理。代理类既可能是和原类具有相同接口的类,也可能是原类的子类,可以采用调用原类相同的方式调用代理类。

1.4.8引介(Introduction)

引介是一种特殊的通知,它可为目标对象添加一些属性和方法。这样,即使一个业务类原本没有实现某一个接口,通过AOP的引介功能,也可以动态地为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。

2.Spring AOP的注解

image.png

下面通过一个案例演示基于注解的AOP的实现,案例具体实现步骤如下:

步骤1:创建AnnoAdvice类,用于定义通知。

使用以下注解分别定义: 切点、前置通知、返回通知、环绕通知、异常通知、后置通知

@Aspect
public class AnnoAdvice {
    @Pointcut("execution( * com.itheima.demo03.UserDaoImpl.*(..))")
    @Before("poincut()")
    @AfterReturning("poincut()")
    @Around("poincut()")
    @AfterThrowing("poincut()")
    @After(“poincut()")
}

步骤2:创建applicationContext-Anno.xml文件,在该文件中引入AOP命名空间,使用元素添加Spring AOP的配置信息。

<!-- 注册Bean -->
<bean name="userDao" class="com.itheima.demo03.UserDaoImpl"/>
<bean name="AnnoAdvice" class="com.itheima.demo04.AnnoAdvice"/>
<!-- 开启@aspectj的自动代理支持 -->
<aop:aspectj-autoproxy/>

步骤3:创建测试类TestAnnotation,用于测试基于注解的AOP实现。

    public class TestAnnotation {
    public static void main(String[] args){
        ApplicationContext context = new 
        ClassPathXmlApplicationContext("applicationContext-Anno.xml");
        UserDao userDao = context.getBean("userDao",UserDao.class);
        userDao.delete();	
        userDao.insert();	
        userDao.select();	 
        userDao.update();
}}

image.png

步骤4:在IDEA中启动TestAnnotation类,控制台会输出结果。

image.png

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情