SpringBoot中使用AOP
AOP即面向切面的编程,将业务逻辑代码和琐碎逻辑代码分开,达到重用或者解耦的目的
Spring中的AOP有两种实现,一种是基于jdk的,一种是基于cglib的,AopAutoConfiguration中相关代码如下:

一、基于jdk的动态代理实现
1、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2、添加配置
spring.aop.proxy-target-class=false #默认true
3、实现接口
public interface IUserDao { void add(String username,String password); }
@Component public class UserDao implements IUserDao { public void add(String username,String password){ System.out.println("add [username="+username+",password="+password+"]"); } }
4、构建切面类
@Aspect @Component public class LogAspect { @Before("execution(* com.leiyuke.temp..*.*(..))") public void log(){ System.out.println("before method log done"); } @After("execution(* com.leiyuke.temp..*.*(..))") public void afterLog(JoinPoint point){ System.out.println("after method log done "+point.getTarget().getClass()+",args: "
+ Arrays.asList(point.getArgs())+", method: "+point.getSignature()); } }
5、测试如下:
@SpringBootApplication public class App { public static void main(String[] args) { ConfigurableApplicationContext context=SpringApplication.run(App.class, args); System.out.println(context.getBean(IUserDao.class).getClass()); context.getBean(IUserDao.class).add("sl","1234"); context.close(); } }

二、基于cglib的动态代理实现
默认cglib实现,只需把文件中配置项改为true,或删掉配置项,或不使用接口(直接用UserDao)都可以实现

总结
1)使用jdk动态代理需要满足两个条件,否则会使用默认的cglib
a)spring.aop.proxy-target-class=false
b)需要代理的类实现接口
2)使用cglib动态代理可以使用接口,也可以不使用接口,spring.aop.proxy-target-class可以设置为true或删掉
3)LogAspect是切面类,封装了横切关注点,使用@Aspect标记,并且装配到spring容器中
@Before是前置通知,调用add方法前先执行
@After是后置通知,调用完add方法后执行
参数execution(* com.edu.spring.springboot..*.*(..))表示该包(或者其子包)下的任何类中的任何方法都会被动态代理。
JoinPoint类中封装了被代理的对象,包括目标类、方法、参数。前置通知、后置通知都可以使用JoinPoint。
浙公网安备 33010602011771号