对于基于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}。
答案 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。