【发布时间】:2015-01-06 13:28:42
【问题描述】:
我正在学习 Spring Core 认证。
我知道在 Spring 中我可以使用 3 种方式配置 依赖注入:
- Java 配置
- 类注释
- 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");
...................................
...................................
...................................
}
}
所以在我看来,它的工作方式如下:
我有两个已实现的 beans,名为 TransferServiceImpl 和 JdbcAccountRepository 以及名为 ApplicationConfig 的 配置类 。
在配置类中,我说当有人要求工厂创建一个 TransferService 对象时,它会自动构建其实现 TransferServiceImpl 创建并自动注入一个 JdbcAccountRepository 进入 TransferServiceImpl 构造函数。
与创建 JdbcAccountRepository 的方式相同,它会在其构造函数中注入一个 DataSource 对象。
对吗?
如果是对的,我有以下疑问:
1) 在 ApplicationConfig 类中,我还声明了 DataSource bean,但我没有实现这个类。它是 Spring 提供的一个类,我只需要设置它的属性值吗?
2) 定义在 ApplicationConfig 类中的 bean 是什么时候创建的?在应用程序启动时?我认为,在前面的示例中,如果我使用 @Bean 注释构造函数,它会在应用程序启动时创建为单例。是对的还是我错过了什么?
Tnx
【问题讨论】:
标签: java spring dependency-injection applicationcontext