如何在启动时对注释的所有用法执行检查?
例如,我有这个方面,它应用于使用@Protect
注释的方法,它应用了一些安全策略。在整个系统中,我们使用@Protect("valid-operation-1")
,@Protect("valid-operation-2")
或@Protect("INVALID-operation")
进行注释。一旦应用程序启动,我想检查为所有这些注释提供的参数,以便检测这些错误配置。
特别是,我将检查我们是否在Spring应用程序上下文中定义了一个bean,其ID与注释的参数匹配。这意味着,为了保护方法void drive()
,我将使用@Protect("drive")
进行注释,并期望bean protect_drive
出现在应用程序上下文中。
您可以轻松地等到调用该方法,然后调用该通知,并检查该参数。然后你会看到INVALID-operation
被错误地定义了。但这太晚了。
是否可以在应用程序启动时检查所有带注释的方法?
答案 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);
}