一、p命名空间的使用

Spring 从 2.5 版本开始引入了一个新的 p 命名空间,可以通过 <bean> 元素属性的方式配置 Bean 的属性。使用 p 命名空间后,基于 XML 的配置方式将进一步简化。

简化前:

<bean id="user" class="com.kang.TestUser">
<!-- 为属性赋值 -->
<property name="userName" value="kang"></property>
</bean>

简化后:

<bean id="user" class="com.kang.TestUser" p:userName="kang"></bean>

二、继承和依赖Bean的配置

1、Spring允许继承bean的配置,可以通过<bean>的parent属性来完成继承。子Bean从父Bean中继承配置, 包括Bean的属性配置。子Bean也可以覆盖从父Bean继承过来的配置。

父Bean可以作为配置模板, 也可以作为Bean实例. 若只想把父Bean作为模板, 可以设置<bean>的abstract属性为true, 这样 Spring将不会实例化这个Bean。

示例:

<bean id="user" class="com.kang.TestUser" p:userName="kang"></bean>
<!-- 继承自user -->
<bean id="user1" parent="user" ></bean>
<!-- 继承自user,且覆盖了user的原属性值 -->
<bean id="user2" parent="user" p:userName="Jack"></bean>

2、Spring允许用户通过 depends-on 属性设定Bean前置依赖的Bean,前置依赖的Bean会在本Bean实例化之前创建好。如果前置依赖于多个Bean,则可以通过逗号,空格的方式配置Bean的名称。

示例:

<!-- 继承自user,且覆盖了user的原属性值。并且依赖于user1这个bean -->
<bean id="user3" parent="user" p:userName="Jack" depends-on="user1"></bean>

三、在Sping的bean配置文件中使用外部属性文件

在Sping配置文件里配置Bean时, 有时需要混入系统部署的细节信息(例如: 文件路径, 数据源配置信息等),而这些部署细节实际上需要和Bean配置相分离。

Spring 提供了一个 PropertyPlaceholderConfigurer的BeanFactory后置处理器, 这个处理器允许用户将Bean配置的部分内容外移到属性文件中。可以在Bean配置文件里使用形式为 ${var}的变量, PropertyPlaceholderConfigurer从属性文件里加载属性, 并使用这些属性来替换变量。

示例:

假设在类路径下创建一个文件,名为db.properties,用来存放外部信息。内容如下:

jdbc.user=root
jdbc.password=123456
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:8030/test jdbc.initPoolSize=5
jdbc.maxPoolSize=10

在bean配置文件中,可以通过如下方式访问上述外部文件信息。

  <!-- 导入外部的资源文件,classpath表示文件在类路径下-->
<context:property-placeholder location="classpath:db.properties"/> <!-- 获取文件具体信息 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>

四、Spring表达式语言(SpEL)

Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpEL。

通过 SpEL 可以实现:通过bean的id对bean进行引用;调用方法以及引用对象中的属性;计算表达式的值;正则表达式的匹配;

示例:

1、字面量的表示

<property name="count" value="#{5}"/>

2、引用其他bean对象的属性

<bean id="father" class="com.kang.Father">
<property name="fatherName" value="Jack"></property>
</bean>
<bean id="child" class="com.kang.Child">
<property name="childName" value="Tom"></property>
<property name="fatherName" value="#{father.fatherName}"></property>
</bean>

3、调用其他方法,还可以链式操作

<property name="fatherName" value="#{father.fatherName.toString()}"></property>

五、IOC容器中Bean的生命周期

Spring IOC容器对Bean的生命周期进行管理的过程:

1、通过构造器或工厂方法创建Bean实例;

2、为 Bean的属性赋值;

3、调用Bean的初始化方法(init-method);

4、Bean可以使用了;

5、当容器关闭时, 调用 Bean 的销毁方法(destroy-method)。

可以通过在Bean的声明里设置init-method和destroy-method属性, 为Bean指定初始化方法和销毁方法。

Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理。它对IOC容器里的所有Bean实例逐一处理, 而非处理单一实例. 其典型应用是: 检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性。

