什么是Bean?
- Bean是描述Java的软件组件模型。
- 在Java模型中,通过Bean可以无限扩充Java程序的功能。
- 通过Bean的组合可以快速生成新的应用程序。
- 对于开发人员,最重要的是Bean可以实现代码的重复利用。
- Bean可以在不同的环境里重复使用。
Bean基本结构
id和name属性
使用id或name属性都可以来唯一指定一个Bean。
<bean id="HelloWorld">
</bean>
- id属性:可以在XML DTD中作为一个真正XML元素的ID属性被标记,所以XML解析器能够在其他元素指向它的时候做一些额外的校验。XML规范严格限定了XML ID中的合法字符。
- name属性:如果id要使用一些不符合ID规定的非法字符,或者给Bean增加其他的别名,可以通过name属性指定一个或多个id。当指定多个id时,要用逗号(,)或者分号(;)分割。
★用id属性指定Bean的id是比较好的方式。一般一个Bean只有一个id;如果有多个id,则认为其余id为Bean的别名。
class类属性
指明了Bean的来源,即Bean的实际路径。
<bean id="HelloWorld" class="com.gc.action.HelloWorld">
</bean>
singleton部署模式属性
在Spring中,Bean可以被定义为singleton或non-singleton(prototype)两种部署模式中的一种。默认为singleton。
- ★如果一个Bean的singleton=“true”,则只有一个共享的实例存在,所有对这个Bean的请求都会返回这个唯一的实例。
- ★如果一个Bean的singleton=“false”,那么对这个Bean的每次请求都会创建一个新的Bean实例,类似于new操作。
<bean id="HelloWorld" class="com.gc.action.HelloWorld" singleton="true">
</bean>
depends-on属性使用依赖
使用该属性可用来在初始化使用这个Bean之前,强制执行一个或多个Bean的初始化。
<bean id="HelloWorld" class="com.gc.action.HelloWorld" depends-on="date">
</bean>
在初始化HelloWorld之前,会强制初始化date。即先执行date再执行HelloWorld。
autowire属性
使用自动装配,可以减少指定属性的需要,从而节省一些属性设定的工作。其共5种模式:byName、byType、constructor、autodetect、no。
(1)byName模式:通过Bean的属性名进行自动装配。在配置文档XML中,查找一个与将要装配的属性相同属性名的Bean。
<bean id="HelloWorld" class="com.gc.action.HelloWorld" autowire="byName">
</bean>
(2)byType模式:如果XML中正好有一个与属性类型一样的Bean,就自动装配这个属性。如果有多于一个这样的Bean,就抛出一个异常,指出可能不能对那个Bean使用byType的自动装配。
<bean id="HelloWorld" class="com.gc.action.HelloWorld" autowire="byType">
</bean>
如果没有匹配的Bean,则什么都不做。如果想要得到反应,可以通过设置dependency-check=”objects”属性值来指定在这种情况下应该抛出错误。
(3)constructor模式:根据构造函数的参数进行自动装配。参数需要什么就自动装配什么。
<bean id="HelloWorld" class="com.gc.action.HelloWorld" autowire="constructor">
</bean>
(4)autodetect模式:通过对Bean检查类的内部来选择constructor或byType。先找到constructor就用constructor;如果没有constructor,而找到byType,就用byType。
<bean id="HelloWorld" class="com.gc.action.HelloWorld" autowire="autodetect">
</bean>
找到构造函数就使用constructor,否则使用byType。
(5)no模式:(默认的配置)不使用自动装配。
不使用自动装配模式,必须在配置文件中构造完整的依赖关系。在很多企业级的用于环境中不鼓励使用自动装配模式,因为它去除了参考依赖的透明性和清晰性。
<beans>
<bean id="HelloWorld" class="com.gc.action.HelloWorld" autowire="no">
<property name="msg">
<value>HelloWorld</value>
</property>
<property name="date">
<ref bean="date"/>
</property>
</bean>
<bean id="date" class="java.util.Date"/>
</beans>
注:
- 显式的指定依赖,如property和constructor-arg元素,总会覆盖自动装配。
- 自动装配可以减少开发人员的输入工作,但却使开发人员很难看出Bean的每个属性是否都设定完成。
dependency-check属性
通过依赖检查来实现查看Bean的每个属性是否都设定完成的功能。依赖检查共有4种模式:simple、object、all、none。
(1)simple模式
对基本类型、字符串和集合进行依赖检查。
<beans>
<bean id="HelloWorld" class="com.gc.action.HelloWorld" autowire="autodetect" dependency-check="simple">
</bean>
<bean id="date" class="java.util.Date"/>
</beans>
(2)object模式
对依赖的对象进行依赖检查。
<beans>
<bean id="HelloWorld" class="com.gc.action.HelloWorld" autowire="autodetect" dependency-check="object">
</bean>
<bean id="date" class="java.util.Date"/>
</beans>
(3)all模式
对全部属性进行依赖检查。
<beans>
<bean id="HelloWorld" class="com.gc.action.HelloWorld" autowire="autodetect" dependency-check="all">
</bean>
<bean id="date" class="java.util.Date"/>
</beans>
(4)none模式(默认)
不进行依赖检查。
<beans>
<bean id="HelloWorld" class="com.gc.action.HelloWorld" autowire="autodetect" dependency-check="none">
</bean>
<bean id="date" class="java.util.Date"/>
</beans>
用ref的属性指定依赖
指定依赖具有3种模式:local、Bean、parent。
(1)local属性(在同一个XML文件中,一般使用 local 属性)
- 一个Bean与被参考引用的Bean在同一个XML文件中。
- 被参考引用的Bean是用 id 来命名的。
<ref local="date"/>
(2)Bean属性(常见)
- 允许指向的Bean可以不在同一个XML中。
- Bean属性的值可以与被参考引用的Bean的 id 属性相同,也可以与 name 属性相同。
<ref bean="date"/>
(3)parent属性
- 允许引用当前的BeanFactory或ApplicationContext的父BeanFactory或ApplicationContext中的Bean。
- parent属性的值可以与被参考引用的Bean的 id 属性相同,也可以与 name 属性相同。
<ref parent="date"/>
集合的注入方式
(1)List
//定义一个Set变量
private List msg = null;
<property name="msg">
<list>
<value>val1</value>
<value>val2</value>
<value>val3</value>
</list>
</property>
(2)Set
//定义一个Set变量
private Set msg = null;
<property name="msg">
<set>
<value>val1</value>
<value>val2</value>
<value>val3</value>
</set>
</property>
(3)Map
//定义一个Set变量
private Map msg = null;
<property name="msg">
<map>
<entry key="key1">
<value>val1</value>
</entry>
<entry key="key2">
<value>val2</value>
</entry>
</map>
</property>
(4)Properties
//定义一个Set变量
private Properties msg = null;
<property name="msg">
<props>
<prop key="key1">val1</prop>
<prop key="key2">val2</prop>
</props>
</property>
对于null值的处理
有以下两种处理方式:
//方法 1
<property name="msg">
<value>null</value>
</property>
//方法 2
<property name="msg">
<null/>
</property>