zoukankan      html  css  js  c++  java
  • 自定义注解

    自定义注解:

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface TestAnnotation {
        String value() default "";
        String name() default "";
    }

    使用自定义注解:

    @Service
    public class TestAnnotationService {
    
        @TestAnnotation(value = "myTestAnnotation")
        public String test(String s) {
            return s;
        }
    }

    要实现的功能是:在类加载后打印自定义注解的值

    @Component
    public class MyBeanPostProcessor implements BeanPostProcessor {
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            if(beanName.equals("testAnnotationService")){
                Class clazz = bean.getClass();
                Method[] methods=clazz.getDeclaredMethods();
                if(methods.length>0){
                    for(Method method:methods){
                        TestAnnotation annotation=method.getAnnotation(TestAnnotation.class);
                        if(annotation!=null){
                            System.out.println("222222"+annotation.value());
                        }
                    }
                }
            }
            return bean;
        }
    }

     这样在方法加载的时候就会打印222222myTestAnnotation

    注:

    BeanPostProcessor也称为Bean后置处理器,它是Spring中定义的接口,在Spring容器的创建过程中(具体为Bean初始化前后)会回调BeanPostProcessor中定义的两个方法。BeanPostProcessor的源码如下:

    public interface BeanPostProcessor {
    
        @Nullable
        default Object postProcessBeforeInitialization(Object bean, String beanName)     throws BeansException {
            return bean;
        }
    
        @Nullable
        default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
    }

    在方法调用前后,或者调用方法时获取注解并写相应的业务逻辑,可以使用切面的方式。

    @Aspect
    @Component
    public class TestAspect {
        @Before("@annotation(com.tkp.coupon.web.myself.annotation.TestAnnotation)")
        public void before(JoinPoint joinPoint) {
            System.out.println("before the method");
        }
    }
  • 相关阅读:
    ssh scp命令详解
    python模块与包
    python参数Sample Code
    python 多线程简介
    python virtualenv环境安装(ubuntu)
    python pip 代理设置
    mysql资源总结
    mysql索引原理及用法
    Oracle学习笔记:利用user_segments查表的大小
    Oracle学习笔记:dba_tables、all_tables、user_tables区别
  • 原文地址:https://www.cnblogs.com/BonnieWss/p/11533960.html
Copyright © 2011-2022 走看看