Spring JavaConfig
Spring JavaConfig 是 Spring Framework 中基于 Java 的配置方式,用于替代传统的 XML 配置。它允许开发者通过纯 Java 代码来定义 Spring 容器中的 Bean 及其依赖关系,提供了类型安全和更好的 IDE 支持。
介绍[编辑 | 编辑源代码]
在早期的 Spring 版本中,XML 是主要的配置方式。然而,随着 Java 5 注解的引入,Spring 2.5 开始支持基于注解的配置。Spring 3.0 进一步引入了 JavaConfig,允许开发者完全摆脱 XML,使用 Java 类来配置 Spring 应用。
JavaConfig 的核心是使用 @Configuration 注解标记的类,以及 @Bean 注解标记的方法。这些方法返回的对象会被 Spring IoC 容器管理。
优点[编辑 | 编辑源代码]
- 类型安全:Java 代码编译时检查,避免 XML 配置中的拼写错误。
- 更好的 IDE 支持:代码补全、重构和导航。
- 灵活性:可以在配置类中使用条件逻辑(如 `@Profile` 或 `@Conditional`)。
- 模块化:通过 `@Import` 注解组合多个配置类。
基本用法[编辑 | 编辑源代码]
以下是一个简单的 JavaConfig 示例:
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
@Bean
public MyRepository myRepository() {
return new MyRepositoryImpl();
}
}
解释[编辑 | 编辑源代码]
- @Configuration:标记该类为 Spring 配置类。
- @Bean:标记方法返回的对象为 Spring Bean,方法名默认作为 Bean 的名称。
- 上述配置等价于以下 XML:
<beans>
<bean id="myService" class="com.example.MyServiceImpl"/>
<bean id="myRepository" class="com.example.MyRepositoryImpl"/>
</beans>
依赖注入[编辑 | 编辑源代码]
JavaConfig 支持通过方法调用实现依赖注入:
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl(myRepository());
}
@Bean
public MyRepository myRepository() {
return new MyRepositoryImpl();
}
}
说明[编辑 | 编辑源代码]
- `myService()` 方法调用了 `myRepository()`,Spring 会确保单例作用域的 Bean 只被创建一次。
- 这种方式是显式依赖注入,比字段注入(`@Autowired`)更推荐。
高级特性[编辑 | 编辑源代码]
条件化配置[编辑 | 编辑源代码]
使用 `@Conditional` 注解可以根据条件决定是否创建 Bean:
@Configuration
public class AppConfig {
@Bean
@Conditional(DevEnvironmentCondition.class)
public DataSource devDataSource() {
return new EmbeddedDatabaseBuilder().build();
}
@Bean
@Conditional(ProdEnvironmentCondition.class)
public DataSource prodDataSource() {
return new JndiDataSourceLookup().getDataSource("jdbc/ProdDS");
}
}
配置类组合[编辑 | 编辑源代码]
使用 `@Import` 导入其他配置类:
@Configuration
@Import({DatabaseConfig.class, SecurityConfig.class})
public class AppConfig {
// 主配置类
}
生命周期回调[编辑 | 编辑源代码]
通过 `@Bean` 的 `initMethod` 和 `destroyMethod` 属性指定生命周期方法:
@Bean(initMethod = "init", destroyMethod = "cleanup")
public MyBean myBean() {
return new MyBean();
}
实际案例[编辑 | 编辑源代码]
场景:多环境配置[编辑 | 编辑源代码]
假设应用需要在开发、测试和生产环境使用不同的数据源:
@Configuration
public class EnvironmentConfig {
@Bean
@Profile("dev")
public DataSource devDataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("classpath:schema-dev.sql")
.build();
}
@Bean
@Profile("prod")
public DataSource prodDataSource() {
BasicDataSource ds = new BasicDataSource();
ds.setUrl("jdbc:mysql://prod-server:3306/db");
ds.setUsername("prod_user");
ds.setPassword("secure123");
return ds;
}
}
激活 Profile[编辑 | 编辑源代码]
通过以下方式激活 Profile:
- JVM 参数:`-Dspring.profiles.active=dev`
- 环境变量:`SPRING_PROFILES_ACTIVE=dev`
- 代码中:`ctx.getEnvironment().setActiveProfiles("dev");`
与 XML 配置对比[编辑 | 编辑源代码]
特性 | JavaConfig | XML |
---|---|---|
类型安全 | 是 | 否 |
条件化配置 | 强大 (`@Conditional`) | 有限 |
可读性 | 依赖 Java 知识 | 依赖 XML 知识 |
重构支持 | 优秀 | 差 |
总结[编辑 | 编辑源代码]
Spring JavaConfig 是现代 Spring 应用推荐的配置方式,尤其适合中大型项目。它结合了注解的强大功能和 Java 语言的灵活性,同时保持了 Spring 的核心特性——依赖注入和控制反转。
对于初学者,建议从简单的 `@Bean` 定义开始,逐步学习条件化配置和模块化组合。高级用户可以探索 `@Conditional` 与自定义条件接口的结合,实现高度灵活的配置逻辑。