BeanPostProcessor未在MVC上下文中调用

时间:2014-09-02 07:53:47

标签: spring spring-bean

我有一个带有上下文hirarchy的Web应用程序

a)扫描的应用程序上下文,不包括控制器:

<context:component-scan base-package="com.mypackage">
        <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation" />
    </context:component-scan>

b)包含控制器的mvc上下文:

<context:component-scan base-package="com.mypackage"
        use-default-filters="false">
        <context:include-filter expression="org.springframework.stereotype.Controller"
            type="annotation" />
    </context:component-scan>

我写了&#39;这个beanPostProcessor(自动设置记录器)

@Component
public class LoggableInjector implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
        ReflectionUtils.doWithFields(bean.getClass(), new FieldCallback() {
            public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
                ReflectionUtils.makeAccessible(field);
                if (field.getAnnotation(Loggable.class) != null) {
                    Logger log = LoggerFactory.getLogger(bean.getClass());
                    field.set(bean, log);
                }
            }
        });
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {
        ReflectionUtils.doWithFields(bean.getClass(), new FieldCallback() {
            public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
                ReflectionUtils.makeAccessible(field);
                if (field.getAnnotation(Loggable.class) != null) {
                    Logger log = LoggerFactory.getLogger(bean.getClass());
                    field.set(bean, log);
                }
            }
        });
        return bean;
    }

}

问题是我没有为@Controller类调用这个处理器,因为它只在自己的上下文中处理bean。

我怎样才能使它处理mvc上下文中的bean(即@Controller)?

谢谢!

1 个答案:

答案 0 :(得分:0)

https://jira.spring.io/browse/SPR-8331

以下是Spring明确表示的内容。

PostProcessor只能在PostProcessor本身所属的上下文中处理bean,而不能处理Hierarchical context。

我想到的唯一方法是在你要加载的所有上下文中添加PostProcessor。