代码之家  ›  专栏  ›  技术社区  ›  user1578872

以动态名称命名的javax.inject.

  •  0
  • user1578872  · 技术社区  · 5 年前

    我有一个基于Spring4的应用程序并使用 @Named 注释。

    @Named("test")
    public class DocumentMapper implements Mapper<Test> {
    

    这里,这个名字 测试 因为命名注释是硬编码的。 是否可以使其属性驱动,而不是硬编码名称?

    我尝试了以下方法:

    public class NameGenerator implements BeanNameGenerator {
    
       public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
         if(definition.getBeanClassName().contains("DocumentMapper")) {
    
                return "test";
            }
       }
    }
    

    这里,我想返回基于属性的bean名称。如何插入属性配置类?

    谢谢

    1 回复  |  直到 5 年前
        1
  •  1
  •   Abdelghani Roussi    5 年前

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

    你可以使用 BeanDefinitionRegistryPostProcessor 接口是:

    标准BeanFactoryPostProcessor SPI的扩展,允许 在常规的bean定义之前注册更多的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
         }
    }