gpt4 book ai didi

javax.inject.Named 使用动态名称

转载 作者:行者123 更新时间:2023-12-02 10:21:31 26 4
gpt4 key购买 nike

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

最佳答案

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

您可以使用BeanDefinitionRegistryPostProcessor接口(interface),它是:

Extension to the standard BeanFactoryPostProcessor SPI, allowing for the registration of further bean definitions before regular BeanFactoryPostProcessor detection kicks in. In particular, BeanDefinitionRegistryPostProcessor may register further bean definitions which in turn define BeanFactoryPostProcessor instances.

示例是(这里我想使用 bean.name 属性中的名称注册 MyBean 类):

@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
}
}

关于javax.inject.Named 使用动态名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54318346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com