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



我正在尝试理解基于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 的配置已经停滞不前。 我不确定在尝试将我的数据源注入 jdbc 模板时该怎么做:

@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包含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());
    }
}

您无需在配置中创建jdbcTemplate。你可以在DAO类中创建它。

在 DAO 类中:

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

最新更新