系列文章目录
手写SpringBoot(一)之简易版SpringBoot
手写SpringBoot(二)之动态切换Servlet容器
手写SpringBoot(三)之自动配置
手写SpringBoot(四)之bean动态加载
手写SpringBoot(五)之整合AOP
手写SpringBoot(五)之整合AOP
Spring开启aop只需要在任意一个加了@Configuration配置类的上面加上@EnableAspectJAutoProxy
注解就行
新建my-spring-boot-starter-aop模块
- 引入aspectj依赖
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.5</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.9.5</version></dependency><dependency><groupId>cn.axj</groupId><artifactId>my-spring-boot-configuration</artifactId><version>1.0-SNAPSHOT</version></dependency>
- 创建AopAutoConfiguration配置类,并配置@EnableAspectJAutoProxy注解
package cn.axj.aop.springboot.config;import cn.axj.springboot.my.config.AutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration
public class AopAutoConfiguration implements AutoConfiguration {@Configuration@EnableAspectJAutoProxystatic class AspectjConfiguration{}
}
- 创建配置类文件 META-INF/service/cn.axj.springboot.my.config.AutoConfiguration文件,并将AopAutoConfiguration的路径配置进去
cn.axj.aop.springboot.config.AopAutoConfiguration
下面开始测试,在user-servcie模块中引入my-spring-boot-starter-aop
<dependency><groupId>cn.axj</groupId><artifactId>my-spring-boot-starter-aop</artifactId><version>1.0-SNAPSHOT</version></dependency>
- 创建aop包,并创建TestAopAnnotation注解
package cn.axj.user.aop;import java.lang.annotation.*;@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TestAopAnnotation {}
- 创建aop代理类TestAop
package cn.axj.user.aop;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;@Aspect
@Component
public class TestAop {@Around("@annotation(cn.axj.user.aop.TestAopAnnotation)")public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {Object proceed = proceedingJoinPoint.proceed();String after = "after advice";return after + "____" + proceed;}
}
- 在TestController ,test方法上面加上注解@TestAopAnnotation
@GetMapping(value = "/test")@TestAopAnnotationpublic String test(Integer id){return userService.test(id).toString();}
开启user-service模块
访问localhost:8080/test?id=2
返回
after advice____User{id=2, username='lisi'},看到返回aop代理字符串after advice____,aop开启成功
系列文章目录
手写SpringBoot(一)之简易版SpringBoot
手写SpringBoot(二)之动态切换Servlet容器
手写SpringBoot(三)之自动配置
手写SpringBoot(四)之bean动态加载
手写SpringBoot(五)之整合AOP