1、定义Java注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE}) public @interface DataSource { String value();}// 注解将要写到类型(Class/Interface)还是其它元素(Method等)上,支持package、type、method、field等,一般只会配置一个
2、定义切点
(1)定义一个空方法
(2)使用
@Piontcut
标注,填入切点表达式(3)示例
(4)切点表达式(@Pointcut后面括号内的内容)的有效格式@Pointcut("execution (* com.rrfare.dao.*.* (..))") // 在执行com.rrfare.dao下面所有类型的所有方法时生效! public void dataOperationCut(){}; @Before("dataOperationCut()") public void doBefore(JoinPoint jp) { // doSomething }
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注解,根据具体值来动态设置数据源