我正在攻读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;
}
...
...
...
}
因此,该类的构造函数构成了一个必须注入JdbcAccountRepository类的 DataSource 对象。
然后我有一个包含依赖注入配置的配置类:
@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");
...................................
...................................
...................................
}
}
所以在我看来它的工作方式如下:
我将2个已实施的 bean 命名为 TransferServiceImpl 和 JdbcAccountRepository ,配置类命名为 ApplicationConfig
在配置类中,我说当有人要求工厂创建 TransferService 对象时,它会自动构建其实现 TransferServiceImpl ,自动创建并注入 JdbcAccountRepository 进入 TransferServiceImpl 构造函数。
以同样的方式创建 JdbcAccountRepository 时,会在其构造函数中注入 DataSource 对象。
是不是?
如果是对的,我有以下疑问:
1)进入 ApplicationConfig 类我还声明了 DataSource bean,但我没有实现这个类。它是由Spring提供的类,我只需设置其属性值吗?
2)什么时候创建bean定义到 ApplicationConfig 类?在应用程序启动时?我认为,在前面的示例中,如果我使用 @Bean 注释构造函数,则会在应用程序启动时将其创建为singleton。是对的还是我错过了什么?
TNX
答案 0 :(得分:1)
1)在ApplicationConfig类中,我还声明了DataSource bean 但我没有实现这个类。它是由Spring提供的类 我只需要设置它的属性值吗?
是。 Spring提供了许多DataSource
实现。例如:DriverManagerDataSource
,SingleConnectionDataSource
等。
2)创建时,将bean定义为ApplicationConfig 类?在应用程序启动时?我认为,在此之前 例如,如果我使用@Bean注释构造函数,则将其创建为 应用程序启动时的单例。是对还是我错过了 什么?
默认情况下,在实例化Spring容器时会创建bean(如果应用程序是这样连接的,通常在启动时)。但是,您可以使用@Lazy
注释来更改此行为,其中只有在显式请求时才会创建bean。
@Bean @Lazy public TransferService transferService(){
return new TransferServiceImpl(accountRepository());
}