自定义注解+ProceedingJoinPoint拦截实现接口权限执行

16 篇文章 0 订阅
6 篇文章 0 订阅

一、概述

接口权限执行:当访问当dao层接口时,在接口的方法上放置自定义注解,对接口进行拦截

二、ProceedingJoinPoint

  • ProceedingJoinPoint是什么?

可以看出其继承于JoinPoint,及其关键方法proceed()【这个方法的用途:继续下一个建议或目标方法调用(就是用于启动目标方法执行的,不调用该方法的话就走自己的逻辑)

在这里插入图片描述

  • ProceedingJoinPointJointPoint的区别:

JointPointaop的,对象则包含了和切入相关的很多信息比如切入点的对象,方法,属性等。我们可以通过反射的方式获取这些点的状态和信息,用于追踪tracing和记录logging应用信息。
ProceedingJoinPointaspectj的,其继承于JointPoint所以主要作用是多了这个proceed()方法,这个方法主要针对代理链(可以从下面这个方法执行看),(暴露出proceed()是为了支撑aop:around 这个切面)aop:around 即环绕通知 =前置+目标方法执行+后置
面试官:什么是AOP?Spring AOP和AspectJ的区别是什么?在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方法很清晰的告诉我们这里会代理方法的调用(即我们的目标方法)
想了解代理链可以看看Spring AOP核心源码 JdkDynamicAopProxy

二、实现逻辑

  • 拦截实现(注解不写了)
@Slf4j
@Aspect
@Component
public class PermissionAop {
	//pointcut 是一种程序结构和规则,它用于选取join point并收集这些point的上下文信息。是这些join point的集合
	@Pointcut("@annotation(com.xx.Permission)")
    public void dataPermissionAspect() {}
	@Around("dataPermissionAspect()")
    public Object doAroundPermission(ProceedingJoinPoint pjp) throws Throwable {
    //根据业务逻辑判断,怎样直接放通
    //怎样就加一些逻辑,再让它进入接口方法
    Object[] args = pjp.getArgs();
    ...//这就跟JoinPoint差不多用法
    
    //反正return pjp.proceed();在每个判断条件都是走的
    return pjp.proceed();
}
}
  • 拦截dao层中自己需要的方法
@Repository
public interface DataMapper {
	@Permission
    List<Data> selectDataList(Data data);
}
  • JoinPoint一般获取
    在这里插入图片描述

三、最后

就到这里,可以根据自己的权限来判断拦截接口\(^o^)/~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你的问题是关于如何在Spring Boot应用中实现多数据源动态切换,使用的技术包括Spring Boot、MyBatis、MySQL、Oracle、Druid数据源连接池、自定义注解和切面,并且配置文件使用application.yml格式。 首先,需要在pom.xml文件中添加相应的依赖: ```xml <!--Spring Boot--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!--MyBatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <!--MySQL--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.23</version> </dependency> <!--Oracle--> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.3.0.0</version> </dependency> <!--Druid--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.6</version> </dependency> ``` 接下来,需要在application.yml文件中配置数据源和MyBatis相关的属性,例如: ```yaml spring: datasource: druid: # 数据源1 db1: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/db1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: root # 数据源2 db2: driver-class-name: oracle.jdbc.OracleDriver url: jdbc:oracle:thin:@localhost:1521:ORCL username: scott password: tiger # 默认数据源 url: jdbc:mysql://localhost:3306/db1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: root mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.demo.entity ``` 然后,需要定义一个自定义注解,用于标识哪些方法需要使用哪个数据源: ```java @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface DataSource { String value() default "db1"; } ``` 在数据源切换的时候,我们需要获取注解上指定的数据源名称,因此需要定义一个切面: ```java @Aspect @Component public class DataSourceAspect { @Around("@annotation(ds)") public Object around(ProceedingJoinPoint point, DataSource ds) throws Throwable { String dataSourceName = ds.value(); DynamicDataSource.setDataSource(dataSourceName); try { return point.proceed(); } finally { DynamicDataSource.clearDataSource(); } } } ``` 最后,需要定义一个动态数据源,用于实现数据源的切换: ```java public class DynamicDataSource extends AbstractRoutingDataSource { private static final ThreadLocal<String> dataSourceHolder = new ThreadLocal<>(); @Override protected Object determineCurrentLookupKey() { return dataSourceHolder.get(); } public static void setDataSource(String dataSourceName) { dataSourceHolder.set(dataSourceName); } public static void clearDataSource() { dataSourceHolder.remove(); } } ``` 至此,多数据源动态切换的配置就完成了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值