在我的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.
}
答案 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的@Resource
或JSR-330 @Inject
注释代替@Autowired
,那些也得到了Spring的支持。