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");
        }
    }
  • 相关阅读:
    执行sudo命令时command not found的解决办法
    CentOS7编译安装libc++和libc++abi
    CentOS 7 编译安装clang+llvm
    如何使用 Issue 管理软件项目?
    西门子 S7-300 PLC 从入门到精通的100个经典问题
    PLC_SIM 出现I/O访问错误-技术论坛-工业支持中心-西门子中国
    C# Lambda表达式
    C# Task中的Func, Action, Async与Await的使用
    C#委托的介绍(delegate、Action、Func、predicate)
    委托 你怎么看?
  • 原文地址:https://www.cnblogs.com/BonnieWss/p/11533960.html
Copyright © 2011-2022 走看看