簡體   English   中英

春季啟動。 獲取bean作為對本地bean方法調用的響應

[英]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也通過其定義的范圍singletonprototyperequestsessionglobal-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM