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>  
posted @ 2016-05-07 16:42  Taogen  阅读(118)  评论(0编辑  收藏  举报