关于Spring Application Context的Java配置的一些疑问(依赖注入)

时间:2014-11-10 09:29:10

标签: java spring dependency-injection applicationcontext

我正在攻读Spring Core认证。

我知道在Spring中我可以使用3种方式配置依赖注入

  1. Java配置
  2. 课程注释
  3. XML配置
  4. 我对如何使用第一种依赖注入配置有一些疑问。

    例如我有这样的事情:

    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

1 个答案:

答案 0 :(得分:1)

  

1)在ApplicationConfig类中,我还声明了DataSource bean   但我没有实现这个类。它是由Spring提供的类   我只需要设置它的属性值吗?

是。 Spring提供了许多DataSource实现。例如:DriverManagerDataSourceSingleConnectionDataSource等。

  

2)创建时,将bean定义为ApplicationConfig   类?在应用程序启动时?我认为,在此之前   例如,如果我使用@Bean注释构造函数,则将其创建为   应用程序启动时的单例。是对还是我错过了   什么?

默认情况下,在实例化Spring容器时会创建bean(如果应用程序是这样连接的,通常在启动时)。但是,您可以使用@Lazy注释来更改此行为,其中只有在显式请求时才会创建bean。

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