栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring--AOP--执行顺序--用法/实例

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring--AOP--执行顺序--用法/实例

原文网址:Spring--AOP--执行顺序--用法/实例_IT利刃出鞘的博客-CSDN博客

简介

        本文用示例介绍Spring(SpringBoot)的AOP的执行顺序。

公共代码

启动类

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoSpringaopSimpleApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoSpringaopSimpleApplication.class, args);
    }
}

Entity

package com.example.demo.entity;

import lombok.Data;

@Data
public class User {
    private Integer id;
    private String userName;
    private String note;
}

Service

package com.example.demo.service;

import com.example.demo.entity.User;

public interface UserService {
    public void printUser(User user);
}
package com.example.demo.service.impl;

import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {
    @Override
    public void printUser(User user) {
        if (user == null) {
            throw new RuntimeException("检查用户参数是否为空");
        }
        System.out.print("id = " + user.getId());
        System.out.print("t userName = " + user.getUserName());
        System.out.println("t note = " + user.getNote());
    }
}

Controller

package com.example.demo.controller;

import com.example.demo.annotation.OperationLog;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@RequestMapping("/user")
@Controller
public class UserController {
    @Autowired
    UserService userService;

    @RequestMapping("/print")
    @ResponseBody
    public User testPrint(User user) {
        userService.printUser(user);
        return user;
    }

    @RequestMapping("/add")
    @ResponseBody
    @OperationLog(type = "添加", desc = "添加数据")
    public User testAdd(User user) {
        return user;
    }

    @RequestMapping("/update")
    @ResponseBody
    @OperationLog(type = "更新", desc = "更新数据")
    public User testUpdate(User user) {
        userService.printUser(user);
        return user;
    }
}
两AOP+@Order(都不调用proceed()) 代码

AOP1

package com.example.demo.aspect;

import com.example.demo.annotation.OperationLog;
import com.example.demo.entity.User;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Aspect
@Component
@Order(1)
public class SimpleAspect {
    @Pointcut("execution(* com.example.demo.service.impl.UserServiceImpl.printUser(..))")
    public void pointCut() {

    }

    @Before("pointCut()")
    public void before() {
        System.out.println("SimpleAspect.before");
    }

    @Around("pointCut()")
    public void around2(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("SimpleAspect.around2:"+ "around before");
        // joinPoint.proceed();
        System.out.println("SimpleAspect.around2:" + "around after");
    }

    @After("pointCut()")
    public void after() {
        System.out.println("SimpleAspect.after");
    }

    @AfterReturning("pointCut()")
    public void afterReturning() {
        System.out.println("SimpleAspect.afterReturning");
    }

    @AfterThrowing("pointCut()")
    public void afterThrowing() {
        System.out.println("SimpleAspect.afterThrowing");
    }
}

 AOP2

package com.example.demo.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Aspect
@Component
@Order(2)
public class OrderTestAspect {
    @Pointcut("execution(* com.example.demo.service.impl.UserServiceImpl.printUser(..))")
    public void pointCut() {

    }

    @Before("pointCut()")
    public void before() {
        System.out.println("OrderTestAspect.before");
    }

    @Around("pointCut()")
    public void around1(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("OrderTestAspect.around1:" + "around before");
        // joinPoint.proceed();
        System.out.println("OrderTestAspect.around1:" + "around after");
    }

    @After("pointCut()")
    public void after() {
        System.out.println("OrderTestAspect.after");
    }

    @AfterReturning("pointCut()")
    public void afterReturning() {
        System.out.println("OrderTestAspect.afterReturning");
    }

    @AfterThrowing("pointCut()")
    public void afterThrowing() {
        System.out.println("OrderTestAspect.afterThrowing");
    }
}
测试

正常顺序

postman访问:http://localhost:8080/user/print?id=321&userName=Tony¬e=abc

后端结果

SimpleAspect.around2:around before
SimpleAspect.around2:around after

前端结果

{
    "id": 321,
    "userName": "Tony",
    "note": "abc"
}

颠倒顺序

postman访问:http://localhost:8080/user/print?id=321&userName=Tony¬e=abc

后端结果

OrderTestAspect.around1:around before
OrderTestAspect.around1:around after

前端结果

{
    "id": 321,
    "userName": "Tony",
    "note": "abc"
}
两AOP+@Order(都调用proceed()) 代码

AOP1

package com.example.demo.aspect;

import com.example.demo.annotation.OperationLog;
import com.example.demo.entity.User;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Aspect
@Component
@Order(1)
public class SimpleAspect {
    @Pointcut("execution(* com.example.demo.service.impl.UserServiceImpl.printUser(..))")
    public void pointCut() {

    }

    @Before("pointCut()")
    public void before() {
        System.out.println("SimpleAspect.before");
    }

    @Around("pointCut()")
    public void around1(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("SimpleAspect.around1:" + "around before");
        joinPoint.proceed();
        System.out.println("SimpleAspect.around1:" + "around after");
    }

    @After("pointCut()")
    public void after() {
        System.out.println("SimpleAspect.after");
    }

