[英]Spring Boot. Get bean as response to local bean method call
我在工作@Configuration
类和masterTransactionManager
豆需要被注入masterDataSource
豆。 我找到了示例https://www.codeday.top/2017/07/08/31074.html ,但它不起作用。
这里简化示例类
@Configuration
public class MasterDataSourceConfig {
@Bean
@Primary
public DataSource masterDataSource() {
DruidDataSource dataSource = new DruidDataSource();
...
return dataSource;
}
@Bean
@Primary
public DataSourceTransactionManager masterTransactionManager() {
/*
* Spring not injects bean here, instead
* it just get new instance
* of DataSource object
*/
return new DataSourceTransactionManager(masterDataSource());
}
}
我能够通过传递bean引用作为参数来解决此问题:
@Bean
@Primary
public DataSourceTransactionManager masterTransactionManager(
@Qualifier("schmodelAuditDataSource") DataSource dataSource) {
/*
* Now bean injected, and everything works as it should
*/
return new DataSourceTransactionManager(dataSource);
}
现在的问题是: new DataSourceTransactionManager(masterDataSource())
如何工作? 我从未见过像第一个示例中那样Spring可以在方法调用上返回bean。 这是获取bean的适当解决方案吗? 如果这个电话正确,那为什么对我不起作用?
尽管在将Spring boot bean插入线程注入方法中提到它应该可以工作,但我无法找到有关此类bean调用方法的很多信息。 在我看来,事实并非如此。
更新:我看到什么错误
我在第一种情况下遇到的错误是
查询数据库时出错。 原因:org.springframework.jdbc.CannotGetJdbcConnectionException
同样在调试模式下,我看到在Spring bean初始化调用上的bean实例与我的类调用masterDataSource()
方法时返回的实例不同。
该应用程序启动没有错误。 开始使用实例化的bean(将数据写入数据库)时出现错误。 我认为这是调用masterDataSource()
时返回不正确的bean(是否完全是bean,不确定masterDataSource()
在回答问题之前,我需要清除什么是Autowiring
?
Spring在作为容器的application context
管理其bean和生命周期。 Application context
是一个包含bean的容器。 当应用程序上下文自举时,bean也通过其定义的范围 ( singleton , prototype , request , session , global-session )实例化。
Spring的默认范围是singleton,它立即实例化并在应用程序上下文中共享对象(通常是缓存的对象)。
Autowire发生是将一个bean实例注入另一个bean,这意味着我们要在哪里注入以及我们要注入什么-都应该是bean并存在于Spring IoC container
(Application Context) 。
现在来问你一个问题。 如果您自动装配一个bean,实际上您的实例化对象(由spring实例化)就在这里设置。如果您在示例中调用诸如masterDataSource()
类的方法:
@Bean
@Primary
public DataSource masterDataSource() {
DruidDataSource dataSource = new DruidDataSource();
...
return dataSource;
}
@Bean
@Primary
public DataSourceTransactionManager masterTransactionManager() {
return new DataSourceTransactionManager(masterDataSource());
}
然后masterDataSource()
也创建一个新对象,并将其(注入)设置为DataSourceTransactionManager
构造函数。
因此,最重要的是,如果您使用@Autowired
那么您将获得Spring管理的(生命周期)bean /对象,如果调用masterDataSource()
则只需创建一个新对象即可,而不是Spring管理的对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.