AOP是什么?
面向方面编程 (AOP) 通过提供另一种思考程序结构的方式来补充面向对象编程 。
有什么作用?
对方法进行增强。
重要概念
目标 - 英文 target,需要被增强的对象
通知 - 英文 advice,那些重复的逻辑,可以理解为增强
代理 - 英文 proxy,光有目标和通知还不够,需要代理来结合二者
连接点 - 英文 joinpoint,在 Spring 中特指方法执行(暗含方法执行时的相关信息)
切点 - 英文 pointcut,匹配连接点的条件,通知仅会在匹配切点的方法执行时被应用
切面 - 英文 aspect,通知和切点合在一起,称为切面
解决耗时问题
<!--引入切点表达式依赖-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
@Controller
@Aspect
@Slf4j
public class Aspect1 {
@Around("execution(* com.itheima.service.impl.PersonServiceImpl.*(..))")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
//获取时间
long start = System.nanoTime();
//调用目标对象方法
Object value = pjp.proceed();
//获取结束时间
long end = System.nanoTime();
//计算耗时并打印
log.info("共耗时:{}",end-start);
return value;
}
}
如果进行了AOP配置,那么容器中存放的是代理对象,注入的也是代理对象
切入点表达式
execution
使用切点表达式匹配要增强的方法。
@Around("execution(* com.itheima.service.impl.PersonServiceImpl.*(..))")
通知类型
@Around:环绕通知,一种手动调用目标对象方法的通知方法
@Before:前置通知,在目标方法执行之前执行
@AfterReturning :后置通知,在目标方法执行之后且没有异常时执行
@AfterThrowing :异常通知,在目标方法执行之后且出现异常时执行
@After :最终通知,在目标方法执行之后无论是否出现异常都执行
yaml配置
基础语法
注意:冒号和属性值之间有一个空格
spring:
aop:
proxy-target-class: true #设置代理方式
main:
allow-circular-references: true
name: 张益达
NAME: 张伟
email: 'zhangyida@163.com' #有特殊字符的值需要用引号引起来
username: ${spring.aop.proxy-target-class}
user:
username: 张益达
age: 18
address:
- 北京
- 湖北
- 天津
- 南京
数据读取
@Configuration
@Data
@ConfigurationProperties(prefix = "user")
public class UserConfig{
private String username;
private Integer age;
private String[] address;
}