Bean的继承
Spring Bean继承指的是配置信息的继承,而非Java类的继承。子Bean可以继承父Bean的配置属性。
基本用法
定义父Bean
XML
<!-- 父Bean配置 -->
<bean id="parentBean" abstract="true" class="com.example.Service">
<property name="prefix" value="APP"/>
<property name="suffix" value="END"/>
</bean>
<!-- 子Bean继承父Bean配置 -->
<bean id="childBean" parent="parentBean">
<property name="name" value="UserService"/>
</bean>
子Bean覆盖父Bean属性
XML
<bean id="childBean" parent="parentBean">
<!-- 覆盖父Bean的prefix属性 -->
<property name="prefix" value="CUSTOM"/>
<!-- 新增属性 -->
<property name="name" value="OrderService"/>
</bean>
抽象Bean
使用abstract="true"定义抽象Bean,不能被实例化。
XML
<!-- 抽象Bean,仅作为配置模板 -->
<bean id="serviceTemplate" abstract="true">
<property name="timeout" value="30"/>
<property name="retryCount" value="3"/>
</bean>
<!-- 继承抽象Bean -->
<bean id="userService" parent="serviceTemplate" class="com.example.UserService">
<property name="name" value="UserService"/>
</bean>
注解方式
注解方式没有直接的继承概念,但可以通过@Configuration类复用配置。
Java
@Configuration
public class ServiceConfig {
@Bean
public ServiceConfig commonConfig() {
ServiceConfig config = new ServiceConfig();
config.setTimeout(30);
config.setRetryCount(3);
return config;
}
@Bean
public UserService userService() {
UserService service = new UserService();
// 复用公共配置
service.setTimeout(commonConfig().getTimeout());
service.setRetryCount(commonConfig().getRetryCount());
return service;
}
}
父Bean指定class
父Bean可以指定class或不指定:
XML
<!-- 父Bean指定class -->
<bean id="parentService" abstract="true" class="com.example.BaseService">
<property name="prefix" value="APP"/>
</bean>
<!-- 子Bean继承class和属性 -->
<bean id="childService" parent="parentService"/>
<!-- 子Bean覆盖class -->
<bean id="anotherService" parent="parentService" class="com.example.CustomService"/>
继承关系示例
XML
<!-- 通用数据源配置 -->
<bean id="dataSourceTemplate" abstract="true" class="com.zaxxer.hikari.HikariDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="maximumPoolSize" value="10"/>
<property name="connectionTimeout" value="30000"/>
</bean>
<!-- 主数据源 -->
<bean id="primaryDataSource" parent="dataSourceTemplate">
<property name="jdbcUrl" value="jdbc:mysql://primary:3306/db"/>
<property name="username" value="root"/>
<property name="password" value="root123"/>
</bean>
<!-- 从数据源 -->
<bean id="secondaryDataSource" parent="dataSourceTemplate">
<property name="jdbcUrl" value="jdbc:mysql://secondary:3306/db"/>
<property name="username" value="root"/>
<property name="password" value="root456"/>
</bean>
Bean继承与Java继承的区别
| 特性 | Bean继承 | Java继承 |
|---|---|---|
| 继承内容 | 配置属性 | 类的属性和方法 |
| 是否要求类继承关系 | 否 | 是 |
| 父Bean实例化 | 抽象Bean不会实例化 | 父类可实例化 |
| 主要作用 | 配置复用 | 代码复用 |
要点总结
- Bean继承是配置信息的继承,不是Java类继承
- abstract="true"定义抽象Bean,仅作配置模板
- 子Bean使用parent属性指定父Bean
- 子Bean可覆盖父Bean的属性配置
- 常用于公共配置的复用,如数据源配置
📝 发现内容有误?点击此处直接编辑