Spring AOP的环境搭建、切入点表达式、通知注解

发布时间:2024年01月04日

Spring AOP环境搭建

首先新建一个Spring框架环境,忘记搭建步骤可以去看主页之前的怎样搭建Spring框架环境
AOP环境搭建建立在Spring环境上,然后再进行以下步骤

AOP坐标依赖引入

可以去Maven官网进行下载,也可以复制下面的依赖版本

<!--Spring AOP-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>

添加xml配置

需要添加命名空间

xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd

添加过后的xml文件如下,要开启自动化扫描

<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
       https://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--开启自动化扫描-->
    <context:component-scan base-package="com.svt"/>
</beans>

实现三层架构

完善dao层、service层以及controller层,在各自层内新建各自的类并加以注释实例化

@Repository
public class UserDao {
}
@Service
public class UserService {
}
@Controller
public class UserController {
}

这样基本的AOP环境就搭建好了

定义切入点

@Pointcut(“匹配规则”)

切入点表达式

1. 执行所有的公共方法
execution(public *(..))
2.执行任意的set方法
execution(* set*(..))
3.设置指定包下的任意类的任意方法 (指定包: com.svt.service)
execution(* com.svt.service.*.*(..))
4.设置指定包及于包下的任意类的任意方法 (指定包: com.svt.service)
execution(* com.svt.service..*,*(..))
表达式中的第一个*
代表的是方法的修饰范围 (pubLic、private、protected)
如果取值是*,则表示所有范围
示例
@Pointcut("execution(* com.svt.service.*.*(..))")
public void cut(){
}

通知注解

@Before-前置通知

声明前置通知,并将通知应用到指定的切入点上
目标类的方法执行前,执行该通知

示例

value=""内写切入点方法

@Before(value = "cut()")
    public void before(){
        System.out.println("前置通知...");
    }

@AfterReturning-返回通知

声明返回通知,并将通知应用到指定的切入点上
目标类的方法在无异常执行后,执行该通知

示例

@AfterReturning(value = "cut()")
    public void afterReturn(){
        System.out.println("返回通知...");
    }

@After-最终通知

声明最终通知,并将通知应用到指定的切入点上
目标类的方法在执行后,执行该通知(有异常和无异常最终都会执行)
和finally有点像

示例

@After(value = "cut()")
    public void after(){
        System.out.println("最终通知...");
    }

@AfterThrowing-异常通知

声明异常通知,并将通知应用到指定的切入点上
目标类的方法在执行异常时,执行该通知

示例

@AfterThrowing(value = "cut()",throwing = "e")
    public void afterThrow(Exception e){
        System.out.println("异常通知...======异常原因:"+e.getMessage());
    }

@Around-环绕通知

声明环绕通知,并将通知应用到指定的切入点上
目标类的方法执行前后,都可通过环绕通知定义响应的处理
需要通过显示调用的方法,否则无法访问指定方法 pjp.proceed();

示例

@Around(value = "cut()")
    public Object around(ProceedingJoinPoint pjp){
        System.out.println("环绕通知-前置通知...");

        Object object=null;
        //object=pjp.proceed();

        try {
            //显示调用的方法
            object=pjp.proceed();
            System.out.println(pjp.getTarget());
            System.out.println("环绕通知-返回通知...");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("环绕通知-异常通知...");
        }
        System.out.println("环绕通知-最终通知...");
        return object;
    }

在这里插入图片描述

文章来源:https://blog.csdn.net/qq_52879387/article/details/135377634
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。