Bean的别名
Bean别名允许同一个Bean使用多个名称进行引用,提供更灵活的Bean命名方式。
XML配置别名
name属性定义多个名称
XML
<!-- 使用name属性定义多个别名,用逗号、分号或空格分隔 -->
<bean id="userService" name="userManager,userFacade" class="com.example.UserService"/>
alias标签定义别名
XML
<!-- 定义Bean -->
<bean id="userService" class="com.example.UserService"/>
<!-- 使用alias标签添加别名 -->
<alias name="userService" alias="userManager"/>
<alias name="userService" alias="userFacade"/>
注解配置别名
@Component的value属性
Java
// 主名称
@Component("userService")
public class UserService {
}
// 等价于默认名称(类名首字母小写)
@Component
public class UserService {
// Bean名称:userService
}
@Bean的name属性
Java
@Configuration
public class AppConfig {
// 定义多个别名
@Bean(name = {"userService", "userManager", "userFacade"})
public UserService userService() {
return new UserService();
}
}
别名的使用场景
1. 兼容旧名称
XML
<!-- 主名称是新的命名规范 -->
<bean id="userRepository" name="userDao" class="com.example.UserRepositoryImpl"/>
<!-- 旧代码仍可使用userDao -->
<bean id="userService" class="com.example.UserService">
<property name="userRepository" ref="userDao"/>
</bean>
2. 不同模块使用不同名称
XML
<!-- 订单模块使用orderDataSource -->
<!-- 报表模块使用reportDataSource -->
<!-- 实际引用同一个数据源 -->
<bean id="primaryDataSource" class="com.zaxxer.hikari.HikariDataSource"/>
<alias name="primaryDataSource" alias="orderDataSource"/>
<alias name="primaryDataSource" alias="reportDataSource"/>
3. 环境隔离
XML
<!-- 开发环境使用devDataSource -->
<!-- 生产环境使用prodDataSource -->
<!-- 通过别名统一引用 -->
<alias name="${env}DataSource" alias="dataSource"/>
获取Bean的方式
Java
@Service
public class OrderService {
// 通过任意别名都可以注入
@Autowired
@Qualifier("userService")
private UserService userService1;
@Autowired
@Qualifier("userManager")
private UserService userService2;
@Autowired
@Qualifier("userFacade")
private UserService userService3;
// 三者引用同一个Bean实例
}
Java
// 通过ApplicationContext获取
UserService u1 = context.getBean("userService", UserService.class);
UserService u2 = context.getBean("userManager", UserService.class);
UserService u3 = context.getBean("userFacade", UserService.class);
System.out.println(u1 == u2 && u2 == u3); // true
别名规则
| 规则 | 说明 |
|---|---|
| 名称唯一 | 所有别名和id不能重复 |
| 引用同一Bean | 所有别名指向同一个Bean实例 |
| 名称规范 | 建议使用驼峰命名 |
要点总结
- Bean别名通过name属性或alias标签定义
- 别名与id都可用于引用Bean
- 别名适用于兼容旧名称、不同模块命名等场景
- 所有别名引用的是同一个Bean实例
- @Bean的name属性支持数组形式定义多个别名
📝 发现内容有误?点击此处直接编辑