1. Spring 创建 Bean
Spring 允许你在一个(或多个)XML 配置文件中配置 Bean,对于 Spring IoC 容器,这个配置文件就是创建、管理 Bean 的依据。
一个 Spring XML 配置文件的基本样式是:
使用类自身的构造方法
每个 Bean 都必须提供一个唯一的名称或 id,以及一个完全限定的类名,用来让 Spring IoC 容器对其进行创建。Spring 通过类的构造方法来创建 Bean 对象。
使用工厂类提供的工厂方法
使用工厂对象提供的工厂方法
2. Spring 装配简单类型属性
装配,即为 Bean 的属性进行『初始化』、『赋值』。
『简单类型』是指:基本数据类型、基本数据类型包装类和字符串。
装配方式有两种:
通过『构造方法』装配
通过『setter』装配
构造方法装配
通过构造方法装配,即通过设置,要求 Spring 通过调用『有参构造方法』来创建对象。默认是调用无参构造方法。
在
...
index 属性表示构造函数形参『索引』(从 0 开始)。如果参数的类型具有唯一性,即参数的类型互不相同,那么可以使用 type 属性,通过『参数类型』来指定构造方法和参数值。
为了简化配置,Spring 提供了一个名为 c 的 schema,来简化配置。
注意,这里出现的下划线 _
,它是必须的,不要省略掉了。
使用这种简写方式,完全不用出现 costructor-arg 子元素,只需在 bean 元素中多增加几个『c:_索引="参数值"』这样的属性。
setter 装配
通过 setter 装配,即设置 Spring 在(通过『无参』构造器)创建对象后,通过调用对象的属性的 setter 方法来为对象的属性赋值。在 bean 元素内使用 property 子元素,即可触发 setter 装配。
...
property 元素的 name 属性用于指定对象的属性名,value 属性用于指定要设置值。
为了简化配置,Spring 提供了一个名为 p 的 schema,来简化配置。
...
使用这种简写方式,完全不用出现 property 子元素,只需在 bean 元素中多增加几个『p:属性名="属性值"』这样的属性。
3. Spring 装配引用类型属性
对象的属性不一定都是简单类型,还有可能有『引用类型』,即对象间有 has-a 关系。为引用类型的属性赋值不同于基本类型的属性,不是使用 value,而是 ref 。
构造方法装配
构造方法装配的简写形式中,对于引用类型必须写成:c:_索引-ref="参数值" 。
setter 装配
属性赋值的简写形式中,对于引用类型必须写成:p:属性名-ref 。
4. Spring 装配集合类型属性
更复杂的属性类型是集合类型属性:数组、List、Set、Map 。
Bean 的属性可能远不止基本类型这么简单,还有可能是基本类型的集合(List、Set 和 Map)。这种情况下,属性的赋值不再是 property - value 这种结构,而是 property - list - value 三层结构。
xxx
...
xxx
...
xxx
...
如果集合是引用类型的集合,那么使用的子元素就从 value 改为 ref。map 使用的是 key-ref 和 value-ref 。
5. 自动装配
尽管自动装配很强大,但是代价是降低了 Bean 配置的可读性。在实践中,建议仅在依赖关系不复杂的应用中使用。
当一个 Bean 需要访问另一个 Bean 时,你可以显示指定引用装配它。不过,Spring IoC 容器提供自动装配功能,只需要在 bean 的 autowire 属性中指定自动装配模式就可以了。
装配模式 | 说明 |
---|---|
no | 默认值。不执行自动装配。你必须显示地装配所依赖对象 |
byName | 以 Bean 的属性名为依据,装配一个与属性名同名的 Bean |
byType | 以 Bean 的属性类型为依据,装配一个与之同类型的 Bean |
constructor | 通过构造方法初始化 Bean 的属性,并依据参数的类型,装配一个与参数同类型的 Bean |
6. 注解替代 XML 配置
在 XML 配置文件中加上
7. Bean 的作用域
默认情况下,Spring IoC 容器只会对一个 Bean 创建一个实例。即单例。Spring IoC 提供了 4 种『作用域』,它决定了 Spring IoC 是否闯将一个新的对象、何时创建一个新的对象。
常见有:
singleton(单例):默认值。在整个应用中,Spring 只为其生成一个 Bean 的实例。
prototype(原型):Spring 每次都会生成一个 Bean 的实例。
在 XML 配置文件中, 通过 bean 元素的 scope 属性进行设置。该属性取值:singleton
| prototype
| 其他 。
8. Spring IoC 配置数据库连接池
::: warning
由于 .xml 配置文件中不能出现 &
符号,因此 url 中需要的 &
符号,要使用它的 &
编码形式来代替。
:::
这里有一个小细节,Druid 数据库连接池和 HikariCP 数据库连接池的数据库 URL 属性名并不一样,一个叫 url ,一个叫 jdbcUrl 。
9. property-placeholder
有时有些配置我们并不是直接『写死』在 .xml 配置文件中,而是写在 .properties 配置文件中,再让 Spring 从 .properties 配置文件中读取配置,进行利用。
Spring 通过
默认情况下,整个程序中无论有多少个 .xml Spring 配置文件,但是只能有一个
例如:
这里有个小细节,jdbc.properties 中的属性的 key 不要和 DataSource 的 driverClassName、jdbcUrl、username、password 属性同名,否则会有问题:数据库连接池初始化不成功。
配置文件中的配置项按惯例都会有自定义的前缀,用以表明这个(这些)配置用于什么环境。