关于自定义注解的声明网上有很多文章在讲解,本文侧重于对自定义注解的使用。
第一种用法:启动时获取自定义注解标记的类
1.创建一个自定义注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface MyConf {
String value() default "";
String appName() default "";
}
2.写一个类实现ApplicationContextAware在springBoot项目启动的时候加载自定义注解标记的类
@Component
@Configuration
public class InitTest implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("开始获取自定义注解标记的类");
Map<String, Object> beansWithAnnotation = applicationContext.getBeansWithAnnotation(MyConf.class);
for (Map.Entry<String,Object> entry : beansWithAnnotation.entrySet()){
System.out.println(entry.getKey() + "::" + entry.getValue().getClass());
System.out.println();
}
}
}
这样就可以获取到自定义注解标记的类啦。
第二种用法:AOP捕获
1.创建一个自定义注解
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface MyAop {
String apiPath() default "";
}
2.创建AOP
@Aspect
@Component
@Slf4j
public class TestAop {
private static final Logger logger = LoggerFactory.getLogger(TestAop.class);
@Autowired
private HttpServletRequest servletRequest;
//切点表达式 指向我们的自定义注解所在的路径
@Pointcut("@annotation(cn.lzh.my.config.annotation.MyAop)")
public void myaopPoint() {
}
@Before("myaopPoint()")
public void myBefore(JoinPoint point){
logger.info("请求接口:{}",this.servletRequest.getRequestURI());
logger.info("请求参数:{}",JSONObject.toJSONString(point.getArgs()) );
logger.info("请求IP:{}",this.getIpAddress(servletRequest));
}
3.在方法上加上我们的自定义注解就可以使用啦
@MyAop(apiPath = "testMyAop")
@RequestMapping(value = "/testMyAop",method = RequestMethod.GET)
public ResultBean typeList(){
return ResultBean.success(1);
}
不过第二种使用方式不通过自定义注解也是可以实现的。