Spring:@Configuration中缺少默认或无参数构造函数

时间:2014-09-28 01:43:53

标签: spring configuration constructor

我正准备参加春季核心考试,在一个模拟问题上我得到了一个非常混乱的答案。

@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不好。

2 个答案:

答案 0 :(得分:1)

@Configuration特别是一个奇怪的野兽。 Spring需要对它进行分析,才能在提供bean之前构建依赖图,这样就无法使用构造函数注入配置类。

答案 1 :(得分:0)

如果您尝试使用应用程序上下文注册上述配置,原因将很明显,例如:

ApplicationContext applicationContext = 
            new AnnotationConfigApplicationContext(ApplicationConfig.class);

该框架将抛出​​一个异常,抱怨缺少默认构造函数,因为它会在尝试使用反射实例化配置时查找它。

更好的方法是拥有@Autowired dataSource字段:

@Autowired DataSource dataSource;

并且没有明确定义构造函数(即具有隐式默认的无参数构造函数)。