在 Spring Boot 中,如果一个类没有默认的无参构造方法,但定义了一个带参数的构造方法,Spring 会自动调用这个带参数的构造方法来完成依赖注入。这是 Spring 的构造器注入机制的一部分。
对于 `public HelloworldController(ChatClient.Builder chatClientBuilder)` 这个构造方法,Spring Boot 会自动调用它,并注入 `ChatClient.Builder` 的实例。原因如下:
1. **构造器注入是 Spring 的默认行为**:当一个类中只有一个构造方法时,Spring 会自动选择这个构造方法进行依赖注入。即使这个构造方法带有参数,Spring 也会尝试注入这些参数对应的 Bean 实例。
2. **依赖注入的优先级**:如果一个类中同时存在无参构造方法和带参构造方法,Spring 会优先选择带参构造方法进行依赖注入。如果类中只有一个带参构造方法,Spring 会自动使用它。
3. **自动配置的 Bean 实例**:在 Spring AI 的场景中,`ChatClient.Builder` 是通过 Spring 的自动配置机制创建的 Bean 实例。Spring Boot 的自动配置会自动注册 `ChatClient.Builder`,并将其注入到需要的地方。
4. **没有默认无参构造方法时的行为**:如果一个类没有显式定义无参构造方法,Spring 会尝试使用带参构造方法进行依赖注入。如果没有合适的构造方法,Spring 会抛出异常。
总结来说,`HelloworldController` 的带参构造方法被自动调用是因为 Spring Boot 的构造器注入机制会优先选择带参构造方法,并自动注入所需的依赖。这种机制确保了依赖注入的灵活性和明确性。