2014-09-28 230 views
1

我正在准备Spring核心考试,并且在其中一个模拟问题上我收到了一个令人困惑的答案。Spring:默认或无参数构造函数在@Configuration中缺失

@Configuration 
public class ApplicationConfig { 
    private DataSource dataSource; 

    @Autowired 
    public ApplicationConfig(DataSource dataSource) { 
     this.dataSource = dataSource; 
    } 
    @Bean(name="clientRepository") 
    ClientRepository jpaClientRepository() { 
     return new JpaClientRepository(); 
    } 
} 

答案说明:缺省或无参数构造函数丢失。缺省或无参数构造函数是必需的。这里,没有考虑到提供的具有dataSource参数的构造函数。

我不明白为什么需要构造函数,为什么ApplicationConfig不好。

回答

1

@Configuration具体是一个奇怪的野兽。 Spring需要分析它以在它提供bean之前构建一个依赖关系图,所以你不能使用构造器注入和配置类。

0

,如果你试图用一个应用程序上下文注册上面的配置,其原因很清楚。例如:

ApplicationContext applicationContext = 
      new AnnotationConfigApplicationContext(ApplicationConfig.class); 

框架将引发异常抱怨缺少的默认构造函数,因为它会寻找它同时尝试使用反射实例化配置。

一种更好的方式是将有@Autowired dataSource的字段:

@Autowired DataSource dataSource; 

和没有构造明确地定义(即,具有一个隐含的默认的无参数构造)。

相关问题