这是我的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/