1、定义Java注解
@Retention(RetentionPolicy.RUNTIME)
// 注解将要写到类型(Class/Interface)还是其它元素(Method等)上,支持package、type、method、field等,一般只会配置一个
@Target({ElementType.TYPE}) public @interface DataSource { String value();}
2、定义切点
(1)定义一个空方法
(2)使用@Piontcut
标注,填入切点表达式
(3)示例
@Pointcut("execution (* com.rrfare.dao.*.* (..))") // 在执行com.rrfare.dao下面所有类型的所有方法时生效!
public void dataOperationCut(){};
@Before("dataOperationCut()")
public void doBefore(JoinPoint jp) {
// doSomething
}
(4)切点表达式(@Pointcut后面括号内的内容)的有效格式
execution:用于匹配方法执行的连接点;
within:用于匹配指定类型内的方法执行;
this:用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配;
target:用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配;
args:用于匹配当前执行的方法传入的参数为指定类型的执行方法;
@within:用于匹配所以持有指定注解类型内的方法;
@target:用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解;
@args:用于匹配当前执行的方法传入的参数持有指定注解的执行;
@annotation:用于匹配当前执行方法持有指定注解的方法;
bean:Spring AOP扩展的,AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法;
reference pointcut:表示引用其他命名切入点,只有@ApectJ风格支持,Schema风格不支持
3、第1步和第2步没有任何关系
4、动态数据源的实现思路
(1)Spring提供了Dynamic DataSource机制
(2)在需要切换数据源的位置(Class、Interface、Method等的上面)定义Java注解
(3)使用AOP对以上位置进行拦截,并解析出Java注解,根据具体值来动态设置数据源