需求
有时候我们希望写一个框架,让别人直接使用我们的注解。
然后这些注解就可以生效。
比如 spring 的 Cache 注解。
spring 的 @import
注解为我们带来了这种可能性。
方式
定义 aop
/**
* @author binbin.hou
* @since 0.0.4
*/
@Aspect
@Component
public class RetryAop {
/**
* 扫描所有的共有方法
*/
@Pointcut("execution(public * *(..))")
public void myPointcut() {
}
@Around("myPointcut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
// 具体的代码增强步骤
}
}
定义 config
我们在 config 中指定扫描当前框架包。
package com.github.houbb.sisyphus.spring.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* 重试 aop 配置
* @author binbin.hou
* @since 0.0.4
*/
@Configuration
@ComponentScan(basePackages = "com.github.houbb.sisyphus.spring")
public class RetryAopConfig {
}
EnableXXX 注解
为了用户方便开启注解,我们定义一个注解:
import com.github.houbb.sisyphus.spring.config.RetryAopConfig;
import org.springframework.cache.annotation.CachingConfigurationSelector;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.Import;
import java.lang.annotation.*;
/**
* 启用重试注解
* @author binbin.hou
* @since 0.0.4
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(RetryAopConfig.class)
@EnableAspectJAutoProxy
public @interface EnableRetry {
}
用于至于要在 config 中使用 @EnableRetry
就可以使得当前 AOP 生效。