我的编程空间,编程开发者的网络收藏夹
学习永远不晚

springboot注解Aspect的实现方案是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

springboot注解Aspect的实现方案是什么

这篇文章跟大家分析一下“springboot注解Aspect的实现方案是什么”。内容详细易懂,对“springboot注解Aspect的实现方案是什么”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“springboot注解Aspect的实现方案是什么”的知识吧。

    目标

    下面提供一种自定义注解,来实现业务审批操作的DEMO,不包含审批流程的配置功能。
    具体方案是
    自定义一个Aspect注解,拦截sevice方法,将拦截的信息持久化,待审批;审批时获取持久化数据,执行目标方法。

    实现

    POM

    <?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.8</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.proc</groupId><artifactId>process-test</artifactId><version>1.0.0-SNAPSHOT</version><name>process-test</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><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><!-- 用于主线程给子线程传递数据,支持线程池 --><dependency>    <groupId>com.alibaba</groupId>    <artifactId>transmittable-thread-local</artifactId>    <version>2.12.2</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

    一些实体类

    CheckedParam

    用于包装页面传进来的参数

    package com.proc.model;import java.util.List;public class CheckedParam {//业务标记,由页面传入,用于审批时页面根据tagPageJs解析data,渲染到页面,审批管理员可看到审批的内容private String tagPageJs;//页面传入的原始数据private List<String> data;public String getTagPageJs() {return tagPageJs;}public void setTagPageJs(String tagPageJs) {this.tagPageJs = tagPageJs;}public List<String> getData() {return data;}public void setData(List<String> data) {this.data = data;}}
    ProcessDbModel

    拦截的信息包装类,用于持久化数据

    package com.proc.model;public class ProcessDbModel {//bean的目标类全限定名private String targetClassName;//拦截到的service方法名private String methodName;//页面传入的tagPageJs或Checked注解的tagprivate String tag;private String description;//拦截到的service入参类型,包含泛型信息private String paramTypes;//拦截到的service入参值private String paramArgs;//拦截到的service入参值或页面传入的原始数据private String data;public String getTargetClassName() {return targetClassName;}public void setTargetClassName(String targetClassName) {this.targetClassName = targetClassName;}public String getMethodName() {return methodName;}public void setMethodName(String methodName) {this.methodName = methodName;}public String getTag() {return tag;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public void setTag(String tag) {this.tag = tag;}public String getParamTypes() {return paramTypes;}public void setParamTypes(String paramTypes) {this.paramTypes = paramTypes;}public String getParamArgs() {return paramArgs;}public void setParamArgs(String paramArgs) {this.paramArgs = paramArgs;}public String getData() {return data;}public void setData(String data) {this.data = data;}@Overridepublic String toString() {return "ProcessDbModel [targetClassName=" + targetClassName + ", methodName=" + methodName + ", tag=" + tag+ ", description=" + description + ", paramTypes=" + paramTypes + ", paramArgs=" + paramArgs + ", data="+ data + "]";}}

    测试用的入参对象

    package com.proc.model;import java.math.BigDecimal;public class Score {private BigDecimal langue;private BigDecimal math;private BigDecimal english;public BigDecimal getLangue() {return langue;}public void setLangue(BigDecimal langue) {this.langue = langue;}public BigDecimal getMath() {return math;}public void setMath(BigDecimal math) {this.math = math;}public BigDecimal getEnglish() {return english;}public void setEnglish(BigDecimal english) {this.english = english;}@Overridepublic String toString() {return "Score [langue=" + langue + ", math=" + math + ", english=" + english + "]";}}
    package com.proc.model;import java.util.List;public class Person<T> {private String name;private String age;private String sex;private String testName;private String salary;private String work;private List<T> grades;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getSalary() {return salary;}public void setSalary(String salary) {this.salary = salary;}public String getTestName() {return testName;}public void setTestName(String testName) {this.testName = testName;}public String getWork() {return work;}public void setWork(String work) {this.work = work;}public List<T> getGrades() {return grades;}public void setGrades(List<T> grades) {this.grades = grades;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + ", sex=" + sex + ", testName=" + testName + ", salary="+ salary + ", work=" + work + ", grades=" + grades + "]";}}

    一些工具类

    JacksonCanonicalUtil

    package com.proc.util;import com.fasterxml.jackson.core.type.TypeReference;import com.fasterxml.jackson.databind.JavaType;import com.fasterxml.jackson.databind.json.JsonMapper;public class JacksonCanonicalUtil {private static final JsonMapper MAPPER = new JsonMapper();private JacksonCanonicalUtil () {}public static <T> String toCanonical (Class<T> clazz) {return MAPPER.getTypeFactory().constructType(clazz).toCanonical();}public static <T> String toCanonical (TypeReference<T> tr) {return MAPPER.getTypeFactory().constructType(tr).toCanonical();}//反序列化时从持久数据中获取JavaTypepublic static JavaType constructFromCanonical (String canonical) {return MAPPER.getTypeFactory().constructFromCanonical(canonical);}}

    StringZipUtil

    用于压缩和解压字符串,减少持久数据占用空间

    package com.proc.util;import java.io.ByteArrayOutputStream;import java.io.OutputStream;import java.nio.charset.StandardCharsets;import java.util.Base64;import java.util.zip.DeflaterOutputStream;import java.util.zip.InflaterOutputStream;public class StringZipUtil {private StringZipUtil () {}public static String zipBase64(String text) {        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {            try (OutputStream os = new DeflaterOutputStream(out)) {            os.write(text.getBytes(StandardCharsets.UTF_8));            }            return Base64.getEncoder().encodeToString(out.toByteArray());        } catch (Exception e) {throw new RuntimeException("压缩字符串出错", e);}    }public static String unzipBase64(String text) {        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {            try (OutputStream os = new InflaterOutputStream(out)) {            os.write(Base64.getDecoder().decode(text));            }            return new String(out.toByteArray(), StandardCharsets.UTF_8);        } catch (Exception e) {throw new RuntimeException("解压字符串出错", e);}    }}
    Base64Util

    一些参数值转为Base64后持久化

    package com.proc.util;import java.nio.charset.StandardCharsets;import java.util.ArrayList;import java.util.Base64;import java.util.List;import java.util.stream.Collectors;import com.fasterxml.jackson.databind.json.JsonMapper;public class Base64Util {private Base64Util () {}private static final JsonMapper MAPPER = new JsonMapper();public static String[] toStrings (Object[] objs) {List<String> list = new ArrayList<>();try {for (Object obj : objs) {list.add(MAPPER.writeValueAsString(obj));}} catch (Exception e) {throw new RuntimeException("序列化对象出错", e);}return list.toArray(new String[0]);}public static String encode (String[] strs) {List<String> list = new ArrayList<>();for (String str : strs) {list.add(Base64.getEncoder().encodeToString(str.getBytes(StandardCharsets.UTF_8)));}String join = list.stream().collect(Collectors.joining("|"));return join;}public static String[] decode (String text) {String[] strs = text.split("\\|", -1);List<String> list = new ArrayList<>();for (String base64 : strs) {list.add(new String(Base64.getDecoder().decode(base64), StandardCharsets.UTF_8));}return list.toArray(new String[0]);}public static String encodeZip (Object[] objs) {return encodeZip(toStrings(objs));}public static String encodeZip (String[] strs) {List<String> list = new ArrayList<>();for (String str : strs) {list.add(StringZipUtil.zipBase64(str));}String join = list.stream().collect(Collectors.joining("|"));return StringZipUtil.zipBase64(join);}public static String[] decodeZip (String text) {String str = StringZipUtil.unzipBase64(text);String[] strs = str.split("\\|", -1);List<String> list = new ArrayList<>();for (String base64 : strs) {list.add(StringZipUtil.unzipBase64(base64));}return list.toArray(new String[0]);}}
    SpringBootBeanUtil
    package com.proc.util;import java.util.Map;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Component;@Componentpublic class SpringBootBeanUtil implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {SpringBootBeanUtil.applicationContext = applicationContext;}public static ApplicationContext getApplicationContext() {return applicationContext;}public static Object getBean(String name) {return applicationContext.getBean(name);}public static <T> T getBean(Class<T> clazz) {return (T) applicationContext.getBean(clazz);}public static <T> T getBean(String name, Class<T> clazz) {return applicationContext.getBean(name, clazz);}public static <T> Map<String, T> getBeansOfType(Class<T> clazz) {return applicationContext.getBeansOfType(clazz);}}
    ProcessBeanUtil

    用于执行目标方法

    package com.proc.util;import java.lang.reflect.Method;import org.springframework.util.ReflectionUtils;public class ProcessBeanUtil {private ProcessBeanUtil () {}public static Object excuteBeanMethod (String targetClassName, String methodName, Class<?>[] parameterTypes, Object[] args) {Class<?> targetClass;try {targetClass = Class.forName(targetClassName);} catch (ClassNotFoundException e) {throw new RuntimeException("未找到类", e);}return excuteBeanMethod(targetClass, methodName, parameterTypes, args);}public static Object excuteBeanMethod (Class<?> targetClass, String methodName, Class<?>[] parameterTypes, Object[] args) {Object bean = SpringBootBeanUtil.getBean(targetClass);Method method = ReflectionUtils.findMethod(targetClass, methodName, parameterTypes);return ReflectionUtils.invokeMethod(method, bean, args);}}
    CheckedTransmitableUtil

    用于传递业务参数

    package com.proc.util;import com.alibaba.ttl.TransmittableThreadLocal;import com.proc.model.CheckedParam;public class CheckedTransmitableUtil {private static final TransmittableThreadLocal<CheckedParam> threadLocal = new TransmittableThreadLocal<>();private CheckedTransmitableUtil () {}public static void set (CheckedParam checkedParam) {threadLocal.set(checkedParam);}public static CheckedParam getAndRemove () {CheckedParam checkedParam = threadLocal.get();threadLocal.remove();return checkedParam;}}
    PrivateTransmitableUtil

    为Aspect判断是否拦截提供依据

    package com.proc.util;import com.alibaba.ttl.TransmittableThreadLocal;public class PrivateTransmitableUtil {private static final String CHECKED = "__CHECKED__";private static final TransmittableThreadLocal<String> threadLocal = new TransmittableThreadLocal<>();private PrivateTransmitableUtil () {}public static void set () {threadLocal.set(CHECKED);}//是否执行的审批程序public static boolean isCheck () {String checked = threadLocal.get();threadLocal.remove();return CHECKED.equals(checked);}}

    一些Bean

    PostProcess

    用于拦截方法后做的个性处理

    package com.proc.bean;public interface PostProcess<T> {//返回说明内容,审批时在页面显示String description(String tag, Class<?>[] parameterTypes, Object[] args);//返回代替的返回值T retObject(String tag, Class<?>[] parameterTypes, Object[] args);}
    TestCheckPostProcess

    测试用

    package com.proc.bean;import org.springframework.stereotype.Component;@Componentpublic class TestCheckPostProcess implements PostProcess<String> {@Overridepublic String description(String tag, Class<?>[] parameterTypes, Object[] args) {return tag + "测试testCheck";}@Overridepublic String retObject(String tag, Class<?>[] parameterTypes, Object[] args) {return tag + "返回拦截响应";}}

    Aspect注解

    package com.proc.config;import static java.lang.annotation.ElementType.METHOD;import static java.lang.annotation.RetentionPolicy.RUNTIME;import java.lang.annotation.Retention;import java.lang.annotation.Target;import com.proc.bean.PostProcess;@Retention(RUNTIME)@Target(METHOD)public @interface Checked {String tag() default ""; String[] paramCanonical();Class<? extends PostProcess<?>> postProcess();}

    切面类 CheckedAop

    package com.proc.config;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.reflect.MethodSignature;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import com.proc.bean.PostProcess;import com.proc.model.CheckedParam;import com.proc.model.ProcessDbModel;import com.proc.service.ProcessDbService;import com.proc.util.Base64Util;import com.proc.util.CheckedTransmitableUtil;import com.proc.util.PrivateTransmitableUtil;import com.proc.util.SpringBootBeanUtil;@Component@Aspectpublic class CheckedAop {@Autowiredprivate ProcessDbService processDbService;//拦截Checked注释的方法@Pointcut("@annotation(com.proc.config.Checked)")public void check() {}@Around(value = "com.proc.config.CheckedAop.check() && @annotation(checked)")public Object around(ProceedingJoinPoint joinPoint, Checked checked) throws Throwable {MethodSignature signature = (MethodSignature) joinPoint.getSignature();Class<?>[] parameterTypes = signature.getParameterTypes();String methodName = signature.getMethod().getName();Object[] args = joinPoint.getArgs();if (PrivateTransmitableUtil.isCheck()) {//审批后,执行业务代码Object returnVal = joinPoint.proceed();return returnVal;} else {//不是审批操作,拦截Class<? extends PostProcess<?>> postProcess = checked.postProcess();PostProcess<?> bean = SpringBootBeanUtil.getBean(postProcess);//组装持久化数据ProcessDbModel dbModel = new ProcessDbModel();dbModel.setTargetClassName(joinPoint.getTarget().getClass().getName());dbModel.setMethodName(methodName);String tag = checked.tag();CheckedParam checkedParam = CheckedTransmitableUtil.getAndRemove();if (checkedParam == null || checkedParam.getTagPageJs() == null || checkedParam.getTagPageJs().isEmpty()) {//不是页面调用的业务,使用注解的tag,data保存为service的参数,这时需要页面专门解析渲染String[] argStrs = Base64Util.toStrings(args);dbModel.setParamArgs(Base64Util.encodeZip(argStrs));dbModel.setData(Base64Util.encode(argStrs));} else {tag = checkedParam.getTagPageJs();dbModel.setParamArgs(Base64Util.encodeZip(args));dbModel.setData(Base64Util.encode(checkedParam.getData().toArray(new String[0])));}dbModel.setTag(tag);dbModel.setParamTypes(Base64Util.encodeZip(checked.paramCanonical()));dbModel.setDescription(bean.description(tag, parameterTypes, args));//持久化数据processDbService.save(dbModel);return bean.retObject(tag, parameterTypes, args);}}}

    线程池配置

    测试用

    package com.proc.config;import java.util.concurrent.Executor;import java.util.concurrent.ThreadPoolExecutor;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import com.alibaba.ttl.threadpool.TtlExecutors;@Configurationpublic class TaskExecutePoolConfig {@Beanpublic Executor processExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();//核心线程池大小executor.setCorePoolSize(10);//最大线程数executor.setMaxPoolSize(10);//队列容量executor.setQueueCapacity(500);//活跃时间executor.setKeepAliveSeconds(60);        //线程名字前缀executor.setThreadNamePrefix("ProcessExecutor-"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());// 等待所有任务结束后再关闭线程池executor.setWaitForTasksToCompleteOnShutdown(true);executor.initialize();//用transmittable-thread-local包装,才可以正确给线程池中的线程传递数据return TtlExecutors.getTtlExecutor(executor);}}

    持久化service

    为测试方便,未真正实现持久化

    package com.proc.service;import com.proc.model.ProcessDbModel;public interface ProcessDbService {void save (ProcessDbModel model);ProcessDbModel get ();}
    package com.proc.service.impl;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import com.proc.model.ProcessDbModel;import com.proc.service.ProcessDbService;@Componentpublic class ProcessDbServiceImpl implements ProcessDbService {private static final Logger log = LoggerFactory.getLogger(ProcessDbService.class);private volatile ProcessDbModel model;@Overridepublic void save(ProcessDbModel model) {this.model = model;log.info(model.toString());}@Overridepublic ProcessDbModel get() {return this.model;}}

    审批用的service

    package com.proc.service;import com.proc.model.ProcessDbModel;public interface ProcessCheckService {void process (ProcessDbModel model);}
    package com.proc.service.impl;import java.util.ArrayList;import java.util.List;import java.util.Objects;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Service;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.JavaType;import com.fasterxml.jackson.databind.json.JsonMapper;import com.proc.model.ProcessDbModel;import com.proc.service.ProcessCheckService;import com.proc.util.Base64Util;import com.proc.util.JacksonCanonicalUtil;import com.proc.util.PrivateTransmitableUtil;import com.proc.util.ProcessBeanUtil;@Servicepublic class ProcessCheckServiceImpl implements ProcessCheckService {private static final Logger log = LoggerFactory.getLogger(ProcessCheckServiceImpl.class);private static final JsonMapper MAPPER = new JsonMapper();@Overridepublic void process(ProcessDbModel model) {PrivateTransmitableUtil.set();String[] paramArgs = Base64Util.decodeZip(model.getParamArgs());String[] paramTypes = Base64Util.decodeZip(model.getParamTypes());List<Class<?>> parameterTypes = new ArrayList<>();List<Object> args = new ArrayList<>();try {for (int i = 0; i < paramTypes.length; i++) {JavaType javaType = JacksonCanonicalUtil.constructFromCanonical(paramTypes[i]);parameterTypes.add(javaType.getRawClass());args.add(MAPPER.readValue(paramArgs[i], javaType));}} catch (JsonProcessingException e) {throw new RuntimeException("反序列化对象出错", e);}Object ret = ProcessBeanUtil.excuteBeanMethod(model.getTargetClassName(),model.getMethodName(),parameterTypes.toArray(new Class<?>[0]),args.toArray(new Object[0]));log.info(Objects.toString(ret));}}

    测试用的service

    package com.proc.service;import com.proc.model.Person;import com.proc.model.Score;public interface TestService {String testCheck(Person<Score> person, String team);String testCheck2(Person<Score> person, String team);String testCheckAsync(Person<Score> person, String team);}
    package com.proc.service.impl;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.scheduling.annotation.Async;import org.springframework.stereotype.Service;import com.proc.bean.TestCheckPostProcess;import com.proc.config.Checked;import com.proc.model.Person;import com.proc.model.Score;import com.proc.service.TestService;@Servicepublic class TestServiceImpl implements TestService {private static final Logger log = LoggerFactory.getLogger(TestServiceImpl.class);//paramCanonical对应testCheck的参数类型@Checked(paramCanonical = {"com.proc.model.Person<com.proc.model.Score>", "java.lang.String"},postProcess = TestCheckPostProcess.class)@Overridepublic String testCheck(Person<Score> person, String team) {log.info(team + ">>>>" + person);return "target方法";}@Checked(tag = "A1",paramCanonical = {"com.proc.model.Person<com.proc.model.Score>", "java.lang.String"},postProcess = TestCheckPostProcess.class)@Overridepublic String testCheck2(Person<Score> person, String team) {log.info(team + ">>2>>" + person);return "target2方法";}@Async("processExecutor")@Checked(paramCanonical = {"com.proc.model.Person<com.proc.model.Score>", "java.lang.String"},postProcess = TestCheckPostProcess.class)@Overridepublic String testCheckAsync(Person<Score> person, String team) {log.info(team + ">>>>" + person);return "target方法";}}

    审批用的controller

    package com.proc.ctrl;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import com.proc.model.ProcessDbModel;import com.proc.service.ProcessCheckService;import com.proc.service.ProcessDbService;@RestControllerpublic class ProcessCheckController {private static final Logger log = LoggerFactory.getLogger(ProcessCheckController.class);@Autowiredprivate ProcessDbService processDbService;@Autowiredprivate ProcessCheckService processCheckService;@GetMapping(value = "process")public String process() {ProcessDbModel processDbModel = processDbService.get();log.info(processDbModel.toString());processCheckService.process(processDbModel);return "审批成功";}}

    测试用的controller

    package com.proc.ctrl;import java.math.BigDecimal;import java.util.ArrayList;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import com.proc.model.CheckedParam;import com.proc.model.Person;import com.proc.model.Score;import com.proc.service.TestService;import com.proc.util.CheckedTransmitableUtil;@RestControllerpublic class TestController {@Autowiredprivate TestService testService;//模拟页面调用@GetMapping(value = "index")public String testCheck() {CheckedParam checkedParam = new CheckedParam();checkedParam.setTagPageJs("01");List<String> data = new ArrayList<>();data.add("前端传进来的数据1");data.add("前端传进来的数据2");checkedParam.setData(data);CheckedTransmitableUtil.set(checkedParam);Person<Score> person = new Person<>();person.setName("一个人");person.setAge("18");person.setSex("1");person.setSalary("20000.00");person.setTestName("测试人");person.setWork("工作");Score score1 = new Score();score1.setEnglish(new BigDecimal("12.4"));score1.setLangue(new BigDecimal("764"));score1.setMath(new BigDecimal("87.4"));Score score2 = new Score();score2.setEnglish(new BigDecimal("12.4"));score2.setLangue(new BigDecimal("764"));score2.setMath(new BigDecimal("87.4"));List<Score> list = new ArrayList<>();list.add(score1);list.add(score2);person.setGrades(list);testService.testCheck(person, "team>>>>>>>>");return "12345";}//模拟其他渠道调用@GetMapping(value = "index2")public String testCheck2() {Person<Score> person = new Person<>();person.setName("一个人");person.setAge("18");person.setSex("1");person.setSalary("20000.00");person.setTestName("测试人");person.setWork("工作");Score score1 = new Score();score1.setEnglish(new BigDecimal("12.4"));score1.setLangue(new BigDecimal("764"));score1.setMath(new BigDecimal("87.4"));Score score2 = new Score();score2.setEnglish(new BigDecimal("12.4"));score2.setLangue(new BigDecimal("764"));score2.setMath(new BigDecimal("87.4"));List<Score> list = new ArrayList<>();list.add(score1);list.add(score2);person.setGrades(list);testService.testCheck2(person, "team>>>2>>>>>");return "12345";}//模拟调用异步方法@GetMapping(value = "index3")public String testCheckAsync() {CheckedParam checkedParam = new CheckedParam();checkedParam.setTagPageJs("01");List<String> data = new ArrayList<>();data.add("前端传进来的数据1");data.add("前端传进来的数据2");checkedParam.setData(data);CheckedTransmitableUtil.set(checkedParam);Person<Score> person = new Person<>();person.setName("一个人");person.setAge("18");person.setSex("1");person.setSalary("20000.00");person.setTestName("测试人");person.setWork("工作");Score score1 = new Score();score1.setEnglish(new BigDecimal("12.4"));score1.setLangue(new BigDecimal("764"));score1.setMath(new BigDecimal("87.4"));Score score2 = new Score();score2.setEnglish(new BigDecimal("12.4"));score2.setLangue(new BigDecimal("764"));score2.setMath(new BigDecimal("87.4"));List<Score> list = new ArrayList<>();list.add(score1);list.add(score2);person.setGrades(list);testService.testCheckAsync(person, "team>>>3>>>>>");return "12345";}}

    开启异步功能

    package com.proc;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.scheduling.annotation.EnableAsync;@SpringBootApplication@EnableAsyncpublic class ProcessTestApplication {public static void main(String[] args) {SpringApplication.run(ProcessTestApplication.class, args);}}

    关于springboot注解Aspect的实现方案是什么就分享到这里啦,希望上述内容能够让大家有所提升。如果想要学习更多知识,请大家多多留意小编的更新。谢谢大家关注一下编程网网站!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    springboot注解Aspect的实现方案是什么

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    springboot注解Aspect的实现方案是什么

    这篇文章跟大家分析一下“springboot注解Aspect的实现方案是什么”。内容详细易懂,对“springboot注解Aspect的实现方案是什么”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着
    2023-06-26

    SpringBoot的@Autowired注解注入规则是什么

    这篇文章主要讲解了“SpringBoot的@Autowired注解注入规则是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot的@Autowired注解注入规则是什么”吧
    2023-06-25

    怎么实现SpringBoot的底层注解

    本篇文章为大家展示了怎么实现SpringBoot的底层注解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、@Configuration注解1、基本使用自定义配置类/** * 1、@Configur
    2023-06-15

    springboot怎么实现对注解的切面

    本篇内容介绍了“springboot怎么实现对注解的切面”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!对注解实现切面案例:(1)定义一个注解
    2023-06-22

    springboot启动类的三大注解是什么

    Spring Boot启动类通常使用三个注解:@SpringBootApplication、@EnableAutoConfiguration和@RestController(可选)。1. @SpringBootApplication:这是启
    2023-08-31

    android依赖注入的实现方式是什么

    Android中依赖注入的实现方式有以下几种:1. 构造函数注入:通过在类的构造函数中传入依赖对象的实例来实现注入。这种方式最为简单直接,但是对于依赖对象多的情况下,构造函数会变得很长。2. Setter方法注入:通过提供一个公开的Sett
    2023-10-09

    springboot实现配置两个parent的方法是什么

    本篇文章为大家展示了springboot实现配置两个parent的方法是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。配置两个parent的方法在向pom.xml 文件中添加依赖之前需要先添加s
    2023-06-22

    Java中JNDI注入的实现方法是什么

    这篇文章主要讲解了“Java中JNDI注入的实现方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中JNDI注入的实现方法是什么”吧!About JNDI0x01 简介JNDI
    2023-06-25

    Springboot中filter的原理与注册方法是什么

    今天小编给大家分享一下Springboot中filter的原理与注册方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
    2023-07-05

    spring注解的底层实现原理是什么

    Spring注解的底层实现原理主要依赖于Java的反射机制。在Spring中,通过使用注解来标识类、方法或字段,从而告诉Spring容器如何处理它们。当Spring容器启动时,它会扫描应用程序中的注解,并根据注解的信息生成相应的对象和配置。
    2023-10-09

    ora-65096的解决方案是什么

    今天就跟大家聊聊有关ora-65096的解决方案是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。创建命令:create user newuser identified by ne
    2023-06-04

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录