对Bean后置处理器而言, 需要实现 BeanPostProcessor这个接口。在初始化方法被调用前后, Spring将把每个Bean实例分别传递给上述接口的以下两个方法:postProcessAfterInitialization(初始化后处理)和postProcessBeforInitialization(初始化前处理)。

这样加入后置处理器后,Spring IOC容器对Bean的生命周期进行管理的过程:

1、通过构造器或工厂方法创建Bean实例;

2、为 Bean的属性赋值;

3、将Bean实例传递给Bean后置处理器的 postProcessBeforeInitialization 方法;

4、调用Bean的初始化方法;

5、将Bean实例传递给Bean后置处理器的 postProcessAfterInitialization方法;

6、Bean可以使用了;

7、当容器关闭时, 调用Bean的销毁方法。

示例:

public class MyBeanPostProcessor implements BeanPostProcessor {

	//该方法在 init 方法之前被调用
/**
* @param arg0: 实际要返回的对象
* @param arg1: bean 的 id 值
*/
@Override
public Object postProcessBeforeInitialization(Object arg0, String arg1)
throws BeansException {
if(arg1.equals("user"))
System.out.println("postProcessBeforeInitialization..." + arg0 + "," + arg1);
return arg0;
} //该方法在 init 方法之后被调用
/**
* @param arg0: 实际要返回的对象
* @param arg1: bean 的 id 值
*/
@Override
public Object postProcessAfterInitialization(Object arg0, String arg1)
throws BeansException {
if(arg1.equals("user")){
System.out.println("postProcessAfterInitialization..." + arg0 + "," + arg1);
//可以替代原初始化对象返回
User user = (User) arg0;
user.setUserName("kang");
}
return arg0;//替换了原来的bean对象
} }

六、创建 Bean的两种方法

1、调用静态工厂方法创建Bean

调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中。 当客户端需要对象时, 只需要简单地调用静态方法, 而不同关心创建对象的细节。

要声明通过静态方法创建的Bean, 需要在Bean的class属性里指定拥有该工厂的方法的类, 同时在factory-method属性里指定工厂方法的名称。最后, 使用 <constrctor-arg> 元素为该方法传递方法参数。

示例:

   <!-- 通过工厂方法的方式来配置 bean -->
<!-- 在 class 中指定静态工厂方法的全类名, 在 factory-method 中指定静态工厂方法的方法名 -->
<bean id="dateFormat" class="java.text.DateFormat" factory-method="getDateInstance">
<!-- 可以通过 constructor-arg 子节点为静态工厂方法指定参数 -->
<constructor-arg value="2"></constructor-arg>
</bean>

2、调用实例工厂方法创建Bean

将对象的创建过程封装到另外一个对象实例的方法里。当客户端需要请求对象时, 只需要简单的调用该实例方法而不需要关心对象的创建细节。

要声明通过实例工厂方法创建的Bean,需要在bean的factory-bean属性里指定拥有该工厂方法的Bean,并且在factory-method属性里指定该工厂方法的名称。之后使用 construtor-arg 元素为工厂方法传递方法参数。

示例:

<!-- 实例工厂方法-->
<!-- ①. 创建工厂对应的 bean -->
<bean id="simpleDateFormat" class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd hh:mm:ss"></constructor-arg>
</bean> <!-- ②. 有实例工厂方法来创建 bean 实例 -->
<!-- factory-bean 指向工厂 bean, factory-method 指定工厂方法-->
<bean id="datetime" factory-bean="simpleDateFormat" factory-method="parse">
<!-- 通过 constructor-arg 执行调用工厂方法需要传入的参数 -->
<constructor-arg value="1990-12-12 12:12:12"></constructor-arg>
</bean>

