1.前言
在之前的文章-IOC的快速入门中讲过Bean这个概念. 本来就来介绍容器与Bean的常用属性配置
在Spring框架中,Bean指的是被Spring加载生成出来的对象。
Spring容器是Spring框架的核心,它的基本功能就是管理对象。
2.IOC容器
Spring容器是Spring框架的核心,它的基本功能就是管理对象。这个管理的过程贯穿了对象的整个生命周期,包括对象的创建、装配和销毁。从更具体的角度去理解,Spring容器像一个大仓库,负责存储和管理Bean对象。这些Bean对象在Spring容器中被创建,并且通过依赖注入等方式关联起来,形成一个完整的解决方案。
除了管理Bean对象之外,Spring容器还负责处理Bean之间的依赖关系。当一个Bean需要另一个Bean的协助时,Spring容器会将所需的Bean注入到当前Bean中,使得各个Bean能够顺利地协作完成工作。
Spring提供的容器主要有两个:
- BeanFactory 容器
- ApplicationContext 容器
2.1 BeanFactory 容器
BeanFactory是为 DI 提供基本支持的最简单的容器, 最常用的 BeanFactory 实现是 XmlBeanFactory 类。 此容器从 XML 文件中读取配置元数据,并使用它来创建完全配置的系统或应用程序。
在资源有限的情况下,如移动设备或基于小程序的应用程序,BeanFactory 通常是首选。
2.2 ApplicationContext 容器
Application Context 应用程序上下文是 Spring 的高级容器。 与 BeanFactory 类似,它可以加载 bean 定义、将 bean 连接在一起并根据请求分发 bean。 此外,它还添加了更多特定于企业的功能,例如从属性文件解析文本消息的能力以及将应用程序事件发布到感兴趣的事件侦听器的能力。
ApplicationContext是BeanFactory的子接口。ApplicationContext 包含了 BeanFactory 的所有功能,一般推荐使用它而不是 BeanFactory。
最常用的 ApplicationContext 实现是:
-
FileSystemXmlApplicationContext − 这个容器从一个 XML 文件中加载 bean 的定义。 这里需要将 XML bean 配置文件的完整路径提供给构造函数。
-
ClassPathXmlApplicationContext − 这个容器从一个 XML 文件中加载 bean 的定义。 这里您不需要提供 XML 文件的完整路径,但您需要正确设置 CLASSPATH,因为此容器看起来像 CLASSPATH 中的 bean 配置 XML 文件。
-
WebXmlApplicationContext − 此容器从 Web 应用程序中加载包含所有 bean 定义的 XML 文件。
3.Bean的常用属性配置
Bean是Spring框架在运行时管理的对象,也是任何Spring应用程序的基本构建块。其加载、作用域、生命周期的管理都由Spring操作。这意味着,当我们需要使用某个对象时,无需自己手动创建和管理该对象,而是交由Spring容器来完成这些工作
属性 | 描述 |
---|---|
class | 该属性是必需的,它指定了用于创建 bean 的 bean 类。 |
id | 此属性唯一地指定 bean 标识符。 在基于 XML 的配置元数据中,您使用 id 和/或 name 属性来指定 bean 标识符。 |
scope | 此属性指定从特定 bean 定义创建的对象的范围 |
lazy-init | 延迟初始化的 bean 告诉 IoC 容器在第一次被请求时创建一个 bean 实例,而不是在启动时 |
init-method | 在容器设置了 bean 上的所有必要属性之后调用的回调。 |
destory-method | 当包含 bean 的容器被销毁时要使用的回调 |
factory-bean | 指定工厂对象 |
factory-method | 指定工厂方法 |
Bean标签的属性有很多.并不是所有的属性都很重要,本文主要讲class,id和scope
这三个属性
class: 该属性是必需的,它指定了用于创建 bean 的 bean 类。
⭐需要注意的是class的值是全类名,要把前面的包带上
id: 此属性唯一地指定 bean 标识符。 在基于 XML 的配置元数据中,您使用 id 和/或 name 属性来指定 bean 标识符。
获取Bean对象时,就是依靠id来进行区分的
scope: 此属性指定从特定 bean 定义创建的对象的范围
scope有两个属性值:
- singleton(默认值): 代表单例
- prototype: 代表多例
如果设置为singleton则一个容器中只会有这个一个bean对象。默认容器创建的时候就会创建该对象.
如果设置为prototype则一个容器中会有多个该bean对象。每次调用getBean方法获取时都会创建一个新对象
接下来可以验证一下scope的两个属性:
Student类:
public class Student {
private int age;
private String name;
public Student() {
System.out.println("创建了一次对象");
}
在配置文件中设置Bean标签的scope属性值
<bean class="com.exaple.entity.Student" name="student" scope="singleton">
</bean>
在Main方法中对上面的id获取两次对象,输出结果中可以看到 Student类的构造方法只执行了一次
其它不变,更该Bean标签的scope属性值为prototype
<bean class="com.exaple.entity.Student" name="student" scope="prototype">
</bean>
可以看到Student类的构造方法执行了两次.
4. 总结
IOC容器有两个:BeanFactory 容器和ApplicationContext 容器. 推荐
使用ApplicationContext.ApplicationContext 包含了 BeanFactory 的所有功能.
Bean最主要的三个属性(class,id和scope)中class属性是必须的,id是唯一标识符,通过id/name来指定,scope是设置Bean的单例/多例