Spring框架中的Bean、容器与依赖注入
立即解锁
发布时间: 2025-08-19 00:29:41 阅读量: 19 订阅数: 16 AIGC 


掌握Spring框架:从入门到精通
### Spring框架中的Bean、容器与依赖注入
#### 1. Spring Beans简介
在Spring框架里,Beans是可复用的软件组件,由Spring IoC容器进行管理。这些Beans包含了类的属性、setter和getter方法。Spring IoC容器由`org.springframework.context.ApplicationContext`接口来表示,它负责实例化、配置和组装Beans。
Beans的相关信息会反映在容器使用的配置元数据中。配置元数据为容器提供了实例化、配置和组装对象的指令,其可以通过XML、Java注解或Java代码来表示。下面主要介绍基于XML的Bean配置。
#### 2. 基于XML的Bean配置
Bean的配置信息存储在XML文件中,使用`<bean>...</bean>`元素来创建Bean定义。Bean定义包含以下元数据,代表了Bean的配置信息:
- 代表Bean名称的全限定类名。
- 行为配置元素,如作用域、生命周期等,用于描述Bean在Spring IoC容器中的行为。
以下是XML配置元数据的基本结构代码示例:
```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="..." class="...">
<!-- configuration for this bean here -->
</bean>
<!-- more bean definitions here -->
</beans>
```
配置文件以`<beans>`作为根元素,通过`<bean>`标签配置各个单独的Bean。每个`<bean>`标签需要指定`class`属性,还可以有可选的`ID`或`name`属性。`ID`属性确保Bean命名的唯一性,`class`属性包含全限定类名。例如,`src.org.packt.Spring.chapter2.Employee`类可以这样配置:
```xml
<bean id="employeeBean"
class="src.org.packt.Spring.chapter2.Employee">
</bean>
```
当使用`BeanFactory`或`ApplicationContext`容器加载配置文件,并通过`getBean("employeeBean")`方法访问`employeeBean`时,会返回`Employee`类实例的引用。Spring IoC容器负责实例化、配置和检索Spring Beans,并以各种形式实施依赖注入(DI),采用了多种成熟的设计模式来实现这一点。
#### 3. Spring容器接口
Spring提供了以下两种作为容器的接口:
- **BeanFactory**:这是一个基本容器,其他所有容器都实现了`BeanFactory`接口。
- **ApplicationContext**:它是`BeanFactory`的子接口,在企业应用中常被用作容器。
要实例化Spring容器,需要创建`BeanFactory`或`ApplicationContext`实现类的对象,并提供Spring Bean配置。Spring框架的Spring IoC容器的基本包是`org.springframework.beans`和`org.springframework.context`。`BeanFactory`接口提供了高级配置机制来管理任何类型的对象,`ApplicationContext`接口实现了`BeanFactory`接口,提供了企业特定的功能,支持消息资源处理、Spring的AOP特性、事件发布以及用于Web应用的`WebApplicationContext`。
#### 4. BeanFactory详解
##### 4.1 工厂模式
Spring使用工厂模式来创建所有实例以及所需对象的引用,这与使用`new`方法自己创建实例不同。在工厂模式中,有一个对象充当对象工厂。当需要任何对象的实例时,无需自己创建,只需调用工厂的方法,工厂会返回所需的实例。工厂会从配置文件中读取信息,该配置文件就像一个蓝图,包含了创建对象的指导。
假设存在对象`Foo`,若要获取对象`Bar`,不是直接创建`Bar`,而是调用另一个Java对象(即工厂对象)。工厂对象的任务是创建并将新的`Bar`对象交给`Foo`对象。工厂对象从配置文件中读取元数据,该元数据包含了需要创建的对象的详细信息。配置文件是工厂创建的所有对象的蓝图。`Foo`对象与工厂对象交互以获取具有特定规格的对象,工厂对象找出该特定对象规格的蓝图,然后创建新对象,最后将请求的`Bar`对象交还给`Foo`对象。这就是Spring所做的事情。
##### 4.2 Spring BeanFactory
Spring中的`BeanFactory`类型的对象就像上述的工厂对象。在配置文件(通常是XML文件)中指定蓝图对象,然后将其提供给`BeanFactory`。之后,如果需要任何对象的实例,可以向`BeanFactory`请求,`BeanFactory`会参考XML文件并按指定方式构建Bean。这个Bean就是Spring Bean,因为它是由Spring容器创建并返回的。总结如下:
1. Spring有`BeanFactory`,它为我们创建新对象。所以`Foo`对象会调用`BeanFactory`。
2. `BeanFactory`会读取包含所有Bean定义的Spring XML文件。Bean定义在这里就是蓝图,`BeanFactory`会根据这个蓝图创建Bean,进而生成新的Spring Bean。
3. 最后,这个新的Spring Bean会被交还给`Foo`对象。
`BeanFactory`由`org.springframework.beans.factory.BeanFactory`接口定义,它是Spring中的中央IoC容器接口,为Spring核心容器向应用程序提供了访问核心容器服务的基本端点。`BeanFactory`负责包含和管理Beans,它是一个工厂类,包含了一组Beans,内部持有多个Bean定义,并根据客户端的需求实例化这些Bean。`BeanFactory`在实例化协作对象时会创建它们之间的关联,减轻了Bean本身和Bean客户端的配置负担,还参与Bean的生命周期,调用自定义的初始化和销毁方法。
##### 4.3 BeanFactory的实现
`BeanFactory`接口有许多实现,其中`org.springframework.beans.factory.xml.XmlBeanFactory`类是最常用的。它从XML文件中读取Bean定义并根据这些定义初始化Beans。根据Bean定义,工厂会返回包含对象的独立实例或单个共享实例。不过,这个类已被弃用,取而代之的是`DefaultListableBeanFactory`和`XmlBeanDefinitionReader`,使用它只是为了解释`BeanFactory`。`XmlBeanFactory`的构造函数接受`Resource`接口的实现作为参数,代码如下:
```java
XmlBeanFactory (Resource resource)
```
`Resource`接口有很多实现,常用的两种实现如下表所示:
| Resource接口实现 | 描述 |
| --- | --- |
| `org.springframework.core.io.FileSystemResource` | 从底层文件系统加载配置文件 |
| `org.springframework.core.io.ClassPathResource` | 从类路径加载配置文件 |
假设Beans配置在位于C盘的`beans.xml`文件中:
```xml
<bean id="mybean" class="...">
...
</bean>
```
使用`BeanFactory`加载配置文件的代码片段如下:
```java
BeanFactory bfObj = new XmlBeanFactory (new FileSystemResource ("c:/beans.xml"));
MyBean beanObj= (MyBean) bfObj.getBean ("mybean");
```
这里使用了`FileSystemResource`,它是`Resource`接口的一种实现。`bfObj`对象对应于Spring容器,它从`beans.xml`文件中加载了Bean定义。`BeanFactory`是一个懒加载容器,此时仅加载了Bean定义,Beans本身尚未实例化。在第二行代码中,调用了`BeanFactory`对象的`getBean()`方法,将Bean ID `"mybean"`作为参数传递给该方法,`BeanFactory`会从Spring的`beans.xml`文件中读取ID为`"mybean"`的Bean定义,实例化它并返回引用。
`BeanFactory`接口有不同
0
0
复制全文
相关推荐









