配置中 Bean 的基本定义
<beans>
元素是 Spring 配置文件的根元素,可以指定如下属性:
- default-lazy-init :指定所有 Bean 默认的延迟初始化行为。
- default-merge :指定所有 Bean 默认的 merge 行为。
- default-autowire :指定所有 Bean 默认的自动装配行为。
- default-autowire-candidates :指定所有 Bean 默认是否作为自动装配的候选。
- default-init-method :指定所有 Bean 默认的初始化方法。
- default-destory-method :指定所有 Bean 默认的回收方法。
在
<beans>
元素下所能指定的属性都可以在每个<bean>
子元素中指定 —— 将属性名的 default 去掉即可。
当二者指定的属性不一致时,在<bean>
下指定的属性会覆盖<beans>
下指定的属性。
指定 Bean 的别名
指定 Bean 的别名有 2 种方式:
1、使用 <bean>
的 name 属性指定。如果需要多个,则可以使用逗号、冒号或者空格来分隔。
<bean id="date" class="java.util.Date" name="time,dateTime"/>
2、通过 <alias>
为已有的 Bean 指定别名。
<bean id="date" class="java.util.Date">
<alias name="date" alias="time"/>
容器中 Bean 的作用域
作用域的类型
当通过 Spring 容器创建一个 Bean 实例时,不仅可以完成 Bean 实例的实例化,还可以为 Bean 指定特定的作用域。Spring 支持如下6种特定的作用域:
- singleton:默认,单例模式,在整个 Spring IoC 容器中,该 Bean 只生成一个实例。
- prototype:每次通过容器得 getBean() 方法获取 Bean 的时候,都会生成一个新的实例。
- request:对于一次 HTTP 请求,该 Bean 只生成一个实例。
- session:对于一次 HTTP 会话,该 Bean 只生成一个实例。
- application:对于整个 Web 应用,该 Bean 只生成一个实例。
- websocket:在整个 WebSocket 通信过程中,该 Bean 只生成一个实例。
比较常用的时 singleton 和 prototype 两种作用域。
其中 singleton 是 Bean 默认的作用域,容器会跟踪 Bean 的实例状态,负责维护其生命周期行为。
对于 prototype 作用域的 Bean 而言,Spring 容器创建之后就不再跟踪维护。
作用域的声明
通过 <bean>
元素的 scope 属性指定其作用域:
<bean id="date" class="java.util.Date" scope="prototype"/>
使用自动装配注入合作者 Bean
自动装配策略
Spring 可以自动装配 Bean 与 Bean 之间的依赖关系,即无须使用 ref 显示指定依赖 Bean。
Spring 的自动装配可通过 <beans>
元素的 default-autowire 属性指定,对所有的 <bean>
元素都起作用。也可以通过 <bean>
元素的 autowire 属性指定,只对 Bean 自身起作用。
自动装配可以减少配置文件的工作量,但降低了依赖关系的透明性和清晰性。
autowire 和 default-autowire 属性可以设置如下值:
- no :不使用自动装配。
- byName :根据 setter 方法名进行自动装配。Spring 容器找到与 setter 方法名相同的 id 的 Bean 完成注入;如果没有找到,则不进行任何注入。
- byType :根据 setter 方法的形参类型进行自动装配。Spring 容器找到与 setter 方法形参类型匹配的 Bean 完成注入;如果找到多个,就抛出异常;如果没有找到,则不进行任何注入。
- constructor :与 byType 类似,区别是用于自动匹配构造器的参数。如果 Spring 容器没有找到类型匹配的 Bean,则抛出异常。
- autodetect :Spring 容器根据 Bean 内部结构,自行决定使用 byType 或 constructor 策略。
自动装配配置
<?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="person" class="org.autumn.boot.ssm.study.di.Person" autowire="byName">
</bean>
<bean id="axe" class="org.autumn.boot.ssm.study.di.Axe" autowire="byType"/>
<bean id="date" class="java.util.Date"/>
</beans>
某些情况下,程序希望将某些 Bean 排除在自动装配之外,可以设置 autowire-candidate 属性,例如:
<bean id="petDog" class="org.crazyit.app.service.impl.PetDog" autowire-candidate="false">