簡體   English   中英

關於Spring Application Context的Java配置(依賴注入)的一些疑問

[英]Some doubts about Java Configuration of the Spring Application Context (dependency injection)

我正在學習Spring Core認證。

我知道在Spring中,我可以使用3種方式配置依賴項注入

  1. Java配置
  2. 類注釋
  3. XML配置

我對如何使用第一種依賴項注入配置有疑問。

例如,我有這樣的事情:

1)名為TransferServiceImpl的類:

public class TransferServiceImpl implements TransferService {

    public TransferServiceImpl(AccountRepository ar) {
        this.accountRepository = ar;
    }
    ...
    ...
    ...
}

此類包含TransferServiceImpl()構造函數,該構造函數將AccountRepository對象作為輸入參數,因此AccountRepository是必須注入到TransferServiceImpl()中的依賴項。

2)這是以前的AccountRepository類的實現:

public class JdbcAccountRepository implements AccountRepository {
    public JdbcAccountRepository(DataSource ds) {
        this.dataSource = ds;
    }
    ...
    ...
    ...
}

因此,此類的構造函數帶有一個DataSource對象,該對象必須注入到JdbcAccountRepository類中。

然后,我有一個包含依賴項注入配置的配置類

@Configuration
public class ApplicationConfig{

    @Bean public TransferService transferService(){
        return new TransferServiceImpl(accountRepository());
    }

    @Bean public AccountRepository accountRepository(){
        return JdbcAccountRepository(dataSoruce());
    }

    @Bean public DataSource dataSource(){
        DataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("org.postgresql.Driver");
        ...................................
        ...................................
        ...................................
    }
}

因此在我看來,它的工作方式如下:

我有兩個實現的bean,它們分別名為TransferServiceImplJdbcAccountRepository和名為ApplicationConfig配置類

在配置類中,我說的是,當有人要求工廠創建TransferService對象時,它會自動構建其實現TransferServiceImpl,從而創建並自動將JdbcAccountRepository注入到TransferServiceImpl構造函數中。

以相同的方式在創建JdbcAccountRepository時將其注入DataSource對象到其構造函數中。

這樣對嗎?

如果是正確的話,我有以下疑問:

1)在ApplicationConfig類中,我還聲明了DataSource bean,但沒有實現該類。 它是Spring提供的類,我只需要設置其屬性值?

2)什么時候定義了ApplicationConfig類的bean被創建? 在應用程序啟動時? 我認為,在前面的示例中,如果我使用@Bean注釋構造函數 ,則會在應用程序啟動時將其創建為單例。 是對的還是我錯過了什么?

TNX

1)在ApplicationConfig類中,我還聲明了DataSource bean,但沒有實現該類。 它是Spring提供的類,我只需要設置其屬性值?

是。 Spring提供了許多DataSource實現。 例如: DriverManagerDataSourceSingleConnectionDataSource等。

2)什么時候定義了ApplicationConfig類的bean被創建? 在應用程序啟動時? 我認為,在前面的示例中,如果我使用@Bean注釋構造函數,則會在應用程序啟動時將其創建為單例。 是對的還是我錯過了什么?

默認情況下,實例化Spring容器時會創建Bean(通常是在啟動時,如果應用程序是這樣連接的)。 但是,可以使用@Lazy批注來更改此行為,其中僅在顯式請求時才創建Bean。

@Bean @Lazy public TransferService transferService(){
    return new TransferServiceImpl(accountRepository());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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