在运行时检查所有带注释方法的参数

时间:2011-10-04 14:58:44

标签: java spring annotations aspectj interceptor

如何在启动时对注释的所有用法执行检查?

例如,我有这个方面,它应用于使用@Protect注释的方法,它应用了一些安全策略。在整个系统中,我们使用@Protect("valid-operation-1")@Protect("valid-operation-2")@Protect("INVALID-operation")进行注释。一旦应用程序启动,我想检查为所有这些注释提供的参数,以便检测这些错误配置。

特别是,我将检查我们是否在Spring应用程序上下文中定义了一个bean,其ID与注释的参数匹配。这意味着,为了保护方法void drive(),我将使用@Protect("drive")进行注释,并期望bean protect_drive出现在应用程序上下文中。

您可以轻松地等到调用该方法,然后调用该通知,并检查该参数。然后你会看到INVALID-operation被错误地定义了。但这太晚了

是否可以在应用程序启动时检查所有带注释的方法?

1 个答案:

答案 0 :(得分:0)

如果您要检查的类是Spring Beans,那么您可以使用BeanPostProcessor

public class OnlyAScratchForAnPostProcessor {

    @Inject
    private ApplicationContext context;


    @Override
    public Object postProcessAfterInitialization(final Object bean,
        final String beanName) throws BeansException {

          ReflectionUtils.doWithMethods(bean.getClass(), new MethodCallback() {

             @Override
             public void doWith(Method method) throws IllegalArgumentException,
                         IllegalAccessException {

                  String expecedNameFromAnnotation = scanAnnotation(method);
                  if(expecedNameFromAnnotation != null) {
                      if(context.beanByName(expecedNameFromAnnotation) != null) {
                         throw new RuntimeException("illegal configuration");
                      }
                  }         
             }

             String scanAnnotation(Method method){...}

          }, ReflectionUtils.USER_DECLARED_METHODS);        

    }