使用场景:当在配置文件中需要配置Bean(参数不同,class相同,id不同时)冗余的情况
继承 BeanFactoryPostProcessor 覆盖 postProcessBeanFactory()方法
例子:RPC 客服端动态代理
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
public class ClientBeanRegist implements BeanFactoryPostProcessor{
private Map<String,Class> targetInterfaces = new HashMap<String,Class>();
private String refClientName;
public void setTargetInterfaces(Map<String, Class> targetInterfaces) {
this.targetInterfaces = targetInterfaces;
}
public void setRefClientName(String refClientName) {
this.refClientName = refClientName;
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
DefaultListableBeanFactory defaultBeanFactory=(DefaultListableBeanFactory) beanFactory;
for (@SuppressWarnings("rawtypes") Map.Entry<String,Class> initBean : targetInterfaces.entrySet()) {
String id=initBean.getKey();
Class targetInterface = initBean.getValue();
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(FactoryBeanProxy.class);
beanDefinitionBuilder.addConstructorArgValue(targetInterface);
beanDefinitionBuilder.addPropertyReference("client",refClientName);
AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
defaultBeanFactory.registerBeanDefinition(id, beanDefinition);
}
}
}
<bean class="com.wp.client.ClientBeanRegist" >
<property name="targetInterfaces">
<map>
<entry key="number" value="test.Number"/>
</map>
</property>
<property name="refClientName" value="client"></property>
</bean>
<bean id="client" class="com.wp.client.RemoteRPCClient">