[英]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.