Spring|Bean的初始化、作用域
BeanDefaintion 保存 Bean 的元信息,是 Bean 的“配料表”。
Bean 初始化的方式:
1、通过构造器除时候( 不可变对象)
public class SimpleMovieLister {
// the SimpleMovieLister has a dependency on a MovieFinder
private MovieFinder movieFinder;
// a constructor so that the Spring container can inject a MovieFinder
public SimpleMovieLister(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// business logic that actually uses the injected MovieFinder is omitted...
}
构造函数的索引从 0 开始
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg index="0" value="7500000"/>
<constructor-arg index="1" value="42"/>
</bean>
2、通过 Setter 方法
public class SimpleMovieLister {
// the SimpleMovieLister has a dependency on the MovieFinder
private MovieFinder movieFinder;
// a setter method so that the Spring container can inject a MovieFinder
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// business logic that actually uses the injected MovieFinder is omitted...
}
3、通过静态工厂实化
定义使用静态工厂方法创建的 bean 时,请使用 class 属性来指定包含 static 工厂方法的类,并使用名为 factory-method 的属性来指定工厂方法本身的名称。
容器执行 bean 依赖项解析,如下所示:
-
ApplicationContext 用描述所有 bean 的配置元数据创建和初始化。可以通过 XML,Java 代码或注解来指定配置元数据。
-
对于每个 bean,其依赖项都以属性,构造函数参数或 static-factory 方法的参数(如果使用它而不是常规构造函数)的形式表示。在实际创建 Bean 时,会将这些依赖项提供给 Bean。
-
每个属性或构造函数参数都是要设置的值的实际定义,或者是对容器中另一个 bean 的引用。
-
作为值的每个属性或构造函数参数都将从其指定的格式转换为该属性或构造函数参数的实际类型。默认情况下,Spring 可以将以字符串格式提供的值转换为所有内置类型,例如 int,long,String,boolean 等等。
循环依赖
循环依赖:A -> B; B -> C; C ->A;
使用构造器注入会因为循环依赖抛异常。
自动装配模式
- no (默认)无自动装配。 Bean 引用必须由 ref 元素定义。对于大型部署,建议不要更改默认设置,因为明确指定协作者可以提供更好的控制和清晰度。在某种程度上,它记录了系统的结构。
- byName 按属性名称自动匹配。例如,如果一个 bean 定义被设置为按名称自动装配,并且包含一个 master 属性(即,它具有 setMaster(..)方法),那么 Spring 将查找一个名为 master 的 bean 定义并使用它来设置属性。
- byType 如果容器中恰好存在一个改类型的
bean
,则使用该属性自动装配。如果存在多个错误,则会引发致命异常,这表明您可能不对该 bean 使用 byType 自动装配。如果没有匹配的 bean,则什么也不会发生(未设置该属性)。 - constructor 类似于 byType,但适用于构造函数参数。如果容器中不存在构造函数参数类型的一个 bean,则将引发致命错误。
Bean 作用域
Scop | Description |
---|---|
singleton | (默认)将每个 Spring IoC 容器的单个 bean 定义范围限定为单个对象。 |
prototype | 将单个 bean 的定义范围限定为任意数量的对象实例 |
request | 将单个 bean 的定义范围限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都在一个单个 bean 定义后面创建的实例。仅在可以感知网络的 Spring ApplicationContext 中有效。 |
session | 将单个 bean 定义的范围限定为 HTTP Session 的生命周期。仅在可感知网络的 Spring ApplicationContext 上下文中有效。 |
application | 将单个 bean 定义的范围限定为 ServletContext 的生命周期。仅在可感知网络的 Spring ApplicationContext 上下文中有效。 |
websocket | 将单个 bean 定义的范围限定为 WebSocket 的生命周期。仅在可感知网络的 Spring ApplicationContext 上下文中有效。 |