Talk is cheap , show me your code!
欢迎来到付振南Java博客,让我们一起学习Java吧!

spring之AOP(基于注解方式配置)

之前我们学习了spring AOP基于xml方式的配置,今天来学习一下spring AOP基于注解方式的配置。

项目工程图如下图所示:

记得maven坐标一定也要导入进来,这是第一步!

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.7</version>
    </dependency>
</dependencies>

首先在配置文件中引入约束,并且声明要扫描的包和配置springAOP对注解的支持。

<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 配置spring创建容器时要扫描的包 -->
    <context:component-scan base-package="cn.fuzhennan"/>

    <!-- 配置spring开始注解aop的支持 -->
    <aop:aspectj-autoproxy/>
</beans>

然后在Logger类中加上注解,在这我们就使用环绕通知来演示了。

package cn.fuzhennan.utils;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

/**
 * 用于记录日志的公共类,提供那个公共代码
 */
@Component("logger")
@Aspect//表示当前类是一个切面类
public class Logger {

    @Pointcut("execution( * cn.fuzhennan.service.impl.*.*(..))")
    private void pt1(){}

    @Around("pt1()")
    public Object aroundPrintLog(ProceedingJoinPoint proceedingJoinPoint){
        Object rtValue = null;
        try{
            //得到方法执行所需参数
            Object[] args = proceedingJoinPoint.getArgs();
            System.out.println("Logger类中的afterPrintLog方法开始记录日志了。。。前置");
            //明确调用业务层方法(切入点方法),在proceed方法前面就是前置,后面就是后置,catch就是异常,finally就是最终
            rtValue = proceedingJoinPoint.proceed(args);
            System.out.println("Logger类中的afterPrintLog方法开始记录日志了。。。后置");
            return rtValue;
        }catch (Throwable throwable){
            System.out.println("Logger类中的afterPrintLog方法开始记录日志了。。。异常");
            throw new RuntimeException(throwable);
        }finally {
            System.out.println("Logger类中的afterPrintLog方法开始记录日志了。。。最终");
        }
    }

}

由于Logger类在utils中,我们只需要Component就行了,然后给个id,@Component("logger")

之后在声明当前类是一个切面类,@Aspect

然后我们写一个切入点方法,并且加上切入点表达式注解

@Pointcut("execution( * cn.fuzhennan.service.impl.*.*(..))")
private void pt1(){}

最后一步只需要在环绕通知方法中加上环绕通知注解就行,@Around("pt1()"),参数写上切入点方法,并且一定要带上括号,因为参数需要传入的是一个方法。

最后我们在测试类运行以下看看结果。

没错,完美实现。我们这演示用的是环绕通知,换其它四种通知也是同样的道理。

赞(2) 打赏
未经允许不得转载:付振南Java博客 » spring之AOP(基于注解方式配置)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