zoukankan      html  css  js  c++  java
  • spring_2装配bean

    bean的使用

    通过装配bean,spring帮你创建一个javabean类的实例对象,这样你可以从spring Ioc容器中取出对象,不用自己去new。
    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    User user = (User) ctx2.getBean("user");
    或者User user = ctx2.getBean(User.class);//要求xml文件中该类的bean只有一个

    装配bean的方式
    • 使用一个或多个xml文件作为配置文件方式
    • 基于java注解方式
    • 混合使用xml文件和注解方式(推荐使用)
    通过xml配置bean

    基于XML文件的方式,通过全类名(反射)的方法配置bean
    声明bean,通过<bean>标签声明bean。

    <bean id="stage" class="spring.Stage" > </bean>
    
    通过工厂方法创建bean

    当一个javabean类没有公开的构造方法,通过该类的一个静态内部类去创建这个类的实例,然后去调用这个内部类的对象。
    配置这样的bean,通过<bean>标签中的factory-method属性,来调用一个指定的静态方法。
    1.javabean类

    public class Stage{
        private Stage(){   
        }
        private static class StageSingleton{
            static Stage stage = new Stage();
        }
        public static Stage getInstance(){
            return StageSingleon.stage;    
        }
    }
    

    2.bean的配置

    <bean id="stage" class="spring.Stage" 
                factory-method="methodName" />
    
    bean的作用域

    通过配置bean 的scope属性,指定bean的作用域
    singleton (默认)容器初始时创建bean实例,整个容器的生命周期中只创建这一个实例,单例的
    prototype 原型的,容器初始化时不创建bean实例,而在每一次请求时都创建一个新的bean的实例
    request、session、global-session

    <bean id="car" class="scope.Car"  scope="prototype">
            <property name="brand" value="audi"></property>
            <property name="price" value="12000"></property>
    </bean>  
    
    配置bean的属性

    java类一般通过set方法和构造方法来为属性赋值。spring中<property>是依靠set方法,<constructor-arg>是依靠构造方法。
    使用直接量为属性赋值,直接量会自动转换为该属性的基本数据类型。
    1.<property>标签,是通过类的set方法为bean对象的属性赋值,必须要有对应的set方法

    <bean id="car" class="beans.Car">
            <property name="brand" value="audi"></property>
            <property name="price" value="10000"></property>
    </bean>  
    

    2.<constructor>标签,是通过构造方法为bean对象的属性赋值,需要有对应的构造方法。

    <bean id="car2" class="beans.Car">
            <constructor-arg value="bengci"></constructor-arg>
            <constructor-arg value="10000" type="int"></constructor-arg>
    </bean>  
    
    基本使用标签

    1.使用<ref>标签,引用其他bean

    <bean name="person" class="beans.Person"> 
        <property name="car" ref="car"></property>
        <property name="car">
                <ref bean="car"/>
        </property>
    </bean> 
    

    2.使用内部bean,只能在内部使用,不能被外部访问

    <bean name="person" class="beans.Person"> 
        <bean class="beans.Car">
               <property name="brand" value="baoma"></property>
              <property name="price" value="10000"></property>
        </bean>
    </bean>  
    

    3.通过p命名空间为bean的属性赋值,需要先导入p命名空间,相对于传统的配置方式更为简洁

    <bean id="person5" class="collection.Person" 
    p:name="lisi" p:age="34" p:cars-ref="listCars"></bean>  
    

    4.测试赋值null

    <bean id="person2" class="beans.Person">  
        <property name="car"><null/></property>  
    </bean>  
    
    装配集合

    1.配置List、Set、Array等集合属性,
    其他的只需替换<list>标签,使用<set>,<array>标签

    <bean name="person3" class="collection.Person"> 
        <property name="cars">
            <list>
                    <ref bean="Ccar"/>
                    <ref bean="Ccar2"/>
                </list>
        </property>
    </bean> 
    

    2.配置Map集合
    使用map节点及map的entry子节点配置Map类型成员变量

    <bean id="newPerson" class="collection.NewPerson"> 
        <property name="car">
            <map>
                <entry key="AA" value-ref="Ccar"></entry>
                <entry key="BB" value-ref="Ccar2"></entry>
            </map>
        </property>
    </bean> 
    

    3.配置Properties集合
    使用props 和 子节点prop 来为Properties属性赋值

    <bean id="dataSource" class="collection.DataSource"> 
        <property name="properties">
            <props>
                    <prop key="user">root</prop>
                    <prop key="password">root</prop>
                    <prop key="jdbcUrl">jdbc:mysql:///test</prop>
                    <prop key="dirverClass">com.mysql.jdbc.Driver</prop>
            </props>
        </property>
    </bean> 
    
    使用表达式装配

    spEL表达式的使用,#{}
    <property name="count" value="#{}"/>

    1.字面值(基本数据类型)
    #{5}、#{1.2}、#{“zhangsan”}、#{false}
    科学计数法#{1e4},混合使用value=“the value is #{5}”

    2.引用bean,bean的属性
    引用bean
    <property name="car" value="#{car1}">相当于<property name="car" ref="car1"/>
    引用bean的属性
    <property name="name" value="#{person.name}"/> //bean的id.属性名
    调用bean的方法
    <property name="name" value="#{person.getName()}"/>

    3.操作类
    通过#{T(类名).属性},#{T(类名).方法}
    <property name="munber" value="#{T(java.lang.Math).PI}"/>
    <property name="randomNmuber" value="#{T(java.lang.Math).random()}"/>

    4.数值运算,逻辑运算和三元运算符
    value="#{counter.total-2}"
    value="#{T(java.lang.Math).PI*circle.radius*2}"

    5.正则表达式
    通过matches运算符支持正则表达
    <property name="email" value="#{admin.email matches '[a-zA-Z0-9._%+-]+@[a-zA-z0-9.-]+\.com'}"/>

    6.筛选集合
    使用<util:list>标签配置Car对象的List集合,spEL可以从中筛选满足条件的一个或者多个Car对象

    <util:list id="cars">
       <bean class="beans.Car" 
           p:brand="aodi" p:price="10000"/>
        <bean class="beans.Car" 
            p:brand="baoma" p:price="20000"/>    
        <ref bean="car 1"/>
    </util:list> 
    

    可以访问集合成员,集合的元素个数
    value="#{cars[2]}"、value="cars"
    value="#{cars.size()}"

    加载一个.properties文件
    <util:properties id="jdbc" location="classpath:db.properties">

    通过bean的某个属性筛选集合中的对象
    value="#{cars.?[price gt 1000]}" //找到价格为10000的Car对象

    投影运算符
    .![]取对象的某些属性组成一个新的集合
    value="#{cars.![brand]}" //一个string类型的集合,每个元素为brand的值
    value="#{cars.!['the car brand is' + [brand] + 'price is' +[price] ]}" //一个String类型的集合

    抽象bean

    bean的abstract 属性设为 true 。这样的bean 不能被 IOC 容器实例化,只能用来继承配置
    若一个bean的 class 没有指定,则该 bean 一定是个抽象 bean
    使用bean 的 parent 属性指定继承哪个 bean 的配置

    <bean id="address-abstract" 
            p:city="harbin" p:street="sobei" abstract="true"></bean>
    
    <bean id="address3" class="autowire.Address" 
            p:street="songpu" parent="address-abstract"></bean>  
    
    bean之间的依赖

    A bean 依赖 B bean,在设置这个A bean的时候,必须存在B这个bean,不然在IOC容器初始化的时候就会报错

    <bean id="person" class="autowire.Person" 
            p:name="taogen" p:address-ref="address" depends-on="car"></bean>
    <!-- 没有car这个bean,调用person这个bean的对象时会报错-->
    <bean id="car" class="autowire.Car" 
            p:brand="baoma" p:price="120000"></bean>  
    
  • 相关阅读:
    【刷题】Linux修改权限命令
    【刷题】Linux进程通信方式
    【刷题】网络:TCP与UDP
    【刷题】SQL基本操作
    【刷题】数据库三大范式
    【刷题】java会不会内存泄漏
    【刷题】Java-重写和重载
    【刷题】Java面向对象概述
    【刷题】Java垃圾回收常见问题
    测试常见问题合集
  • 原文地址:https://www.cnblogs.com/TaogenJia/p/5468622.html
Copyright © 2011-2022 走看看