gpt4 book ai didi

java - Spring 框架 : set bean name programmatically

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:47 28 4
gpt4 key购买 nike

对于基于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

整个应用程序由“框架”模块组成,该模块提供每个应用程序通用的 bean,如数据库 bean、jdbcTemplate bean 和“应用程序”模块,该模块为占位符提供属性值并使用唯一 ID 初始化 beans。因此,即使我同时启动多个应用程序,它们也会从上下文中找到相应的 bean。

一般来说,我希望做

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

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

最佳答案

通过阅读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);
}
}
}

关于java - Spring 框架 : set bean name programmatically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38797420/

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