1.自定义注解
@Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Log { String value() default ""; }
2.SpringBoot使用AOP统一处理请求日志
/** *切入点定义:拦截所有@Log注解的 */ @Pointcut("@annotation(com.entor.annotation.Log)") public void log(){} @Around("log()") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { long begin = System.currentTimeMillis(); Signature signature = joinPoint.getSignature(); if (signature instanceof MethodSignature){ //如果注解作用在方法上,是一个MethodSignature对象 ProceedingJoinPoint pjp; MethodSignature methodSignature = (MethodSignature)signature; //获取当前方法对象 Method method = methodSignature.getMethod(); Log logs = method.getAnnotation(com.entor.annotation.Log.class); log.info("注解的内容 :" + logs.value()); } // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 记录下请求内容 log.info("请求地址URL : " + request.getRequestURL().toString()); log.info("请求方法HTTP_METHOD : " + request.getMethod()); log.info("请求IP地址 : " + request.getRemoteAddr()); Enumeration<String> enu = request.getParameterNames(); while (enu.hasMoreElements()) { String name = (String) enu.nextElement(); log.info("参数名称name:{},参数值value:{}", name, request.getParameter(name)); } Object result = joinPoint.proceed(); long end = System.currentTimeMillis(); log.info("方法执行时间毫秒数 :" + (end-begin)); //处理完请求,返回内容 log.info("返回结果 :" + result); return result; } }
3.SpringBoot定时任务
@Scheduled
/**
* 一、结构
* corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份
* 注意事项:
*
* 每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是:
*
* (1)*:表示匹配该域的任意值。假如在Minutes域使用*, 即表示每分钟都会触发事件。
*
* (2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。
*
* (3)-:表示范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次
*
* (4)/:表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.
*
* (5),:表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。
*
* (6)L:表示最后,只能出现在DayofWeek和DayofMonth域。如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。
*
* (7)W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。
*
* (8)LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
*
* (9)#:用于确定每个月第几个星期几,只能出现在DayofWeek域。例如在4#2,表示某月的第二个星期三。
* 三、常用表达式例子
* (0)0/20 * * * * ? 表示每20秒 调整任务
* (1)0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务
* (2)0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作业
* (3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作
* (4)0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
* (5)0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
* (6)0 0 12 ? * WED 表示每个星期三中午12点
* (7)0 0 12 * * ? 每天中午12点触发
* (8)0 15 10 ? * * 每天上午10:15触发
* (9)0 15 10 * * ? 每天上午10:15触发
* (10)0 15 10 * * ? * 每天上午10:15触发
* (11)0 15 10 * * ? 2005 2005年的每天上午10:15触发
* (12)0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
* (13)0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
* (14)0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
* (15)0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
* (16)0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
* (17)0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
* (18)0 15 10 15 * ? 每月15日上午10:15触发
* (19)0 15 10 L * ? 每月最后一日的上午10:15触发
* (20)0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
* (21)0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
* (22)0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发
*/
package com.entor.scheduledTest; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; /** * @author 556 * @version 1.0.0 * @Description * @date 2022年02月25日周五 */ @Service public class ScheduledService { @Scheduled(cron = "0 0/10 8 ? * 2-6" )//设定闹钟定时任务,周一到周五早上8点,每隔10分钟再响 public void clock() { System.out.println("该起床了,上班了"); } }
4.SpringBoot异步调用Async
这个和定时器差不多,启动加上@EnableAsync ,只需要在我们需要异步的方法上面加上@Async注解
package com.entor.async; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; /** * @author 556 * @version 1.0.0 * @Description * @date 2022年02月25日周五 */ @Service public class AsyncService { @Async//异步执行的注解 public void test1() throws InterruptedException { System.out.println("AsyncService test1"); Thread.sleep(1000); } @Async public void test2() throws InterruptedException { System.out.println("AsyncService test2"); Thread.sleep(2000); } @Async public void test3() throws InterruptedException { System.out.println("AsyncService test3"); Thread.sleep(3000); } }
5.SpringBoot自定义参数获取
server.port=8090 student.id=1 student.name=张三 student.sex=男 student.age=20 #map对象 student.address.home=南宁市大学路2号 student.address.work=南宁市滨湖路3号 #集合/数值对象 student.courses=语文,数学,英语
package com.entor.controller; import com.entor.config.StudentConfig; import com.entor.config.TeacherConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * @author 556 * @version 1.0.0 * @Description * @date 2022年02月25日周五 */ @RestController public class PropertiesController { /** * 获取配置文件application.properties文件中自定义的参数配置 */ @Value("${student.id}") private Integer id; @Value("${student.name}") private String name; @Value("${student.sex}") private String sex; @Value("${student.age}") private Integer age; @Autowired private StudentConfig studentConfig; @Autowired private TeacherConfig teacherConfig; @GetMapping(value = "/get") public String get(){ return "编号:" + id + "姓名:" + name + "性别:" + sex + "年龄:" + age; } @GetMapping(value = "/getStudentConfig") public String getStudentConfig(){ return ",编号:" + studentConfig.getId() + ",姓名:" + studentConfig.getName() + ",性别:" + studentConfig.getSex() + ",年龄:" + studentConfig.getAge() + ",地址:" + studentConfig.getAddress() + ",课程" + studentConfig.getCourses(); } }
6.SpringBoot配置文件yml
book: id: 2 name: 三国演义 price: 90 author: 罗贯中 publisher: 清华大学出版社,人民出版社 sale-type: online: 网购 offline: - id: 1 name: 新华书店大学路分店 phone: 187646654 address: 南宁市大学路10号 - id: 2 name: 新华书店鲁班路分店 phone: 1876465244 address: 南宁市鲁班路10号
package com.entor.config; import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.core.io.ClassPathResource; /** * @author 556 * @version 1.0.0 * @Description * @date 2022年02月25日周五 */ @Configuration public class YamlConfig { @Bean public static PropertySourcesPlaceholderConfigurer properties() { PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer(); YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean(); // class引入 yaml.setResources(new ClassPathResource("customer.yml")); configurer.setProperties(yaml.getObject()); return configurer; } }