正确给各种类型的属性赋值

基本类型直接使用
<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标签创建 car = new  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="[email protected]"></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="[email protected]"></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="[email protected]"></constructor-arg>
    </bean>
    <!-- index 属性为参数指定索引 -->
    <!-- 重载的情况下使用type 为参数指定数据类型 -->
    <bean id="person04"  class="com.lmh.bean.Person">
        <constructor-arg name="name"  value="petter" index="0"
            type="java.lang.Integer"></constructor-arg>
        <constructor-arg name="age"  value="22"></constructor-arg>
        <constructor-arg name="gender"  value="male"></constructor-arg>
        <constructor-arg name="email"  value="[email protected]"></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="[email protected]"></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">
        <property name="maps"  ref="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
    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>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/lmh1008/p/11799479.html