写点什么

【增强】(注解)SSM 之配置多数据源

  • 2021 年 11 月 11 日
  • 本文字数:1315 字

    阅读完需:约 4 分钟

@Component


public @interface Service {


/**


  • The value may indicate a suggestion for a logical component name,

  • to be turned into a Spring bean in case of an autodetected component.

  • @return the suggested component name, if any


*/


String value() default "";


}


@Target 为注解执行的目标地址,没有查阅资料,自己总结的(欢迎指正)


ElementType.TYPE:执行的位置是在类或接口上。如果挂在方法和参数上会出现错误;


The annotation @Service is disallowed for this location


ElementType.METHOD:执行的位置是在方法上,同理挂在类或接口上会出现上述错误。


PARAMETER.PARAMETER :执行的位置是在参数上,例如典型的 @Param 就是挂在参数上的。


@Retention(RetentionPolicy.RUNTIME)


@Target(ElementType.PARAMETER)


public @interface Param {


String value();


}


@Retention(保留)注解说明,这种类型的注解会被保留到那个阶段. 有三个值:


RetentionPolicy.SOURCE :这种类型的 Annotations 只在源代码级别保留,编译时就会被忽略


RetentionPolicy.CLASS : 这种类型的 Annotations 编译时被保留,在 class 文件中存在,但 JVM 将会忽略


RetentionPolicy.RUNTIME : 这种类型的 Annotations 将被 JVM 保留,所以他们能在运行时被 JVM 或其他使用反射机制的代码所读取和使用.


然后编写我们自己的注解:


package com.guide.datasource;


import java.lang.annotation.ElementType;


import java.lang.annotation.Retention;


import java.lang.annotation.RetentionPolicy;


import java.lang.annotation.Target;


@Target({ ElementType.TYPE,ElementType.METHOD })


@Retention(RetentionPolicy.RUNTIME)


public @interface DataSource {


String value();


}


通过 AOP 来捕获并实现 @DataSource 注解。


spring_mybatis.xml


<bean id="dataSourceAspect" class="com.guide.datasource.DataSourceAspect" />


aop:config


<aop:aspect ref="dataSourceAspect">


<aop:pointcut id="dataSourcePointcut" expression="execution(* com.guide.service...(..))" />


<aop:before pointcut-ref="dataSourcePointcut" method="intercept" />


</aop:aspect>


</aop:config>


DataSourceAspect .java


package com.guide.datasource;


import java.lang.reflect.Method;


import org.aspectj.lang.JoinPoint;


import org.aspectj.lang.reflect.MethodSignature;


public class DataSourceAspect {


/**


  • 拦截目标方法,获取由 @DataSource 指定的数据源标识,设置到线程存储中以便切换数据源

  • @param point

  • @throws Exception


*/


public void intercept(JoinPoint point) throws Except


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


ion {


Class<?> target = point.getTarget().getClass();


MethodSignature signature = (MethodSignature) point.getSignature();


// 默认使用目标类型的注解,如果没有则使用其实现接口的注解


for (Class<?> clazz : target.getInterfaces()) {


resolveDataSource(clazz, signature.getMethod());


}


resolveDataSource(target, signature.getMethod());


}


/**


  • 提取目标对象方法注解和类型注解中的数据源标识

  • @param clazz

  • @param method


*/

评论

发布
暂无评论
【增强】(注解)SSM之配置多数据源