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");
        }
    }
  • 相关阅读:
    RabbitMQ:六、网络分区
    RabbitMQ:五、高阶
    RabbitMQ:四、跨越集群
    数据结构:红黑树
    RabbitMQ:三、进阶
    面对对象多态的异常
    面向对象三大特征---多态
    面对对象继承的优点和缺点
    面对对象当中的代码块
    面对对象this关键字
  • 原文地址:https://www.cnblogs.com/BonnieWss/p/11533960.html
Copyright © 2011-2022 走看看