![](/img/trans.png)
[英]Some doubts about how exactly work the XML constructor injection Spring configuration?
[英]Some doubts about Java Configuration of the Spring Application Context (dependency injection)
我正在學習Spring Core認證。
我知道在Spring中,我可以使用3種方式配置依賴項注入 :
我對如何使用第一種依賴項注入配置有疑問。
例如,我有這樣的事情:
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,它們分別名為TransferServiceImpl和JdbcAccountRepository和名為ApplicationConfig的配置類 。
在配置類中,我說的是,當有人要求工廠創建TransferService對象時,它會自動構建其實現TransferServiceImpl,從而創建並自動將JdbcAccountRepository注入到TransferServiceImpl構造函數中。
以相同的方式在創建JdbcAccountRepository時將其注入DataSource對象到其構造函數中。
這樣對嗎?
如果是正確的話,我有以下疑問:
1)在ApplicationConfig類中,我還聲明了DataSource bean,但沒有實現該類。 它是Spring提供的類,我只需要設置其屬性值?
2)什么時候定義了ApplicationConfig類的bean被創建? 在應用程序啟動時? 我認為,在前面的示例中,如果我使用@Bean注釋構造函數 ,則會在應用程序啟動時將其創建為單例。 是對的還是我錯過了什么?
TNX
1)在ApplicationConfig類中,我還聲明了DataSource bean,但沒有實現該類。 它是Spring提供的類,我只需要設置其屬性值?
是。 Spring提供了許多DataSource
實現。 例如: DriverManagerDataSource
, SingleConnectionDataSource
等。
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.