在 spring boot 中,配置类中的 bean 通过 @configuration 注解的类进行定义,并使用 @bean 注解的方法生成实例。spring 容器会自动扫描并注册这些 bean,随后在需要注入的地方使用 @autowired 或构造器注入即可获取实例。若配置类位于主启动类的同包或子包下,通常无需额外指定路径;若不在同一层级,则需通过 @componentscan 或 @import 显式引入。

如何确保自定义配置类被 Spring 容器识别?
要使配置类生效,必须将其纳入组件扫描范围或通过导入机制显式加载。默认情况下,@SpringBootApplication 会扫描其所在包及其子包下的所有组件。如果配置类放在其他包中,可以通过 @ComponentScan 指定扫描路径,或者直接在主配置类中使用 @Import 注解引入该配置类。这样,Spring 就能正确解析其中的 @Bean 方法并创建对应的单例对象。

package com.example.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
@Bean
public String myBean() {
return "configured-value";
}
}
上述代码定义了一个名为 myBean 的字符串 Bean。当 Spring 容器启动时,它会调用 myBean() 方法并将返回值注册为 Bean。如果在其他组件中通过 @Autowired 注入类型为 String 且名称匹配的变量,即可获得该值。注意:若存在多个同类型 Bean,需配合 @Qualifier 指定具体名称以避免歧义。
配置类中的 Bean 是否受生命周期管理?
是的,由 @Configuration 类中 @Bean 方法创建的 Bean 完全受 Spring 容器的生命周期管理。这意味着它们支持初始化回调(如 @PostConstruct)、销毁回调以及代理增强等功能。此外,由于 Spring 对 @Configuration 类使用了 CGLIB 代理机制,同一个配置类内部的方法间调用也会经过代理,从而保证 Bean 之间的依赖关系始终指向容器管理的实例而非新创建的对象。

package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MyService {
private final String value;
@Autowired
public MyService(String myBean) {
this.value = myBean;
}
public String getValue() {
return value;
}
}
此示例展示了如何在服务类中通过构造器注入来自配置类的 Bean。MyService 接收一个 String 类型的参数 myBean,该参数对应之前定义的 Bean 名称。Spring 会在实例化 MyService 时自动查找匹配名称和类型的 Bean 并完成注入。这种方式比字段注入更清晰,也便于单元测试。
当配置类中定义了同名 Bean 时会发生什么?
如果在不同配置类中定义了相同名称的 Bean,后注册的 Bean 会覆盖先前的定义。Spring 容器按照注册顺序处理 Bean 定义,最后注册的版本将成为最终可用的实例。这种行为可能导致意外结果,尤其是在多模块项目中。为避免冲突,建议为每个 Bean 赋予唯一名称,或使用 @Primary 注解明确优先级。此外,可通过 @ConditionalOnMissingBean 等条件注解控制 Bean 的注册时机,进一步降低冲突风险。


















