我正准备参加春季核心考试,在一个模拟问题上我得到了一个非常混乱的答案。
@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不好。
答案 0 :(得分:1)
@Configuration
特别是一个奇怪的野兽。 Spring需要对它进行分析,才能在提供bean之前构建依赖图,这样就无法使用构造函数注入配置类。
答案 1 :(得分:0)
如果您尝试使用应用程序上下文注册上述配置,原因将很明显,例如:
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(ApplicationConfig.class);
该框架将抛出一个异常,抱怨缺少默认构造函数,因为它会在尝试使用反射实例化配置时查找它。
更好的方法是拥有@Autowired dataSource字段:
@Autowired DataSource dataSource;
并且没有明确定义构造函数(即具有隐式默认的无参数构造函数)。