这是我的config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="com">
       <context:include-filter type="assignable" expression="com.coc.frmwk.cmd.Command"/>
       <context:include-filter type="assignable" expression="com.coc.apps.sample.dao.SampleDAO"/>
    </context:component-scan>

<bean id="myPostProcessor" class="com.coc.frmwrk.processors.MyPostProcessor">
</beans>

我知道使用组件扫描时,将分配给Bean的默认范围是“单个”,除非在xml配置中或使用注释@Scope另行指定,这很酷,但是由于我已经发现了我的应用程序中所有实现特定接口(com.coc.frmwk.cmd.Command)的bean都需要将其范围设置为“prototype”,因此我添加了一个实现ScopeMetaDataResolver的类“ScopeResolver”,并对我进行了少许修改config.xml,以便容器考虑我的作用域解析器:
<context:component-scan base-package="com" scope-resolver="com.coc.frmwk.processors.ScopeResolver">

我的问题是,BeanPostProcessor曾经可以完美地工作,但是每当我添加范围解析器时,它都会停止调用(context:component-scan base-package =“com” scope-resolver =“com.xxx.frmwk.processors.ScopeResolver “),当我省略粗体字的内容时,它将再次起作用。

在配置ScopeResolver时如何使BeanPostProcessor工作的想法吗?
谢谢,Mehdi。

编辑:这是我的作用域解析器的内容
package com.coc.frmwk.processors;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.ScopeMetadata;
import org.springframework.context.annotation.ScopeMetadataResolver;

import com.coc.frmwk.cmd.Command;

public class ScopeResolver implements ScopeMetadataResolver{

    @SuppressWarnings("unchecked")
    @Override
    public ScopeMetadata resolveScopeMetadata(BeanDefinition definition) {
        ScopeMetadata result = new ScopeMetadata();

        Class c= null;
        try {
            c = Class.forName(definition.getBeanClassName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        if (Command.class.isAssignableFrom(c))
        result.setScopeName("prototype");
        else
        result.setScopeName("singleton");

        System.out.println("[Scope Resolver] " + definition.getBeanClassName() + "[" + result.getScopeName() + "]");

        return result;
    }

}

Edit2:我想指出,实际上是在调用BeanPostProcessor,但显然,它适用于所有Bean,但其范围由ScopeMeteDataResolver更改的除外。

最佳答案

您描述的行为是我期望的行为。 (至少在启动时),一旦构造了bean,就会调用BeanPostProcessor,仅在请求时构造原型作用域的bean。因此,如果您不在任何地方使用此bean,就不会调用BeanPostProcessor

但是,从您想要的内容来看,您想要修改配方(BeanDefinition,而不是创建的bean实例)。要更改食谱,您需要使用BeanFactoryPostProcessor

区别在于BeanPostProcessor在Bean实例上运行,而BeanFactoryPostProcessor在Bean创建配方(BeanDefinitions)上起作用。

关于java - BeanPostProcessor未调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5624334/

10-09 02:30