Spring的Bean容器基本结构

什么是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>

 

 

 

 

 

发布了71 篇原创文章 · 获赞 38 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/u012839256/article/details/105586411