Java Spring 框架技术从入门到放弃:Spring生态之Spring基于配置文件管理类学习笔记:从 XML 到 JavaConfig
一、配置文件管理的本质与价值
概念:通过 XML 或 Java 配置类管理 Spring 容器中的 Bean,实现对象创建、依赖注入和生命周期控制的解耦。
生活案例:大型商场的管理系统,通过配置文件(如商场平面图)定义每个店铺(Bean)的位置、营业时间和所需资源(依赖),而非硬编码在代码中。
核心价值:
- 分离配置与代码:业务逻辑与 Bean 管理解耦,修改配置无需重启应用。
- 灵活扩展:支持不同环境(开发 / 测试 / 生产)的差异化配置。
- 可读性增强:集中管理 Bean 关系,便于团队协作和维护。
二、XML 配置文件核心要素
1. Bean 定义(Bean Definition)
生活案例:餐厅菜单定义(Bean),包括菜品名称(id)、制作方法(class)、分量(scope)等。
XML 示例:
<bean id="coffeeMachine" class="com.example.AmericanCoffeeMachine" scope="singleton">
<property name="brand" value="Nespresso"/>
</bean>
关键属性:
id
:Bean 的唯一标识符(类似餐厅的桌号)。class
:Bean 的实现类(如咖啡机的具体型号)。scope
:Bean 的作用域(如 singleton 单例、prototype 多例)。
2. 依赖注入(DI)
生活案例:奶茶店员工(Bean)需要奶茶杯(依赖),通过配置文件指定杯子类型(如纸杯、塑料杯)。
构造器注入:
<bean id="barista" class="com.example.Barista">
<constructor-arg ref="coffeeMachine"/>
</bean>
Setter 注入:
<bean id="waiter" class="com.example.Waiter">
<property name="tray" ref="dinnerTray"/>
</bean>
3. 高级配置
集合注入:
<bean id="restaurant" class="com.example.Restaurant">
<property name="tables">
<list>
<ref bean="table1"/>
<ref bean="table2"/>
</list>
</property>
</bean>
外部属性文件:
<context:property-placeholder location="jdbc.properties"/>
<bean id="dataSource" class="com.mysql.jdbc.DriverManagerDataSource">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
</bean>
三、Java 配置类(JavaConfig)实践
1. @Configuration + @Bean
生活案例:家庭影院系统配置,通过 Java 代码定义音响、投影仪等设备(Bean)。
示例代码:
@Configuration
public class HomeTheaterConfig {
@Bean
public Speaker speaker() {
return new DolbySpeaker();
}
@Bean
public Projector projector() {
return new 4KProjector();
}
}
2. 条件化 Bean(@Conditional)
生活案例:根据天气自动切换空调模式(制冷 / 制热)。
示例代码:
@Configuration
public class AirConditionerConfig {
@Bean
@Conditional(SummerCondition.class)
public AC ac() {
return new CoolingAC();
}
@Bean
@Conditional(WinterCondition.class)
public AC ac() {
return new HeatingAC();
}
}
四、生命周期管理
1. 初始化与销毁方法
生活案例:工厂设备的开机自检(初始化)和关机维护(销毁)。
XML 配置:
<bean id="machine" class="com.example.ManufacturingMachine"
init-method="startupCheck" destroy-method="shutdownCleanup"/>
Java 配置:
@Bean(destroyMethod = "close")
public DatabaseConnection database() {
return new DatabaseConnection();
}
2. 生命周期接口
生活案例:图书馆书籍的借阅流程(初始化)和归还流程(销毁)。
实现 InitializingBean 和 DisposableBean:
public class Book implements InitializingBean, DisposableBean {
public void afterPropertiesSet() {
System.out.println("书籍上架");
}
public void destroy() {
System.out.println("书籍下架");
}
}
五、最佳实践与避坑指南
- 命名规范:Bean 的 id 采用驼峰命名(如 userService),避免与类名混淆。
- 依赖管理:优先使用构造器注入,确保依赖不可变。
- 环境隔离:通过
@Profile
或spring.profiles.active
区分不同环境配置。 - 避免循环依赖:使用
@Lazy
或调整 Bean 加载顺序解决。
六、预习:配置文件的进阶知识
- 注解与 XML 混合配置:结合
@Autowired
和 XML 实现复杂依赖管理。 - Spring Boot 自动配置:通过
@SpringBootApplication
自动加载默认配置。 - 云原生配置:使用
@ConfigurationProperties
绑定外部配置(如 Docker 环境变量)。 - AOP 与配置结合:在 XML 中定义切面,实现日志、事务等横切逻辑。
通过配置文件管理类,Spring 实现了对象管理的灵活性和可维护性。掌握 XML 和 JavaConfig 的核心用法,能更好地应对不同规模的项目需求,为后续学习 Spring Boot 和微服务架构奠定基础。