Spring Boot 将实例注册为 bean
Posted
技术标签:
【中文标题】Spring Boot 将实例注册为 bean【英文标题】:Spring boot register an instance as a bean 【发布时间】:2017-06-27 10:05:14 【问题描述】:我正在尝试将 Datasource 实例注册为 java 代码中的 bean(spring-boot 项目)
这是我写的。 (此代码不起作用。)
@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? 我找不到任何好的样品。
仅供参考,我在上面的代码中所期望的是......
Spring Boot 应用程序会将上述类读取为Configure
它将在其构造函数中创建一个 Java 实例
它会将实例作为 bean 添加到 loadDatasource
方法中的应用程序上下文中
但是,它不起作用。所以我很好奇如何将 java 实例作为 bean 添加到当前的 Spring boot 应用程序上下文中。
【问题讨论】:
Spring boot 带有数据源的自动配置:docs.spring.io/spring-boot/docs/current/reference/html/… 您不必使用它,但无论如何它可以向您展示如何在独立(注册自己)或在自动配置 @pandaadb 感谢您的参考,很抱歉我没有明确表达我的观点。我想知道的不是如何使用嵌入式数据源 bean,而是如何将 java 实例注册为当前应用程序上下文的 bean。我还用帖子编辑内容。 【参考方案1】:实际上,如果我不使用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。
谢谢。
【讨论】:
以上是关于Spring Boot 将实例注册为 bean的主要内容,如果未能解决你的问题,请参考以下文章
String注解驱动开发如何按照条件向Spring容器中注册bean?这次我懂了!!