自定义注解:
@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"); } }