用动态名称命名的javax.inject.Name

时间:2019-01-23 00:22:37

标签: java spring

我有一个基于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名称。如何注入我的属性配置类?

1 个答案:

答案 0 :(得分:1)

如果您的目标是以编程方式注册bean(使用自定义bean名称)

您可以使用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
     }
}