springboot整合aop

x33g5p2x  于2021-09-25 转载在 Spring  
字(3.5k)|赞(0)|评价(0)|浏览(496)

1.pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.yl</groupId>
    <artifactId>aop</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>aop</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--引入aop依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.service

package com.yl.aop.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {

    public String getUserById(Integer id) {
        System.out.println("getUserById() running");
        return "小蓝";
    }
    
}

3. 新建一个切面类,通过表达式配置切入点,增加几种通知方式

package com.yl.aop.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LogAspect {

    /** * 配置切入点,运用表达式 * 以下表达式,第一个*代表方法的返回值是任意的, * 其下那段意思是扫描com.yl.sop.service包下的所有的类中的所有的方法,方法的参数任意。 */
    @Pointcut("execution(* com.yl.aop.service.*.*(..))")
    public void pc1() {

    }

    //前置通知,目标方法执行之前执行
    @Before("pc1()")
    public void before(JoinPoint joinPoint) {
        String name = joinPoint.getSignature().getName();
        System.out.println(name + "方法开始执行了");
    }

    //后置通知,目标方法执行之前执行
    @After("pc1()")
    public void after(JoinPoint joinPoint) {
        String name = joinPoint.getSignature().getName();
        System.out.println(name + "方法执行结束了");
    }

    //返回通知
    @AfterReturning(value = "pc1()",returning = "s")
    public void afterRunning(JoinPoint joinPoint,String s) {
        String name = joinPoint.getSignature().getName();
        System.out.println(name + "方法的返回值是"+s);
    }

    //异常通知
    @AfterThrowing(value = "pc1()",throwing = "e")
    public void afterThrowing(JoinPoint joinPoint,Exception e) {
        String name = joinPoint.getSignature().getName();
        System.out.println(name + "方法抛出了异常"+e.getMessage());
    }

    //环绕通知
    @Around("pc1()")
    public Object arround(ProceedingJoinPoint proceedingJoinPoint){
        try {
            System.out.println("around start.....");
            Object proceed = proceedingJoinPoint.proceed();
            System.out.println("around end ......");
            return proceed;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return null;
    }



}

4.测试

5.结果

相关文章

微信公众号

最新文章

更多