关闭

xml形式装配bean——spring in action chapter 2

标签: spring
77人阅读 评论(0) 收藏 举报
分类:

1、声明bean

利用beans命名空间:

<beans xmlns=....>      <bean id = "beanId"     class="com.beanClass" /> </beans>

当spring容器加载该bean时,spring将调用默认的构造器实例化beanClass,相当于 new beanClass();
可以这样加载application context:

ApplicationContext ctx = new
ClassPathXmlApplicationContext(“com/test/spring-demo.xml”);
beanClass beanDemo = ctx.getBean(“beanId”);
beanDemo.go();

BeanFactory是最基本最简单的spring容器,提供最基本的DI支持,我们这里用的是高级的spring容器——ApplicationContext,它基于BeanFactory之上构建,并提供面向应用的服务,比如可以从FileSystem、ClassPath、Web读取xml配置。

2、注入

构造器注入:

<bean id="poeticDuke" class="....">
    <constructor-arg value="15"/>
    <constructor-arg ref="otherBeanId">
<bean>

工厂方法创建bean:

<bean id="theStage" calss="..." factory-method="getInstance" />

3、bean的作用域

<bean id="" class="" scope="prototype"/>

默认是singleton,注意这里的单例仅限于spring applicationContext范围内;真正的单例要求每个类加载器只有一个实例,而spring的单例bean只是保证是每个application context中只有一个该bean的实例。当然,你可以用传统方式再new一个该bean,甚至定义几个声明来实例化同一个bean;
prototype:每次调用都创建一个新的实例;
request和session仅在基于web的上下文中才有用,如spring mvc中,分别表示在每次http请求和每次http session中都创建一个实例。

4、初始化和销毁bean

<bean id="" class="" init-method="turnOnLights" destroy-method="turnOffLights" />

如果该application context中很多bean都有相同名字的init和destroy方法,可以在beans中设置属性统一设置:

<beans xmlns=...    default-init-method="turnOn" default-destroy-method="turnOff" ></beans>

另外,也可以通过让bean分别实现spring的InitializingBean和DisposableBean接口来定义初始化和销毁方法,这样spring能够自动检测实现了这些接口的bean,而无需额外的配置;但是,这样会使bean与spring的api产生耦合,所以强烈不建议这样,除非你是开发一个明确地只在spring容器内使用的框架bean;

5、setter方法注入

<bean id="" class="" >
    <property name="" value="" />
    <property name="" ref="anotherBeanId" />
    <property name="" ><bean class=""/></property>
</bean>

也可以使用命名空间p装配,需在beans中声明xmlns:p,用法如下:

<bean id="" class="" p:propName1="literalValue" p:propName2-ref="anotherBeanId" />

也可以装配集合,spring提供的集合配置元素有:
list 允许重复
set 不允许重复
map 装配任意类型的key-value
props 只能装配string-to-string
数组和任意java.util.Collection的实现,都可以用list和set进行装配,只是是否有重复需要注意。
装配list和set:

<bean id="" class="">
    <property name="instruments">
        <list>
            <ref bean="guitar" />
            <ref bean="cymbal" />
        </list>
    </property>
</bean>

装配map:

<bean id="" class="">
    <property name="">
        <map>
            <entry key="" value="">
            <entry key="" value-ref="">
            <entry key-ref="" value="">
            <entry key-ref="" value-ref="">
        </map>
    </propety>
</bean>

装配properties:

<bean id="" class="">
    <property name="">
        <props>
            <prop key="">value1</prop>
            <prop key="">value2</prop>
        </props>
    </property>
</bean>

装配null:

<bean id="" class="">
    <property name=""><null/></propety>
</bean>

6、用SpEL装配

<property name="" value="#{literalValue}"/>
<property name="" value="#{anotherBeanId}"/>
<property name="" value="#{anotherBeanId.valueA}"/>
<property name="" value="#{aBeanId.methodA()}" />
<property name="" value="#{aBeanId.methodA().toUpperCase()}" />
<property name="" value="#{aBeanId.methodA()?.toUpperCase()}" />
<property name="" value="#{T(java.lang.Math).random()}"/>
<property name="circumference" value="#{2*T(java.lang.Math).PI * circleBeanId.radius}" />
<property name="fullName" value="#{performer.firstName + '' + performer.lastName}" />
<property name="isBig" value="#{counter.total gt 100000}" />
<property name="outOfStock" value="#{!product.avaliable}" />
<property name="outOfStock" value="#{not product.avaliable}" />
<property name="instrument" value="#{kenny.song != null ? kenny.song : 'anotherSongName'}" />
<property name="instrument" value="#{kenny.song ?: 'anotherSongName'}" />
<property name="isEmail" value="#{admin.email matches 'regExp'}" />

SpEL对集合筛选操作:
通过util:list定义一个City的List集合:

<util:list id="cities">
    <bean class="com.demo.City" p:name="" p:state="" p:population="">
    <bean class="com.demo.City" p:name="" p:state="" p:population="">
    <bean class="com.demo.City" p:name="" p:state="" p:population="">
    <bean class="com.demo.City" p:name="" p:state="" p:population="">
</util:list>

访问集合成员:

<property name="" value="#{cities[2]}" />
<property name="" value="#{cities['Chicago']}" />
<property name="" value="#{cities[T(java.lang.Math).random() * cities.size()]}" />
<property name="bigCities" value="#{cities.?[population gt 100000]}" />
<property name="firstBigCity" value="#{cities.^[population gt 100000]}" />
<property name="lastBigCity" value="#{cities.$[population gt 100000]}" />

投影:

<property name="cityNames" value="#{cities.![name]}" />
<property name="cityNames" value="#{cities.![name+',    '+state]}" />
<property name="bigCityNames" value="#{cities.?[population gt 100000].![name+', '+state}" />

这里没有深入探究SpEL,仅供了解。因为SpEL最终是一个字符串,不易于测试,也不支持IDE的语法检查,过多使用会造成危险。
注意,不要被SpEL迷惑!要抵抗SpEL的诱惑,不要把过多的逻辑放入SpEL表达式中!

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:889次
    • 积分:66
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档