AOP-Springboot

目录

概述

入门

核心概念

通知类型 

通知顺序 

切入点表达式

连接点 


概述

AOP就是面向特定方法编程

在实现的时候,动态代理是切面编程最主流的实现,而SpringAOP是Spring框架的高级技术,旨在管理bean对象的过程中,主要通过底层的动态代理机制,对特定的方法进行编程

入门

</dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
@Slf4j
@Component
@Aspect//AOP类
public class timeAspect {
    @Around("execution(* org.example.springquickstartaop.service.*.*(..))")//切入点表达式
    public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
        //记录开始时间
        long begin=System.currentTimeMillis();
        //调用原始方法运行
        Object result=joinPoint.proceed();
        //记录结束时间,计算方法执行耗时
        long end=System.currentTimeMillis();
        log.info("方法执行了{}",end-begin);
        return result;
    }

}

核心概念

通知类型 

切入点表达式重复性高,所以可以抽取出来 

 @PointCut就是将公共的切入点表达式抽取出来,需要用到时引用该切点表达式即可

通知顺序 

当有多个切面的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会被执行

1.不同切面类,按照默认切面类的类名字母排序

目标方法前的通知方法:字母排名靠前的先执行

目标方法后的通知方法:字母排名靠前的后执行

2.用@Order(数字)加在切面类上来控制顺序

目标方法前的通知方法:数字小的先执行

目标方法后的通知方法:数字大的后执行

切入点表达式

用来描述切入点方法的一种表达式,主要用来决定项目中哪些方法需要加入通知

常见形式

1.execution(......):根据方法的签名来匹配

2.@annotation(......):根据注解匹配

 

 

连接点 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,在Spring Boot项目中引入aop和数据库配置模块: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> ``` 然后,在application.properties中配置读写分离数据库连接信息,如下所示: ``` spring.datasource.write.jdbc-url=jdbc:mysql://localhost:3306/write_db?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.write.username=root spring.datasource.write.password=root spring.datasource.read.jdbc-url=jdbc:mysql://localhost:3306/read_db?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.read.username=root spring.datasource.read.password=root ``` 接着,在aop中定义切面,根据方法名判断是读操作还是写操作,并切换数据源。 ``` @Aspect @Component public class DataSourceAop { @Before("execution(* com.example.demo.service.*.*(..))") public void setDataSourceKey(JoinPoint point) { String methodName = point.getSignature().getName(); if (isSlave(methodName)) { DynamicDataSourceContextHolder.setDataSourceKey(DataSourceKey.read); } else { DynamicDataSourceContextHolder.setDataSourceKey(DataSourceKey.write); } } public boolean isSlave(String methodName) { // 判断是否为读方法 return methodName.startsWith("get") || methodName.startsWith("select") || methodName.startsWith("find"); } @After("execution(* com.example.demo.service.*.*(..))") public void clearDataSourceKey() { DynamicDataSourceContextHolder.clearDataSourceKey(); } } ``` 最后,定义一个DynamicDataSource类,该类继承AbstractRoutingDataSource类,并重写determineCurrentLookupKey方法,用于
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值