Spring 前置和后置处理器

今天处理一个问题,需要扫描java方法上面自定义注解。代码使用的spring后置处理器BeanPostProcessor.java的postProcessAfterInitialization(),方法代码如下

1     @Override
2     @Retryable(value = Exception.class, maxAttempts = 5, backoff = @Backoff(delay = 3000, multiplier = 2, maxDelay = 20000))
3     @CustomAnnotation
4     public void testRetry() {
5         System.out.println("in test retry: " + System.currentTimeMillis() / 1000);
6         int a = 1 / 0;
7         System.out.println("end in test retry");
8     }

有两个注解一个自定义、一个spring重试的注解。

后置处理器代码:

 1 @Component
 2 public class CustomBeanProcessor implements BeanPostProcessor {
 3     @Override
 4     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
 5         Method[] methods = bean.getClass().getDeclaredMethods();
 6         for (Method method : methods) {
 7             CustomAnnotation customAnnotation = method.getAnnotation(CustomAnnotation.class);
 8             if (beanName.equals("retryServiceImpl"))
 9                 System.out.println("beanName:" + beanName + ", method name: " + method.getName() + ", customAnnotation: " + customAnnotation);
10             if (customAnnotation != null) {
11                 System.out.println("##############");
12             }
13         }
14         return bean;
15     }
16 }

预期希望进入11行,输出#####。实际没有输出,通过9行打印bean和对应的方法

Spring 前置和后置处理器

 

 有cglib关键字和一些spring生成的方法。可以判断spring通过cglib生成了其他方法,也影响到了注解的扫描。

修改为使用前置处理器,这个时候bean还没有被初始化,应该还没有被cglib处理。修改为前置处理器

 1 @Component
 2 public class CustomBeanProcessor implements BeanPostProcessor {
 3     @Override
 4     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
 5         Method[] methods = bean.getClass().getDeclaredMethods();
 6         for (Method method : methods) {
 7             CustomAnnotation customAnnotation = method.getAnnotation(CustomAnnotation.class);
 8             if (beanName.equals("retryServiceImpl"))
 9                 System.out.println("beanName:" + beanName + ", method name: " + method.getName() + ", customAnnotation: " + customAnnotation);
10             if (customAnnotation != null) {
11                 System.out.println("##############");
12             }
13         }
14         return bean;
15     }
16 }

扫描到自定义注解,打印出####

Spring 前置和后置处理器

 

上一篇:一文读懂Spring框架中Bean的生命周期


下一篇:Spring源码之创建AOP代理之增强器的获取