参考@Repository 会自动加入PersistenceExceptionTranslationAdvisor
实现mapper接口方法拦截
1.自定义注解
@Target(
AnnotationTarget.VALUE_PARAMETER,
AnnotationTarget.FIELD,
AnnotationTarget.FUNCTION
)
@Retention(AnnotationRetention.RUNTIME)
@Documented
@Inherited
annotation class ORMEncrypt {
}
2.使用注解标记mapper接口中的方法
@Mapper
@Repository
interface GameServerMapper {
@ORMEncrypt
fun getIp(@Param("status") @ORMEncrypt status: String,@Param("ip") ip : String): String
}
3.定义自己的方法拦截处理器
class ORMInterceptor :MethodInterceptor {
override fun invoke(methodInvocation: MethodInvocation): Any {
return methodInvocation.proceed()
}
}
4.定义自己的advisor关联拦截器和切入点
class ORMEncryptAdvisor(
private val ormInterceptor: ORMInterceptor,
private val pointcut:AnnotationMatchingPointcut
) : AbstractPointcutAdvisor(){
override fun getAdvice(): Advice =ormInterceptor
override fun getPointcut(): Pointcut =pointcut
}
5.将advisor加在每个代理的bean内
class ORMEncryptAnnotationBeanPostProcessor :
AbstractBeanFactoryAwareAdvisingPostProcessor() {
private val repositoryAnnotationType: Class<out Annotation> = ORMEncrypt::class.java
override fun setBeanFactory(beanFactory: BeanFactory) {
super.setBeanFactory(beanFactory)
this.advisor = ORMEncryptAdvisor(ORMInterceptor(), AnnotationMatchingPointcut.forMethodAnnotation(repositoryAnnotationType))
}
}
6.启动拦截
@Bean
fun ormProcessor()=ORMEncryptAnnotationBeanPostProcessor()