基本类型直接使用
<property name="name" value="jack"></property>自动进行类型转换
进行复杂赋值时
<property name="name" >
<value></value>
</property>
引用类型赋值(引用其他bean,引用内部bean)
<bean id="car01" class="com.lmh.bean.Car">
<property name="carName" value="bmw"></property>
<property name="color" value="black"></property>
<property name="price" value="30000"></property>
</bean>
<bean id="person06" class="com.lmh.bean.Person">
<!-- ref:代表引用外部的bean
car = ioc.getBean("car01")-->
<property name="car" ref="car01"></property>
<property name="car">
引用内部bean,不能被获取,只能内部使用,内部类添加id属性,不能被调用-->
<bean class="com.lmh.bean.Car">
<property name="carName" value="audi"></property>
</bean>
</property>
</bean>
<!-- 通过p名称空间为bean赋值 -->
<!-- 名称空间:在xml中名称空间是用来防止标签重复 -->
<!-- 1)导入p名称空间 2)写带前缀的标签/属性 -->
<bean id="person05" class="com.lmh.bean.Person" p:name="xiaohei"
p:age="18" p:gender="male" p:email="xiaohei@qq.com"></bean>
<!-- 注册一个person对象 Spring自动创建person对象 -->
<!-- 一个Bean标签可以注册一个组件(对象) class:写要注册的组件的全类名 id: 这个对象的唯一标识 -->
<bean id="person01" class="com.lmh.bean.Person">
<!-- 使用property给对象的属性进行赋值
name: 指定属性名
value: 为属性赋值
-->
<property name="name" value="tom"></property>
<property name="gender" value="man"></property>
<property name="age" value="18"></property>
<property name="email" value="tom@qq.com"></property>
</bean>
<!--调用有参构造方法进行对象创建并赋值 不使用getter 和setter方法赋值 -->
<bean id="person03" class="com.lmh.bean.Person">
<constructor-arg name="name" value="petter"></constructor-arg>
<constructor-arg name="age" value="22"></constructor-arg>
<constructor-arg name="gender" value="male"></constructor-arg>
<constructor-arg name="email" value="petter@qq.com"></constructor-arg>
</bean>
<!-- index 属性为参数指定索引 -->
<!-- 重载的情况下使用type 为参数指定数据类型 -->
<bean id="person04" class="com.lmh.bean.Person">
index="0"
"></constructor-arg>
<constructor-arg name="age" value="22"></constructor-arg>
<constructor-arg name="gender" value="male"></constructor-arg>
<constructor-arg name="email" value="petter@qq.com"></constructor-arg>
</bean>
<!-- 通过p名称空间为bean赋值 -->
<!-- 名称空间:在xml中名称空间是用来防止标签重复 -->
<!-- 1)导入p名称空间 2)写带前缀的标签/属性 -->
<bean id="person05" class="com.lmh.bean.Person" p:name="xiaohei"
p:age="18" p:gender="male" p:email="xiaohei@qq.com"></bean>
<bean id="book001" class="com.lmh.bean.Book" p:name="围城" p:author="钱钟书"></bean>
<bean id="person001" class="com.lmh.bean.Person">
<!-- 如何给list类型赋值 -->
<property name="books">
<list>
<!-- list标签体中添加每一个元素 -->
<bean id="book00001" class="com.lmh.bean.Book" p:name="西游记"
p:author="吴承恩"></bean>
<!-- 引用一个外部元素 -->
<ref bean="book001" />
</list>
</property>
</bean>
<!-- 如何给map类型赋值 -->
<property name="maps">
<!-- maps = new LinkHashMap(); -->
<map>
<!-- 一个entry相当于一个键值对 -->
<entry key="key01" value="张三"></entry>
<!-- 引用外部bean -->
<entry key="key02" value-ref="book001"></entry>
<!-- 内部创建bean对象 -->
<entry key="key03">
<bean class="com.lmh.bean.Car">
<property name="carName" value="奔驰"></property>
</bean>
</entry>
<!-- 一个map即{1,1,{}} -->
<entry key="key04">
<map></map>
</entry>
</map>
</property>
<!-- 如何给property类型赋值 -->
<property name="properties">
<!-- props = new Properties 所有的k=v 都是string -->
<props>
<prop key="username">root</prop>
<prop key="password">root</prop>
</props>
</property>
<
<bean class="com.lmh.bean.Person">
myUtilmap"></property> 引用util:map
</bean>
<!-- util名称空间创建集合类型的bean:方便别人引用 -->
<util:map id="myUtilmap">
<!-- 添加元素 -->
<!-- 一个entry相当于一个键值对 -->
<entry key="key01" value="张三"></entry>
<!-- 引用外部bean -->
<entry key="key02" value-ref="book001"></entry>
<!-- 内部创建bean对象 -->
<entry key="key03">
<bean class="com.lmh.bean.Car">
<property name="carName" value="奔驰"></property>
</bean>
</entry>
</util:map>
<!--list中的元素: [ [],person,23,{} ] -->
<util:list id="mylist">
<list></list>
<bean class="com.lmh.bean.Person"></bean>
<value>23</value>
<ref bean="myMap"/>
</util:list>
<!-- 级联属性: 属性的属性 -->
<bean id="person04" class="com.lmh.bean.Person">
<!-- 为car赋值的时候,改变car的价格 -->
<property name="car" ref="car01"></property>
<property name="car.price" value="90000"></property>
</bean>
<bean id="per01" class="com.lmh.bean.Person">
<property name="name" value="bmw"></property>
<property name="age" value="22"></property>
<property name="gender" value="30000"></property>
</bean>
<!--parent: 指定当前bean的配置信息继承于那个 只需修改需要修改的属性即可 -->
<bean id="per02" class="com.lmh.bean.Person" parent="per01">
<property name="name" value="奥拓"></property>
</bean>
<bean id="per01" class="com.lmh.bean.Person" abstract="true">
<!-- abstract="true" 这个bean的配置是一个抽象的,不能获取实例。只能被别人用来继承 -->
获取时会报错
Person person01 = (Person) ioc.getBean("per01");
System.out.println(person01);
/**
* org.springframework.beans.factory.BeanIsAbstractException:
* Error creating bean with name 'per01':
* Bean definition is abstract
*/
<bean id="person04" class="com.lmh.bean.Person" scope="singleton" init-method="init" destroy-method="destroy">
上面的bean标签除了id和class两个属性外,还有其他属性,这里我们介绍scope、init_method和destroy-method;
当没有设置scope属性为“singleton”时,当我们每次通过Spring容器的getBean方法获取IntrduceDemo实例时,得到的都是相同的一个实例; 与singleton对应的是prototype,如果将scope属性设置为prototype,得到的就是不同的实例对象
<!-- 测试bean的作用域,分别创建单实例和多实例的bean
xxx;默认: 单实例的
scope属性的值:
prototype:多实例的
1)、 容器启动默认不会去创建多实例bean
2)、获取的时候创建这个bean对象
3)、每次获取都会创建一个新的
singleton:单实例,(默认的 )配置文件默认状态
1)、 在容器启动完成之前已经创建好对象,保存在容器中
2)、任何获取都是在获取之前创建对象
request: 在web环境下,同一次请求创建一个bean对象(没用)
session: 在web环境下,同一次会话创建一个bean对象(没用)
-->
静态工厂与实例工厂
<bean id="book" class="com.lmh.bean.Book"></bean>
<!--配置通过静态工厂方法创建的bean、实例工厂方法创建的bean、FactoryBean -->
<!--bean的创建默认就是框架利用反射new出来的bean实例 -->
<!--工厂模式:工厂帮我们创建对象:有一个专门帮我们创建对象的类,这个类就是工厂
AirPlane ap = AirPlaneFactory.getairplane(String jzName);
静态工厂: 工厂不用创建对象,通过静态方法调用, 对象 = 工厂类.工厂方法名();
实例工厂:工厂本身需要创建对象;
工厂类 工厂对象 = new 工厂类();
工厂对象.getAirPlane(“张三”);
-->
<!--静态工厂(不需要创建工厂本身)
class:指定静态工厂全类名
factory-method:指定哪个方法是工厂方法
constructor-arg:可以为方法传递参数
-->
<bean id="airplane01" class="com.lmh.factory.AirPlaneStaticFactory"
factory-method="getAirPlane">
<constructor-arg value="wangba"></constructor-arg>
</bean>
<bean id="airPlaneInstanceFactory"
class="com.lmh.factory.AirPlaneInstanceFactory"></bean>
实现factorybean的工厂
<!--factory-bean:指定当前对象创建使用那个工厂
1.先配置出实例工厂对象
2.配置我们要创建的Airplane使用那个工厂创建
1)、
-->
<bean id="airplane02" class="com.lmh.bean.AirPlane"
factory-bean="airPlaneInstanceFactory"
factory-method="getAirPlane"
>
<constructor-arg value="wangwu"></constructor-arg>
</bean>
<!--FactoryBean(是spring规定的一个接口)
只要实现这个接口,Spring都认为是一个工厂
1.容器创建的时候,并不会创建这个实例
2.FactoryBean获取的时候才创建对象
-->
<bean id="myFactoryBeanImple" class="com.lmh.factory.MyFactoryBeanImple"></bean>
<!-- 创建带有生命周期方法的bean 生命周期:bean的创建到销毁:
ioc容器中注册的bean:
1)、单实例bean,容器启动的时候就会创建好,容器关闭也会销毁创建的bean
2)、多实例bean,获取的时候才创建; 我们可以为bean自定义一些生命周期方法;
Spring在创建或者销毁的时候就会调用指定的方法; 自定义初始化方法和销毁方法。 -->
<bean id="book01" class="com.lmh.bean.Book"
destroy-method="bookDestory" init-method="bookInit"
scope="prototype"></bean>
实体类中对应的方法:
创建MyBeanPostProcessor类 继承 BeanPostProcessor接口,实现对应的方法
<!-- 测试bean的后置处理器 BeanPostProcessor
Spring有一个接口,后置处理器,可以在bean的初始化前后调用方法
-->
/**
* Bean的生命周期:
* (容器启动)构造器-->初始化方法-->(容器关闭)销毁方法
*
* 多实例:获取bean(构造器-->初始化方法)-->容器关闭不会调用bean 的销毁方法
*
* 后置处理器:
* (容器启动)构造器----后置处理器before -----> 初始化方法--->后置处理器after--->bean初始化完成
* 无论bean是否有初始化方法,后置处理器都会默认其有,还会继续工作
*/
<bean id="book01" class="com.lmh.bean.Book"
destroy-method="bookDestory" init-method="bookInit"
scope="singleton"></bean>
<bean id= "beanpostprocessor" class="com.lmh.bean.MyBeanPostProcessor"></bean>
</beans>