我有一个基于Spring 4的应用程序,并使用@Named
批注。
@Named("test")
public class DocumentMapper implements Mapper<Test> {
在这里,“命名”注释的名称 test 被硬编码。相对于硬编码名称,是否可以使其属性驱动?
我尝试了以下方法:
public class NameGenerator implements BeanNameGenerator {
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
if(definition.getBeanClassName().contains("DocumentMapper")) {
return "test";
}
}
}
在这里,我想根据属性返回bean名称。如何注入我的属性配置类?
答案 0 :(得分:1)
您可以使用BeanDefinitionRegistryPostProcessor
界面:
扩展到标准BeanFactoryPostProcessor SPI,允许 在常规之前注册进一步的bean定义 BeanFactoryPostProcessor检测开始。特别是, BeanDefinitionRegistryPostProcessor可以注册其他bean 依次定义BeanFactoryPostProcessor实例的定义。
例子是(这里我想用MyBean
属性的名称注册bean.name
类):
@Component
public class BeanDefinitionRegistryPP implements BeanDefinitionRegistryPostProcessor, EnvironmentAware {
private Environment env;
@Override
public void setEnvironment(Environment environment) {
this.env=environment;
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
GenericBeanDefinition beanDefinition= new GenericBeanDefinition();
beanDefinition.setBeanClass(MyBean.class);
registry.registerBeanDefinition(env.getProperty("bean.name"), beanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// no code
}
}