Sping中Bean配置的深入探讨的更多相关文章

  1. Sping中的配置Bean详解

    一.spring实例化对象的方法 在Spring中,所有管理的对象都是JavaBean对象,而BeanFactory和ApplicationContext就是spring框架的两个IOC容器,现在一般 ...

  2. spring中bean配置和bean注入

    1 bean与spring容器的关系 Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载.实例化Bean ...

  3. spring中bean配置和注入场景分析

    bean与spring容器的关系 Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载.实例化Bean,并 ...

  4. 关于spring中bean配置的几件小事

    一.IOC和DI 1.IOC(Inversion of Control) 其思想是反转资源获取的方向.传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源:而应用了IOC之后 ...

  5. spring applicationContext.xml 中bean配置

    如果采用set get方法配置bean,bean需要有set get 方法需要有无参构造函数,spring 在生成对象时候会调用get和set方法还有无参构造函数 如果采用constructor方法则 ...

  6. spring中bean的配置详解--定义parent

    在工作中碰到了好多的配置文件,具体来说是spring 中bean配置的parent的配置,搞的我一头雾水,仔细看一下spring中有关bean的配置,剖析一下,具体什么含义! 一.Spring IoC ...

  7. [原创]java WEB学习笔记101:Spring学习---Spring Bean配置:IOC容器中bean的声明周期,Bean 后置处理器

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. Spring中常用类型的bean配置(Map,List,Set,基本类型)

    给自己做个笔记... 有时会用到配置文件中配置一下映射关系,方便以后扩展.此时可采用集合类型的bean配置方式配置.程序中直接注入即可. map类型的: <!-- 旧版方式,无需util包 -- ...

  9. Spring中Bean的配置:基于XML文件的方式

    Bean的配置一共有两种方式:一种是基于XML文件的方式,另一种是基于注解的方式.本文主要介绍基于XML文件的方式 <bean id="helloWorld" class=& ...

随机推荐

  1. NOI热身赛A. 小w、小j和小z

    $n \leq 100000$个点在数轴上运动,给初始位置和速度.能删$k$个点,问最晚什么时候发生第一次碰撞. 这个贪心题有点惊.. 首先肯定二分答案,然后就是判断怎么删这$k$个点.我想可以把有冲 ...

  2. Android系统默认语言改为中文

    第一种方法: 修改 build/tools/buildinfo.sh echo "ro.product.locale.language=zh"echo "ro.produ ...

  3. 对于Redux的理解

    在移动端项目,经常会在不同view中进行传递数据,事件.当事件比较少时,我们可以通过常规的事件流方法,注册,发布事件 进行响应等等.但是项目中一个事件多处响应时候,就会使程序变得相当复杂.在现在的Vu ...

  4. dedecms--后台添加会员栏目(批量添加)

    最近在用dedecms二次开发会员功能,一开始做了一个会员添加,但是领导要求可以批量添加,最好是可以输入添加个数:这样我想添加几个就添加几个了 1:会员添加的htm页面 <html> &l ...

  5. Struts2的上传与下载

    转自:http://blog.csdn.net/Mark_LQ/article/details/49822821 10.1.1 文件上传基本案例   第一步:上传组件依赖与commons-fileup ...

  6. HRBUST 2072:萌萌哒十五酱的礼物~(树,字典树)

    题意:n个点的一棵树,树的边上有权值.一条路径的权值定义成这条路径上所有边的权值的xor.问所有路径的最大权值是多少. 思路: 首先,树上任意两点之间的路可以表示成 这两点到根节点的路- 其最近公共祖 ...

  7. [__NSCFConstantString size]: unrecognized selector sent to instance 错误

    因为使用时候的类型和初始化的对象类型不匹配造成的,例如 - (NSMutableDictionary *)getMenuItems{    NSArray *defaultTmp = [NSArray ...

  8. 使用viewPage实现图片轮播

    概述 图片循环播放这种效果,在许多的场合都能看到,只要一打开各大主流网站的首页几乎都有一个这样的组件,它可以很显目的提供给用户最近最火热的信息.因为它应用得如此之广泛,今天,我们就来写一下这个组件. ...

  9. 邁向IT專家成功之路的三十則鐵律 鐵律六:求全求盈之道-佈施

    如果您只是在IT方面的專業技術與經驗相當高超,而不懂得在日常生活之中當一位俠義肝膽之人,來隨時隨地伸手幫助身旁需要幫助的人,那麼您只能算是一位有勇有謀但卻無智慧的匹夫罷了.既是匹夫那麼即便成功也會是短 ...

  10. sshpass结合ssh和scp可以自动完成密码登录,无需手动输入密码

    使用方法: 1.sshpass -p 123456 ssh admin@1.1.1.1 "touch file"  远程创建文件file 2.sshpass -p 123456 s ...