一、什么是 Bean 的 id 和 name 属性?
在 Spring 框架中,Bean 的 id 和 name 属性是用于标识和引用 Bean 实例的属性。它们可以用于配置和查找 Bean。
1、id 属性:id 属性是唯一标识一个 Bean 的字符串值。每个 Bean 在 Spring 容器中必须有一个唯一的 id 属性,以便进行查找和引用。
例如,在 XML 配置文件中定义一个 id 为 "orderService" 的 Bean:
<bean id="orderService" class="edu.nf.ch03.service.OrderService" />
2、name 属性:name 属性是一个包含了一个或多个别名的字符串值。
它允许我们给 Bean 设置多个名称,以便通过这些名称来引用 Bean。名称之间可以使用逗号、分号或空格进行分隔。
例如,在 XML 配置文件中定义一个 id 为 "orderService",同时给 Bean 设置两个名称别名 "o1" 和 "02":
<bean id="orderService" name="o1 o2" class="edu.nf.ch03.service.OrderService" />
二、使用 id 查找 Bean 对象
1、新建项目,结构如下:
2、导入 spring 依赖
<!-- spring 的核心依赖 -->
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.23</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.5</version>
</dependency>
</dependencies>
3、新建一个 OrderService 类
@Slf4j
public class OrderService {
public void placeOrder(){
log.info("用户下单.....");
}
}
定义一个方法,简单的输出一句话即可。
4、在 resources 下新建一个 spring 的 xml 文件 beans.xml,在配置文件中完成 Bean 的装配
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="orderService" class="edu.nf.ch03.service.OrderService" />
</beans>
这里没有指定 scope 的属性,因为它默认就是 单例(singleton)的。
5、测试
@Slf4j
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
OrderService bean = context.getBean("orderService", OrderService.class);
bean.placeOrder();
}
}
获取 bean 对象,getBean("id 属性",业务实现类的 Class)
测试结果
三、使用 name 查找 Bean 对象
1、更改 xml 文件的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="orderService" name="o1 o2 o3" class="edu.nf.ch03.service.OrderService"/>
</beans>
现在我们即指定了 id ,又指定了别名,而且是多个别名,注意:多个别名用空隔或者逗号隔开。
2、测试
@Slf4j
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
OrderService bean = context.getBean("o1", OrderService.class);
bean.placeOrder();
}
}
测试结果
图中测试了两个别名,都是可以正常使用的。
id 属性表示 Bean 在容器中的唯一标识,是不可重复的,但同时还有另外一个 name 属性,用于指定 bean 在容器中的别名。并且这个别名时可以有多个的(别名之间可以使用逗号或者空格隔开),所以在获取 Bean 的时候,可以根据 id ,也可以根据别名来获取。
注意:id 在指定 name 以后,可以 不需要指定 id,但是 name 的第一个名字就会自动作为 id 使用,其他的仍然是别名。
无论是使用 id 属性还是 name 属性,我们都可以通过这些标识来引用和使用相应的 Bean 实例。例如,在 Java 代码中,我们可以使用 @Autowired、@Resource 等注解根据 id 或 name 属性自动装配 Bean。这些注解后面我们都会讲到。
需要注意的是,默认情况下,id 属性和 name 属性的值是相同的。如果只配置了 id 属性而没有配置 name 属性,则 name 属性默认与 id 属性相同。但是,通过 name 属性可以给 Bean 设置多个别名,提供了更灵活的引用方式。
四、使用 id 和 name 各有什么好处?
使用 id 属性和 name 属性都有它们各自的好处。
1、id 属性的好处:
唯一标识:id 属性是用于唯一标识一个 Bean 实例,每个 Bean 在 Spring 容器中必须有一个唯一的 id。这样可以确保在引用和查找 Bean 时不会出现冲突。
易于理解和引用:通过给每个 Bean 设置一个具有描述性的 id,可以方便地理解和引用这些 Bean 实例。我们可以根据 id 直接使用或注入相应的 Bean。
2、name 属性的好处:
多重引用:name 属性允许给 Bean 设置多个别名,以便通过不同的名称引用同一个 Bean 实例。这在某些场景下非常有用,例如允许使用不同的命名约定或提供更灵活的引用方式。
代码兼容性:通过为 Bean 设置多个名称别名,我们可以保持一致的代码兼容性。假设我们在某个版本中使用了某个名称别名,然后在以后的版本中需要更改该别名,我们可以保留旧的别名并添加新的别名,以便在应用代码中无需修改而仍然能够引用 Bean。
总结:使用 id 属性可以确保每个 Bean 在 Spring 容器中具有唯一的标识,并提供直观和明确的引用方式。而使用 name 属性可以为 Bean 设置多个别名,提供更灵活和多样化的引用方式,并保持代码兼容性。根据具体的应用场景和需求,选择适合的标识方式。