Spring配置详解

bean标签

bean标签

  • bean标签,是根标签beans内部必须包含的标签,它是用于声明具体的类的对象!

bean标签对应属性

Property 属性解释
class 指定bean对应类的全路径
name name是bean对应对象的一个标识
scope 执行bean对象创建模式和生命周期
id id是bean对象的唯一标识
lazy-init 是否延时加载 默认值:false
init-method 对象初始化方法
destroy-method 对象销毁方法

name属性

  • 可以使用特殊字符, name可以当做id使用,配合struts1使用,不推荐使用。

id属性

  • id属性作用和name几乎相同,但是也有细微的差别,id只能写一个,而name可以写多个,中间用逗号,分号,或空格隔开,如果同时存在,可以把name看做id的别名。

scope属性

  • bean标签中添加scope属性,设置bean对应对象生成规则.
    • singleton – 单例(默认值)
    • prototype – 多例,在Spring框架整合Struts2框架的时候,Action类也需要交给Spring做管理,配置把Action类配置成多例!!
    • request – 应用在Web项目中,每次HTTP请求都会创建一个新的Bean
    • session – 应用在Web项目中,同一个HTTP Session 共享一个Bean
    • globalsession – 应用在Web项目中,多服务器间的session

lazy-init 注意: 只对单例有效,设置scope=”singleton”时测试

  • 延时创建属性.
  • lazy-init=”false” 默认值,不延迟创建,即在启动时候就创建对象.
  • lazy-init=”true” 延迟初始化,在用到对象的时候才会创建对象.

初始化(init-method)/销毁destroy-method

  • Bean对象的创建和销毁的两个属性配置(了解)
  • 说明:Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法
  • init-method – 当bean被载入到容器的时候调用init-method属性指定的方法
  • destroy-method – 当bean从容器中删除的时候调用destroy-method属性指定的方法
  • 想查看destroy-method的效果,有如下条件
  • scope= singleton有效
  • web容器中会自动调用,但是main函数或测试用例需要手动调用(需要使用ClassPathXmlApplicationContext的close()方法)

类型注入

基本类型注入

  <!-- jdk 8种基本类型+String -->
  <property name="age" value="18"></property>
  <property name="name" value="xxx"></property>
  <property name="gender" value="true"></property>

引用类型注入

<!-- 引用类型  -->
  <property name="userDAO" ref="ud"></property>

集合注入

<!-- List或数组 -->
   <property name="list">
       <list>
           <value>18</value>
           <ref bean="ud"/>
       </list>
   </property>
   <!-- set -->
   <property name="xxx">
       <set>
           <value>xx</value>
       </set>
   </property>
   <!-- map -->
   <property name="map">
       <map>
           <entry key="name" value="sdh"></entry>
           <entry key="userDAO" value-ref="ud"></entry>
       </map>
   </property>
   <!-- properties -->
   <property name="prop">
       <props>
           <prop key="url">jdbc:oracle:xxxx</prop>
       </props>
   </property>

p命名空间注入

  • 需要先添加p命名空间
//使用 p命称空间进行赋值
<bean name="person" class="com.itqf.spring.bean.Person"  p:name="人名" p:age="11" p:car-ref="car">

注意

  • 在注入过程中,其实就是一个复制的过程, a=b, a是组件的属性,b是如上配置的value中的值。
  • 则b是String,而a可能是 Integer,Boolean,Double,Date,….;即左值和右值类型不匹配。
  • spring有自动的类型转换机制,可以保证我们绝大多数的类型转换。
  • 细节:“org.springframework.beans.propertyeidtors”包下定义了大量的Editor。

构造注入

<bean id="consDI" class="com.test.TestConstrutorDIComponent">
<!-- index=构造参数索引    type:构造参数类型   value=构造参数值 -->
  <constructor-arg index="0" type="java.lang.Integer" value="18"></constructor-arg>
  <constructor-arg index="1" type="java.lang.String" value="sdh"></constructor-arg>
  <constructor-arg index="2" type="java.lang.Boolean" value="true"></constructor-arg>
</bean>
<!-- 构造和set注入混用 -->
<bean id="consDI04" class="com.xxx.di.ConsComponent">
  <!-- 构造和set注入混用 -->
  <constructor-arg index="0" type="java.lang.Integer" value="4"></constructor-arg>
  <property name="name" value="sdh"/>
  <property name="gender" value="false"/>
</bean>

自动注入(byName和byType)

  • 不用在配置中 指定为哪个属性赋值,及赋什么值.
  • 由spring自动根据某个 “原则” ,在工厂中查找一个bean,为属性注入属性值
<!-- 基于属性名自动注入=将和属性"同名"的bean 赋值给属性 -->
<bean id="xx" class="xxx" autowire="byName"></bean>
<!-- 基于属性类型自动注入=将和属性"同类型"的bean 赋值给属性 -->
<bean id="xx" class="xxx" autowire="bytype"></bean>
  • 此处,掌握 byNamebyType 的概念即可。
  • 基于类型 自动注入时,如果存在多个此类型的bean,会报错。

Bean细节

Bean创建原理

  • 反射,加载类对象,默认调用无参构造,创建对象。

Bean创建模式

  • singleton:单例 ==> 默认
    • 在同一个spring工厂中,一个bean只会创建一次对象。
    • 多次getBean(),或多次注入使用的是同一个对象
    • 随工厂创建 而创建,随工厂关闭而销毁
  • prototype:多例 (原型)
    • <bean id=xxx class=xxx scope="prototype">
    • 每次getBean(),或注入都会重新创建对象
    • 不随工厂创建 而创建,不随工厂关闭而销毁
    • 被用到时才会创建对象

何时使用单例或多例

  • 有状态对象:多例模式
  • 无状态对象:单例模式

对象的状态:对象的成员变量值 即 对象的状态

  • 无状态:不同的用户,不同的请求,对象的属性值不会发生改变
  • 有状态:不同的用户,不同的请求,对象的属性值会发生改变

生命周期

  • 单例bean:构造(工厂启动)–>set–>init–>User–>destroy(工厂关闭)
  • 多例bean:获取时才创建–>set–>init–>User–>不会随工厂关闭而销毁

Bean的生命周期

基本周期

  • 构造注入属性 满足依赖初始化返回销毁

完整周期

  • 构造注入属性 满足依赖后处理器前置过程初始化后处理器后置过程返回销毁


转载请注明:Memory的博客 » 点击阅读原文

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