1.spring的两个特性
①、IOC:将创建对象的权利交给Spring,然后开发者用的时候,从spring容器去取。
②、AOP:切面。定义一个切点,你想在方法执行之前做什么,想在切点之后做什么
i、面向切面编程的好处:可以最大可能的提高编程效率(假如要打印所有方法的入参和出参,每个方法都需要在开头和结尾写log.info,而切面可以让我们直接生成)
ii、什么时候用切面:当你觉得代码有相同点的时候
2.实现(可以用来进行限流、幂等性校验等)
①、pom引入aop的注解
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
②、 自定义注解
@Target(ElementType.METHOD) // 注解只能用于方法 @Retention(RetentionPolicy.RUNTIME) // 修饰注解的生命周期 @Documented public @interface RepeatSubmit { /** * 防重复操作过期时间,默认1s */ long expireTime() default 1; }
③、编写aop逻辑
a、@Aspect:声明这是一个切面类(使用时需要与@Component注解一起用,表明同时将该类交给spring管理)
b、定义切点
@Around:增强处理,用于指定【advice】的类型,是Around、Before、After、AfterReturning这四种类型中能力最强的一种
@Before:用于指定【advice】的类型,表示该【advice】在切点方法之前执行
@After:用于指定【advice】的类型,表示该【advice】在切点方法之后执行
@AfterReturning:用于指定【advice】的类型,功能与@After类似,不同点是可以捕获切点方法的返回值并进行增强处理(具体咋回事也没弄懂)
@AfterThrowing:当切点方法抛出异常时会执行该【advice】
@Slf4j @Component @Aspect public class RepeatSubmitAspect { * 定义切点 */ //为设置的注解的地址 @Pointcut("@annotation(com.example.demo.annotation.RepeatSubmit)") public void repeatSubmit() {} @Around("repeatSubmit()") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { //实现逻辑 }