SpringaopAspect获取注解在类的⾃定义注解⾥⾯的参数在Spring Boot + Mybatis 动态数据源基础上,很多教程(⽂末附链接了)都是实现⽅法级别的切换,按照普遍教程都是这样的
1.声明⼀个⾃定义注解,并且带参数的
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataSource {
/**
* 数据源key值
* @return
*/
String value();
}
2.然后按照设置切点
@Before("@annotation(dataSource))")
3.再到实现上就是
@RestController
@RequestMapping("user")
public class SysUserController {
@Autowired
private SysUserService sysUserService;
@DataSource(value="master")
@PostMapping(value="/findAll")
public Object findAll() {
return sysUserService.findAll();
}
@DataSource(value="slave")
@PostMapping(value="/findAll2")
public Object findAll2() {
return sysUserService.findAll();
}
}
通过⽅法上的注解,来切换不同的数据源
但是我懒啊
需求就来了:::::
我不想⼀个⼀个⽅法写注解,⼤同⼩异参数⼜没有什么⼤变化,都是DataSource的key
我想只能在类上⾯注解,实现整个类的数据源变化
我还想有的⽅法可能不适⽤,我得有优先级,如果在⽅法上有注解话,优先使⽤⽅法上的
开搞:如何把数据源⾃定义注解放在类上,然后切点去扫描类,获取切点类上⾯的⾃定义参数,来实现切换数据源
主要⽅向就是切点设置这边啦直接贴出来
package com.wsh.demo.asp;
import com.fig.dynDataSource.DynamicDataSourceContextHolder;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.flect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import annotation.AnnotationUtils;
import annotation.Order;
import org.springframework.stereotype.Component;
import flect.Method;
/**
* @Author: wsh
*/
@Aspect
@Order(-1)  // 该切⾯应当先于 @Transactional 执⾏
@Component
public class DynamicDataSourceAspect {
private Logger logger = Class());
/**
* 切换数据源
*/
@Around("execution(@com.wsh.demo.asp.DataSource * *(..))")
public Object  aroundController(ProceedingJoinPoint pjp) throws Throwable {
// 获取切⼊的 Method
MethodSignature joinPointObject = (MethodSignature) Signature();
Method method = Method();
springboot aop
boolean flag = method.isAnnotationPresent(DataSource.class);
if (flag) {
DataSource dataSource = Annotation(DataSource.class);
setDataSource(dataSource,method);
} else {
// 如果⽅法上没有注解,则搜索类上是否有注解
DataSource classDataSource = AnnotationUtils.Method().getDeclaringClass(), DataSource.class);            if (classDataSource != null) {
setDataSource(classDataSource,method);
} else {
DynamicDataSourceContextHolder.clearDataSourceKey();
logger.info("没有注解使⽤默认的");
}
}
Object proceed = pjp.proceed();
// 将数据源置为默认数据源
DynamicDataSourceContextHolder.clearDataSourceKey();
return proceed;
}
private void setDataSource(DataSource dataSource,Method method ) {
if (!ainDataSourceKey(dataSource.value())) {
logger.info("DataSource [{}] doesn't exist, use default DataSource [{}] " + dataSource.value());
} else {
// 切换数据源
DynamicDataSourceContextHolder.setDataSourceKey(dataSource.value());
logger.info("Switch DataSource to [" + DataSourceKey() +
logger.info("Switch DataSource to [" + DataSourceKey() +                    "] in Method [" + Name() + "]");
}
}
}
感谢下⾯的⽂章,⼀个是教程,⼀个是优化时候,从切点上获取到灵光点

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。