我试图在java代码(spring-boot project)中将Datasource实例注册为bean
这是我写的。 (此代码无效。)
@Configuration
public class DatabaseConfig {
private Logger logger = Logger.getLogger(DatabaseConfig.class);
@Autowired
ApplicationContext context;
private Map<String, Map<String, String>> dsMap;
private Map<String, String> getTestDataSourceInfo () {
Map<String, String> ds = new HashMap<String, String> ();
ds.put("driverClassName", "com.mysql.jdbc.Driver");
ds.put("url", "jdbc:mysql://123.456.78.912:3306/test");
ds.put("username", "testuser");
ds.put("password", "testuser");
return ds;
}
public DatabaseConfig () {
this.dsMap = new HashMap<String, Map<String, String>>();
dsMap.put("sampleDs", getTestDataSourceInfo());
}
@PostConstruct
public void loadDataSource () {
logger.info("DS ================================ :: " + String.valueOf(this.dsMap));
this.dsMap.forEach((k,v) -> {
logger.info("value ========================== :: " + String.valueOf(v));
DataSource aSource = DataSourceBuilder.create()
.driverClassName(v.get("driverClassName"))
.url(v.get("url"))
.username(v.get("username"))
.password(v.get("password"))
.build();
// PROBLEM STARTS ..............
// Add datasource instance with name to context
context.getAutowireCapableBeanFactory().autowireBean(aSource);
});
}
}
有没有正确的方法来注册bean与实例? 我找不到任何好的样品。
仅供参考,我在上面的代码中所期望的是......
Configure
loadDatasource
方法但是,它不起作用。所以我很好奇如何将java实例作为bean添加到当前的Spring启动应用程序上下文中。
答案 0 :(得分:3)
实际上,如果我不使用DataSource
执行此操作,可能会更容易。
因为,Spring-boot会自动配置dataSource
,所以我必须先禁用此设置。
以下是我为实现目标所做的工作
在@Configuration
班级......
@Configuration
public class DatabaseConfig {
private Logger logger = Logger.getLogger(DatabaseConfig.class);
@Autowired
ApplicationContext context;
private Map<String, Map<String, String>> dsMap;
private Map<String, String> getTestDataSourceInfo () {
Map<String, String> ds = new HashMap<String, String> ();
ds.put("driverClassName", "${ your driverClassName }");
ds.put("url", "${ your url }");
ds.put("username", "${ your user }");
ds.put("password", "${ your password }");
return ds;
}
public DatabaseConfig () {
this.dsMap = new HashMap<String, Map<String, String>>();
dsMap.put("sampleDs1", getTestDataSourceInfo());
dsMap.put("sampleDs2", getTestDataSourceInfo());
}
@PostConstruct
public void loadDataSource () {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) context.getAutowireCapableBeanFactory();
this.dsMap.forEach((k,v) -> {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(BasicDataSource.class);
v.forEach((ds_key, ds_val) -> {
builder.addPropertyValue(ds_key, ds_val);
});
BeanDefinition def = builder.getBeanDefinition();
if(!registry.containsBeanDefinition(k)) registry.registerBeanDefinition(k, def);
});
}
}
在上面的课程中,我可以使用BeanDefinitionRegistry
和BeanDefinitionBuilder
将java实例添加到spring bean。
如果这只是一个bean,它会在这里结束,但你想要添加的是DataSource
bean,还需要做一些额外的工作。
因为,引导自动设置DataSource
,我们必须禁用该设置来注册自定义数据源。
在@SpringbootApplication
课程中,添加@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
。
现在,您可以通过@Autowired
和@Qualifier
在其他bean中使用这些bean。
感谢。