    @AfterReturning("pointCut()")
    public void afterReturning() {
        System.out.println("SimpleAspect.afterReturning");
    }

    @AfterThrowing("pointCut()")
    public void afterThrowing() {
        System.out.println("SimpleAspect.afterThrowing");
    }
}

AOP2 

package com.example.demo.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Aspect
@Component
@Order(2)
public class OrderTestAspect {
    @Pointcut("execution(* com.example.demo.service.impl.UserServiceImpl.printUser(..))")
    public void pointCut() {

    }

    @Before("pointCut()")
    public void before() {
        System.out.println("OrderTestAspect.before");
    }

    @Around("pointCut()")
    public void around2(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("OrderTestAspect.around1:" + "around before");
        joinPoint.proceed();
        System.out.println("OrderTestAspect.around1:" + "around after");
    }

    @After("pointCut()")
    public void after() {
        System.out.println("OrderTestAspect.after");
    }

    @AfterReturning("pointCut()")
    public void afterReturning() {
        System.out.println("OrderTestAspect.afterReturning");
    }

    @AfterThrowing("pointCut()")
    public void afterThrowing() {
        System.out.println("OrderTestAspect.afterThrowing");
    }
}
测试

正常顺序

后端结果

SimpleAspect.around1:around before
SimpleAspect.before
OrderTestAspect.around1:around before
OrderTestAspect.before
id = 321	 userName = Tony	 note = abc
OrderTestAspect.afterReturning
OrderTestAspect.after
OrderTestAspect.around1:around after
SimpleAspect.afterReturning
SimpleAspect.after
SimpleAspect.around1:around after

postman结果

{
    "id": 321,
    "userName": "Tony",
    "note": "abc"
}

颠倒顺序之后

后端结果

OrderTestAspect.around1:around before
OrderTestAspect.before
SimpleAspect.around1:around before
SimpleAspect.before
id = 321	 userName = Tony	 note = abc
SimpleAspect.afterReturning
SimpleAspect.after
SimpleAspect.around1:around after
OrderTestAspect.afterReturning
OrderTestAspect.after
OrderTestAspect.around1:around after

postman结果:

{
    "id": 321,
    "userName": "Tony",
    "note": "abc"
}
两AOP+@Order(高优先级调用proceed()) 代码

AOP1

package com.example.demo.aspect;

import com.example.demo.annotation.OperationLog;
import com.example.demo.entity.User;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Aspect
@Component
@Order(1)
public class SimpleAspect {
    @Pointcut("execution(* com.example.demo.service.impl.UserServiceImpl.printUser(..))")
    public void pointCut() {

    }

    @Before("pointCut()")
    public void before() {
        System.out.println("SimpleAspect.before");
    }

    @Around("pointCut()")
    public void around1(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("SimpleAspect.around1:" + "around before");
        joinPoint.proceed();
        System.out.println("SimpleAspect.around1:" + "around after");
    }

    @After("pointCut()")
    public void after() {
        System.out.println("SimpleAspect.after");
    }

    @AfterReturning("pointCut()")
    public void afterReturning() {
        System.out.println("SimpleAspect.afterReturning");
    }

    @AfterThrowing("pointCut()")
    public void afterThrowing() {
        System.out.println("SimpleAspect.afterThrowing");
    }
}

AOP2 

package com.example.demo.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Aspect
@Component
@Order(2)
public class OrderTestAspect {
    @Pointcut("execution(* com.example.demo.service.impl.UserServiceImpl.printUser(..))")
    public void pointCut() {

    }

    @Before("pointCut()")
    public void before() {
        System.out.println("OrderTestAspect.before");
    }

    @Around("pointCut()")
    public void around1(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("OrderTestAspect.around1:" + "around before");
        // joinPoint.proceed();
        System.out.println("OrderTestAspect.around1:" + "around after");
    }

    @After("pointCut()")
    public void after() {
        System.out.println("OrderTestAspect.after");
    }

    @AfterReturning("pointCut()")
    public void afterReturning() {
        System.out.println("OrderTestAspect.afterReturning");
    }

    @AfterThrowing("pointCut()")
    public void afterThrowing() {
        System.out.println("OrderTestAspect.afterThrowing");
    }
}
测试

正常顺序

postman访问:http://localhost:8080/user/print?id=321&userName=Tony¬e=abc

后端结果

SimpleAspect.around1:around before
SimpleAspect.before
OrderTestAspect.around1:around before
OrderTestAspect.around1:around after
SimpleAspect.afterReturning
SimpleAspect.after
SimpleAspect.around1:around after

postman结果

{
    "id": 321,
    "userName": "Tony",
    "note": "abc"
}

颠倒顺序(低优先级调用proceed())

postman访问:http://localhost:8080/user/print?id=321&userName=Tony¬e=abc

后端结果

OrderTestAspect.around1:around before
OrderTestAspect.around1:around after

postman结果

{
    "id": 321,
    "userName": "Tony",
    "note": "abc"
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1002689.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号