java自定义注解的使用

关于自定义注解的声明网上有很多文章在讲解,本文侧重于对自定义注解的使用。

第一种用法:启动时获取自定义注解标记的类

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);
    }

不过第二种使用方式不通过自定义注解也是可以实现的。

经验分享 程序员 微信小程序 职场和发展