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

原创 2015年11月18日 09:39:54

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表达式中!

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java9 集合工厂方法

使集合框架更便捷的工厂方法JEP269中提议,为集合框架增添一些工厂方法,来使创建不可变集合类与含有少量元素的Map变得更加便捷。下文就为什么它们应运而生来展开详细的阐述。集合框架增加工厂方法是必然的...

Java知识整理——线程

进程与线程的区别 ? 进程是一个程序的执行(即正在运行的程序), 然而线程是在进程中独立的执行序列. 一个进程可以包含很多线程. 线程有时被称为轻量级的进程. 说下创建线程的不同方式. 你倾向于哪...

CountDownLatch和CyclicBarrier的区别

在网上看到很多人对于CountDownLatch和CyclicBarrier的区别简单理解为CountDownLatch是一次性的,而CyclicBarrier在调用reset之后还可以继续使用。那如...

用小说的形式讲解Spring(3) —— xml、注解和Java Config到底选哪个

有时候选择多了,也会带来烦恼

Java之CyclicBarrier使用

1、类说明: 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 C...

Spring in action 03 -- 装配 Bean(xml配置)

在上一篇中,遇到了一些问题,其实这些问题,是因为对Spring不熟悉,用的太少才会有的问题,我觉得有一些是理解上的问题,这一篇说通过XML装配bean, 有这么一句话:bean元素类似于javaco...

Spring In Action(二):基于XML配置装配bean

虽然项目中常用的是通过注解的方式装配bean,但是XML文件配置作为最初的配置方式,对于Spring学习者来说,还是很有必要了解一下的。

Spring in action 学习(2)创建Bean

2种方式-BeanFactory XMLBeanFactory(newFileSystemResource..) -ApplicationContext ClassPathXmlApp...

Spring in action 01 -- 装配 Bean(@Autowired)

昨天走马观花,看一遍Spring,当然也比较的片面,今天就从第一个知识点详细些再学习。温故而知新,可以为师也,如此而而一个概念 装配(wiring) : 创建应用对象之间协作关系的行为通常称为装配。它...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)