在spring配置类中使用bean,该类在配置类本身中初始化

时间:2016-01-21 14:43:04

标签: java spring

在我的Spring Configuration类中,我需要jdbcTemplate来初始化其他bean。

@Configuration
public class ApplicationBeansConfiguration {
    @Bean
    public JdbcTemplate jdbcTemplate() throws GeneralSecurityException {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource());
        return jdbcTemplate;
    }

    @Bean
    @Lazy 
    public Map<String, String> someDatabaseTableValues(){
    // I need jdbcTemplate bean here.

}

1 个答案:

答案 0 :(得分:1)

像这样使用:

@Bean
@Lazy 
public Map<String, String> someDatabaseTableValues() {
    //the following JdbcTemplate instance will already be configured by Spring
    JdbcTemplate template = jdbcTemplate();
    ...
}

一些解释:Spring需要CGLIB进行@Configuration类处理。它有效地使您的配置类中的CGLIB代理。在配置类上调用@Bean方法时,它将由CGLIB代理处理。代理拦截器将检查已配置的bean实例是否随时可用(对于单例bean)并返回该缓存实例。如果没有缓存实例,它将调用您的@Bean工厂方法并应用您的应用程序上下文设置的任何配置和bean后处理。当它返回时,它将根据需要缓存bean实例(同样,在单例bean的情况下)并将配置的bean实例返回给你。

您还可以使用方法注入@Autowired

@Autowired
@Bean
@Lazy 
public Map<String, String> someDatabaseTableValues(JdbcTemplate template) {
    ...
}

您可以在自动装配的方法参数前面使用@Qualifier()注释来区分同一bean类型的多个实例。

请注意,您也可以使用JSR-250@ResourceJSR-330 @Inject注释代替@Autowired,那些也得到了Spring的支持。