关于Spring的AOP

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;

} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值