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>
- 此处,掌握
byName
和byType
的概念即可。- 基于类型 自动注入时,如果存在多个此类型的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的生命周期
基本周期
构造
》注入属性 满足依赖
》初始化
》返回
》销毁
完整周期
构造
》注入属性 满足依赖
》后处理器前置过程
》初始化
》后处理器后置过程
》返回
》销毁