使用基于 Spring Java 的配置注入 bean 依赖项

Injecting bean dependencies with Spring Java based configuration

我正在尝试了解基于 Spring Java 的配置。通常我可能有一个 XML 配置,其中包含如下内容:

<context:property-placeholder location="jdbc.properties"/>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
  p:driverClassName="${jdbc.driverClassName}"
  p:ur="${jdbc.url}"
  p:username="${jdbc.username}"
  p:password="${jdbc.password}"/>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
        p:dataSource-ref="dataSource" />

我使用基于 Spring Java 的配置来生成等效项的努力已经停滞。尝试将我的数据源注入 jdbcTemplate 时,我不确定该怎么做:

@PropertySource("classpath:jdbc.properties")
@Configuration
public class Config {

  @Bean
  public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
  }

  @Bean(name = "dataSource")
  public DataSource dataSource(
    @Value("${jdbc.driverClassName}") final String driverClassName,
    @Value("${jdbc.url}") final String url,
    @Value("${jdbc.username}") final String username,
    @Value("${jdbc.password}") final String password) {
    BasicDataSource datasource = new BasicDataSource();
    datasource.setDriverClassName(driverClassName);
    datasource.setUrl(url);
    datasource.setUsername(username);
    datasource.setPassword(password);
    return datasource;
  }

  @Bean(name = "jdbcTemplate")
  public JdbcTemplate jdbcTemplate() {
    return new JdbcTemplate(
      /* Property 'dataSource' is required and needs to be referenced
       * What goes here?
       */
    );
  }

}

我的猜测是没有直接的等价物,我可能需要以稍微不同的方式处理事情?

您不需要在配置中创建 jdbcTemplate。您可以在 DAO class 中创建它。

在 DAO 中 Class:

private JdbcTemplate jdbcTemplate;

@Autowired
public void setDataSource(final DataSource dataSource) {
    jdbcTemplate = new JdbcTemplate(dataSource);
}

因为 JdbcTemplate 包含 JdbcTemplate(DataSource dataSource) 构造函数。

你可以这样试试

@PropertySource("classpath:jdbc.properties")
@Configuration
public class Config {

    @Autowired
    private Environment env;

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean(name = "dataSource")
    public DataSource dataSource() {
        BasicDataSource datasource = new BasicDataSource();
        datasource.setDriverClassName(env.getProperty("jdbc.driverClassName"));

//      Similarly other values
//      datasource.setUrl(url);
//      datasource.setUsername(username);
//      datasource.setPassword(password);
        return datasource;
    }

    @Bean(name = "jdbcTemplate")
    public JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(dataSource());
    }
}