SpringFramework:以编程方式设置bean名称

时间:2016-08-05 20:35:15

标签: java spring

对于基于springframwork的应用程序,当使用xml声明bean时,可以通过传递唯一值甚至参数来配置bean id,然后在运行时解析该值。

现在我希望将所有xml配置替换为java注释。

假设我想创建两个具有不同id的数据库bean。

bean.xml
<bean id="A.database" class="org.apache.commons.dbcp.BasicDataSource">
    <!-- collaborators and configuration for this bean go here -->
</bean>   

<bean id="B.database" class="org.apache.commons.dbcp.BasicDataSource">
    <!-- collaborators and configuration for this bean go here -->
</bean> 

然后我将上层代码优化为一个bean,其中两个属性文件用于两个应用程序

bean.xml
<bean id="${appName.database}"   class="org.apache.commons.dbcp.BasicDataSource">
    <!-- collaborators and configuration for this bean go here -->
</bean> 

applicationA.properties    
appName.database=A.database

applicationB.properties
appName.database=B.database

整个应用程序由&#34;框架&#34;模块,它为每个应用程序提供通用的bean,比如数据库bean,jdbcTemplate bean和&#34; application&#34; module,它为占位符提供属性值,并初始化具有唯一id的bean。因此,即使我同时启动多个应用程序,他们也会从上下文中找到相应的bean。

一般来说,我希望做到

@Bean(name = "${beanName}")
public ABean getBean() {}

并在应用程序级别解析$ {beanName}。

2 个答案:

答案 0 :(得分:2)

通过阅读SpringFramwork文档,我找到了答案:BeanNameGenerator

NameGenerator.class

public class NameGenerator implements BeanNameGenerator{

@Override
public String generateBeanName(BeanDefinition definition,
        BeanDefinitionRegistry registry) {
    if(definition.getBeanClassName().contains("Toto")) {
        return "toto";
    }
    return return definition.getBeanClassName();
    }
}

AppConfiguration.class

@Configuration
@ComponentScan(basePackages = {"com.example.domain"}, nameGenerator = NameGenerator.class)
public class Config {
}

@Component

的域类
@Component
public class Toto {
    private int id;
}

使用域bean名称的BootApplication:toto

@SpringBootApplication
public class DemoApplication {

public static void main(String[] args) {
    ConfigurableApplicationContext ctx = SpringApplication.run(
            DemoApplication.class, args);
    for (String name : ctx.getBeanNamesForType(Toto.class)) {
        System.out.println(name);
    }
}
}

答案 1 :(得分:1)

如果您想要遵循这种类型的方法,请创建多个配置类,并使用不同的Spring profiles进行注释。

在启动时,您可以传递要使用的配置文件的参数,以及在相关配置文件中加载的bean。

更有效的方法是在所有应用程序.properties文件中使用相同的属性命名约定。为文件名设置参数占位符,该文件名解析为在运行时传递的JVM arg,由@PropertySource注释加载。

如果它只是正在发生变化的属性,则不需要为不同的环境定义重复的bean。