SpringAOP

Posted 鸟随二月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringAOP相关的知识,希望对你有一定的参考价值。

在ideal中创建maven项目



一直点next知道finish完成项目创建

aop 简单使用

添加依赖

在SpringAOP\\pom.xml添加以下依赖

 <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

com\\example\\demo\\controller\\UserController.java验证例子

package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/login")
    public int login(String username,String password){
        System.out.println("执行了 login 方法");
        return 0;
    }

    @RequestMapping("/register")
    public int register(String username,String password){
        System.out.println("执行了 register 方法");
        return 0;
    }

    public void methodAll(){
        methodA();
        methodB();
    }

    private void methodB() {

    }

    private void methodA() {

    }

}

aop使用
com\\example\\demo\\pointcut\\UserPointcut.java

package com.example.demo.pointcut;

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

@Aspect
@Component
public class UserPointcut {

    // 1.定义切面的规则
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointcut() {

    }

    // 2.添加通知
    @Before("pointcut()")
    public void doBefore() {
        System.out.println("执行了前置通知");
    }

    @After("pointcut()")
    public void doAfter() {
        System.out.println("执行了后置通知");
    }

    @AfterReturning("pointcut()")
    public void doReturing() {
        System.out.println("执行了返回之前通知的方法");
    }

    @AfterThrowing("pointcut()")
    public void doThrowing() {
        System.out.println("执行了抛出异常之前通知方法");
    }

    @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) {
        System.out.println("进入了环绕通知:方法执行之前");
        Object result = 0;
        try {
            // 执行被代理的方法
            result = joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();

        }
        System.out.println("执行环绕通知:执行了方法调用之后");
        return result;
    }
}

3运行即可


以上是关于SpringAOP的主要内容,如果未能解决你的问题,请参考以下文章

springAop 使用@Around,@After等注解时,代码运行两边的问题

SpringAOP的自定义注解实践

在SpringBoot中用SpringAOP实现日志记录功能

SpringAOP基础

Spring 04 -SpringAOP开发

springAOP之代理模式