1. Configuration 概述Configuration是 Spring Framework 中一个核心的注解用于标记一个类为配置类。配置类替代了传统的 XML 配置文件通过 Java 代码的方式来定义和装配 Spring 应用上下文中的 Bean。2. 基本用法在类上添加Configuration注解即可将其声明为一个配置类。配置类中通常包含一个或多个被Bean注解标记的方法这些方法用于创建和配置 Spring 容器管理的 Bean 实例。Configuration public class AppConfig { Bean public MyService myService() { return new MyServiceImpl(); } Bean public DataSource dataSource() { // 配置并返回 DataSource 实例 return new DriverManagerDataSource(jdbc:mysql://localhost:3306/mydb, user, password); } }3. 核心特性与原理3.1 配置类代理CGLIB默认情况下Spring 会使用 CGLIB 为Configuration类创建代理。这确保了配置类内部方法间的调用会被拦截从而保证Bean方法的单例性。例如Configuration public class ConfigA { Bean public BeanA beanA() { return new BeanA(beanB()); // 这里调用 beanB() 会返回容器中的单例而非创建新实例 } Bean public BeanB beanB() { return new BeanB(); } }3.2 Bean 注解方法在配置类中使用Bean注解的方法相当于 XML 配置中的bean元素。方法名默认作为 Bean 的名称返回值类型作为 Bean 的类型。3.3 组合配置Import可以使用Import注解导入其他配置类实现配置的模块化和组合。Configuration Import({DatabaseConfig.class, SecurityConfig.class}) public class MainConfig { // 主配置类 }4. 进阶用法4.1 条件化配置Conditional结合Conditional及其衍生注解如ConditionalOnClass,ConditionalOnProperty可以根据特定条件决定是否创建某个 Bean。4.2 配置属性绑定ConfigurationProperties与ConfigurationProperties注解结合可以轻松地将外部配置如 application.properties绑定到 Java Bean 上。4.3 简化配置ComponentScan在配置类上添加ComponentScan注解可以指定 Spring 扫描特定包路径下的组件Component,Service,Repository,Controller。5. Configuration vs Component虽然Configuration本身也被Component元注解标注但二者有重要区别Configuration语义上表示这是一个配置类其内部的Bean方法会通过代理确保 Bean 的单例性。Component表示一个通用的 Spring 组件。如果一个普通Component类中包含Bean方法这些方法间的调用不会通过代理可能导致每次调用都创建新的实例“lite mode”。6. 最佳实践与常见问题保持配置类单一职责每个配置类应专注于一个特定领域的配置如数据源、MVC、安全。避免在 Bean 方法中编写复杂业务逻辑配置方法应专注于 Bean 的创建和依赖注入。注意循环依赖配置类之间的Bean方法如果相互引用可能产生循环依赖需通过设计或使用Lazy注解解决。测试配置类使用SpringBootTest或AnnotationConfigApplicationContext对配置类进行集成测试。7. 总结Configuration是现代 Spring 应用尤其是 Spring Boot进行依赖注入和 Bean 配置的基石。它提供了类型安全、易于重构和测试的配置方式是替代 XML 配置的首选方案。理解其代理机制、与Bean的配合以及相关的组合注解是掌握 Spring 核心容器的关键。
Spring @Configuration 注解详解
1. Configuration 概述Configuration是 Spring Framework 中一个核心的注解用于标记一个类为配置类。配置类替代了传统的 XML 配置文件通过 Java 代码的方式来定义和装配 Spring 应用上下文中的 Bean。2. 基本用法在类上添加Configuration注解即可将其声明为一个配置类。配置类中通常包含一个或多个被Bean注解标记的方法这些方法用于创建和配置 Spring 容器管理的 Bean 实例。Configuration public class AppConfig { Bean public MyService myService() { return new MyServiceImpl(); } Bean public DataSource dataSource() { // 配置并返回 DataSource 实例 return new DriverManagerDataSource(jdbc:mysql://localhost:3306/mydb, user, password); } }3. 核心特性与原理3.1 配置类代理CGLIB默认情况下Spring 会使用 CGLIB 为Configuration类创建代理。这确保了配置类内部方法间的调用会被拦截从而保证Bean方法的单例性。例如Configuration public class ConfigA { Bean public BeanA beanA() { return new BeanA(beanB()); // 这里调用 beanB() 会返回容器中的单例而非创建新实例 } Bean public BeanB beanB() { return new BeanB(); } }3.2 Bean 注解方法在配置类中使用Bean注解的方法相当于 XML 配置中的bean元素。方法名默认作为 Bean 的名称返回值类型作为 Bean 的类型。3.3 组合配置Import可以使用Import注解导入其他配置类实现配置的模块化和组合。Configuration Import({DatabaseConfig.class, SecurityConfig.class}) public class MainConfig { // 主配置类 }4. 进阶用法4.1 条件化配置Conditional结合Conditional及其衍生注解如ConditionalOnClass,ConditionalOnProperty可以根据特定条件决定是否创建某个 Bean。4.2 配置属性绑定ConfigurationProperties与ConfigurationProperties注解结合可以轻松地将外部配置如 application.properties绑定到 Java Bean 上。4.3 简化配置ComponentScan在配置类上添加ComponentScan注解可以指定 Spring 扫描特定包路径下的组件Component,Service,Repository,Controller。5. Configuration vs Component虽然Configuration本身也被Component元注解标注但二者有重要区别Configuration语义上表示这是一个配置类其内部的Bean方法会通过代理确保 Bean 的单例性。Component表示一个通用的 Spring 组件。如果一个普通Component类中包含Bean方法这些方法间的调用不会通过代理可能导致每次调用都创建新的实例“lite mode”。6. 最佳实践与常见问题保持配置类单一职责每个配置类应专注于一个特定领域的配置如数据源、MVC、安全。避免在 Bean 方法中编写复杂业务逻辑配置方法应专注于 Bean 的创建和依赖注入。注意循环依赖配置类之间的Bean方法如果相互引用可能产生循环依赖需通过设计或使用Lazy注解解决。测试配置类使用SpringBootTest或AnnotationConfigApplicationContext对配置类进行集成测试。7. 总结Configuration是现代 Spring 应用尤其是 Spring Boot进行依赖注入和 Bean 配置的基石。它提供了类型安全、易于重构和测试的配置方式是替代 XML 配置的首选方案。理解其代理机制、与Bean的配合以及相关的组合注解是掌握 Spring 核心容器的关键。