Spring中Bean的配置:基于XML文件的方式
Bean的配置一共有两种方式:一种是基于XML文件的方式,另一种是基于注解的方式。
本文主要介绍基于XML文件的方式
<bean id="helloWorld" class="com.sevenhu.domain.HelloWorld">
<property name="userName" value="Spring"></property>
</bean>
上面的配置代码中:
id:Bean的名称,在IOC容器中必须是唯一的,若id,没有指定,那么Spring自动将类名作为Bean的名字,id可以指定多个名字,名字之间可用逗号,分 号,或空格分隔。
Spring容器
在Spring IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化,只有在容器实例化之后,才可以从IOC容器里获取Bean的实例并使用。
Spring提供了两种类型的IOC容器实现
-BeanFactory:Ioc容器的基本实现。
-ApplicationContext:提供了更多的高级特性。是BeanFactory的子接口。
-BeanFactory是Spring框架的基础设施,面向Spring本身;ApplicationContext面向使用Spring框架的开发者。
ApplicationContext主要有两个实现类:
-ClassPathXmlApplicationContext:从类路径下加载配置文件。
-FileSystemXmlApplicationContext:从文件系统中加载配置文件。
ApplicationContext在初始化上下文时就实例化所有单例的bean。
属性注入:
即通过setter方法注入bean的属性值或依赖的对象。属性注入使用<property>元素,使用name属性值指定bean的属性名称,value属性指定属性值。使用这种注入方式,那么bean中必须有一个默认的构造函数,即无参的构造函数。
eg:
<property name="userName" value="Spring"></property>
构造方法注入:
按索引匹配入参:
<bean id="car" class="com.sevenhu.domain.Car">
<constructor-arg value="长春一汽" index="0"></constructor-arg>
<constructor-arg value="2000" index="1"></constructor-arg>
<constructor-arg value="奥迪" index="2"></constructor-arg>
</bean>
按类型匹配入参:
<bean id="car2" class="com.sevenhu.domain.Car">
<constructor-arg value="长春一汽" type="java.lang.String"></constructor-arg>
<constructor-arg value="2000" type="double"></constructor-arg>
<constructor-arg value="奥迪" type="java.lang.String"></constructor-arg>
</bean>
注:字面值都可用字符串表示,可以通过<value>元素标签或value属性进行注入。基本数据类型及其封装类,String等类型都可以采用字面值注入的方 式。
如果一个bean的某一个属性是一个对象,可使用如下配置:
<bean id="people" class="com.sevenhu.domain.People">
<property name="name" value="hujingwei"></property>
<property name="car" ref="car2"></property>
</bean>
或者使用内部类:
<bean id="people1" class="com.sevenhu.domain.People">
<property name="name" value="zhangsongzhu"></property>
<property name="car">
<!--内部bean,不能被外部的bean所引用,因此没有必要设置id-->
<bean class="com.sevenhu.domain.Car">
<property name="brand" value="Ford"></property>
<property name="creator" value="SomeOne"></property>
<property name="price" value="100000"></property>
</bean>
</property>
</bean>
可以使用专用的<null/>元素标签为Bean的字符串或其它对象的属性值注入null值,如下:
<bean id="people2" class="com.sevenhu.domain.People">
<property name="name" value="hu"></property>
<!--若某一个bean的属性值需要设置为null-->
<property name="car"><null/></property>
</bean>
使用p命名空间:
为了简化XML文件的配置,越来越多的XML文件使用属性而非子元素配置信息,因此Spring自从2.5之后就引入了一个p命名空间,可以通过<bean>元素属性的方式配置Bean的属性
<!--使用p命名空间-->
<bean id="people3" class="com.sevenhu.domain.People" p:name="seven" p:car-ref="car1">
</bean>
XML配置里的Bean自动装配
Spring IOC容器可以自动装配bean,需要做的仅仅是在<bean>的autowire属性中指定自动装配的模式,具体的装配模式如下:
-byType(根据类型装配):若IOC容器中有多个与目标bean类型一致的bean,在这种情况下,Spring将无法判定哪个bean最适合该属性,所以不能进行自动装配。
-byName(根据名称自动装配):必须将目标bean的名称和属性名设置的完全相同。
自动装配的缺点:在bean配置文件里设置autowire属性进行自动装配将会装配bean的所有属性,然而,若只希望装配个别属性,autowire不够灵活;autowire属性要么根据类型装配,要么根据名称装配,不能两者兼而有之。
继承bean配置
Spring允许继承bean的配置,被继承的bean称为父bean,继承这个bean的bean为子bean。子bean从父bean中继承配置,包括bean的属性配置,子bean也可以覆盖从父bean继承过来的配置,父bean可以作为配置模版,也可以作为bean实例,若指向把父bean作为模版,可以设置bean的abstract属性为true,这样Spring就不会实例化这个bean。并不是父bean中所有的属性都会被继承,比如:autowire,abstract等;也可以忽略父bean的class属性,让子bean指定自己的类,而共享相同的属性配置,但是此时abstract必须设为true。
<bean id="user" class="com.*.*">
<property name="userName" value="hu"/>
</bean>
<bean id="user1" parent="user">
<property name="userName" value="hu"/>
</bean>
<bean id="user2" parent="user">
<property name="userName" value="hu"/>
</bean>
依赖bean配置:
Spring允许用户通过depends-on属性设定bean前置依赖的bean,前置依赖的bean会在bean实例化之前创建好,如果前置依赖多个bean,则可以通过逗号,空格的方式配置bean的名称。
<bean id="user3" depends-on="user1">
</bean>
bean的作用域(通过<bean>标签的scope属性设置)
-singleton 在Spring IOC容器中只存在一个bean实例,bean以单例的方式存在(默认的作用域)
-prototype 每次调用getBean()时都会返回一个新的实例
-request 每次HTTP请求都会返回一个新的bean,该作用域仅适用于WebApplicationContext环境中
-session 在session中共享一个bean,该作用域仅适用于WebApplicationContext环境中
使用外部属性文件:
首先外部文件db.properties的内容如下:
jdbc.user=root
jdbc.password=1230
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///test
jdbc.initPoolSize=5
jdbc.maxPoolSize=10
那么在配置文件中配置如下:
<!-- 导入外部的资源文件 -->
<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>
IOC容器中Bean的生命周期
-通过构造器或工厂方法创建bean实例
-为bean的属性设置值和对其它bean的引用
-调用bean的初始化方法
-bean可以使用了
-当容器关闭的时候,调用bean的销毁方法。
注:当bean的声明里设置init-method和destroy-method属性,为bean指定初始化和销毁方法(这两个方法一般都没有参数)
创建bean的后置处理器
bean后置处理器允许在调用初始化方法前后对bean进行额外的处理,bean后置处理器对IOC容器里所有bean实例逐一处理,而非单一实例。对bean的后置处理器而言,需要实现
Interface BeanPostProcessor接口,在初始化方法被调用前后,Spring将把每个bean实例分别传递给BeanPostProcessor接口的以下两个方法:
postProcessorAfterInitialization(Object bean,String beanName);
postProcessorBeforeInitialization(Object bean,String beanName);
添加后置处理器后Bean的生命周期
-通过构造器或工厂方法创建bean实例
-为bean的属性设置值和对其它bean的引用
-将bean实例传递给后置处理器的postProcessorBeforeInitialization(Object bean,String beanName);方法
-调用bean的初始化方法
-将bean实例传递给后置处理器的postProcessorAfterInitialization(Object bean,String beanName);方法
-bean可以使用了
-当容器关闭的时候,调用bean的销毁方法。
代码如下:
package com.sevenhu.domain; import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* Created by hu on 2016/4/1.
*/
public class MyBean implements BeanPostProcessor {
//该方法在bean的初始化方法之前调用
@Override
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
//o就是bean实例对象,s就是bean实例的id
System.out.println("before initialication ....");
//返回bean的实例对象
return o;
} //该方法在bean的初始化方法之后调用
@Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
System.out.println("after initialication ....");
return o;
}
public static void main(String[] args){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("beans.xml");
}
}
配置代码如下:
<!--配置bean后置处理器:不需要配置id属性,IOC容器会识别到它是一个bean后置处理器,并调用其方法-->
<bean class="com.sevenhu.domain.MyBean"></bean>
通过调用静态工厂方法创建bean
调用静态工厂方法创建bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单地调用静态方法,而不关心创建对象的细节。
直接上代码,工厂如下:
<!-- 通过工厂方法的方式来配置 bean -->
<!-- 1. 通过静态工厂方法: 一个类中有一个静态方法, 可以返回一个类的实例(了解) -->
<!-- 在 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 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>
Spring中Bean的配置:基于XML文件的方式的更多相关文章
- Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析
Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML ...
- spring中bean的配置详解--定义parent
在工作中碰到了好多的配置文件,具体来说是spring 中bean配置的parent的配置,搞的我一头雾水,仔细看一下spring中有关bean的配置,剖析一下,具体什么含义! 一.Spring IoC ...
- Spring中bean的配置
先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对象的时候,一般都是直接使用关键字类new一个对象,那这样有什么坏处呢?其实很显然的,使用new那么就表示当前模块已经 ...
- Spring中Bean的配置:基于注解的方式
组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: -@Component:基本注解,标识一个受Spring管理的组件 -@Respositor ...
- 阶段3 2.Spring_10.Spring中事务控制_1 基于XML的AOP实现事务控制
新建项目 首先把依赖复制进来 aop必须引入.aspectjweaver 复制src下的所有内容 复制到我们的新项目里面 factory文件夹删掉 删除后测试类必然就报错 配置文件 beanFacto ...
- 在spring中使用quartz配置作业的二种方式
- Spring 中Bean的装配方式
最近又买了一本介绍SSM框架的书,是由黑马程序员编写的,书上讲的很好理解,边看边总结一下.主要总结一下bean的装配方式. Bean的装配可以理解为依赖系统注入,Bean的装配方式即Bean依赖注入的 ...
- Spring框架入门之基于xml文件配置bean详解
关于Spring中基于xml文件配置bean的详细总结(spring 4.1.0) 一.Spring中的依赖注入方式介绍 依赖注入有三种方式 属性注入 构造方法注入 工厂方法注入(很少使用,不推荐,本 ...
- spring中bean配置和bean注入
1 bean与spring容器的关系 Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载.实例化Bean ...
随机推荐
- sql 语句查询练习题
1. 查询Student表中的所有记录的Sname.Ssex和Class列. select sname,ssex,class from student 2. 查询教师所有的单位即不重复的Depart列 ...
- linqPad帮助你快速学习LINQ
linqPad http://www.cnblogs.com/li-peng/p/3441729.html http://www.linqpad.net/ Linqer http://www.sqlt ...
- jQuery对象与JS原生dom对象之间的转换
jQuery就是JS的一个扩展库,工具库,提供很多方便快捷的方法,所以将JS对象转换为jQuery对象后,能更方便地操作这个对象.但是jQuery对象也不是万能的,有一些JS对象有的能,jQuery对 ...
- angularJS自定义属性作为条件中转
<html> <head> <meta charset="utf-8"/> <title></title> </h ...
- iOS Provisioning Profile(Certificate)与Code Signing详解
引言 关于开发证书配置(Certificates & Identifiers & Provisioning Profiles),相信做 iOS 开发的同学没少被折腾.对于一个 iOS ...
- ArcGIS API for Silverlight 点沿着线流动
原文:ArcGIS API for Silverlight 点沿着线流动 概述 前段时间做了一个项目,要求是有一些电力输送线,电力输送线或者石油管道都是有流动方向的,用户想做一个动态效果来模拟电力的输 ...
- 371. Sum of Two Integers
不用加减法计算两个整数的和.这道题其实是考察一些基本的布尔代数知识.我们知道,二进制表示时: 0 + 0 = 00 1 + 0 = 01 0 + 1 = 01 1 + 1 = 10 所以,两个二进制整 ...
- Android笔记:Socket通讯常见问题
经验证的socket通讯问题 1.如果是模拟器和本机PC直接通讯,需要使用本机IP地址 而不是 10.0.2.2 如本机的静态地址为192.168.1.2 则直接使用该地址 2.接收和连接代码不能在 ...
- 在CentOS6.5上安装Tomcat6
Tomcat安装一向方便,linux的比win的更是这样,基本就是拷贝,类似于win中备受青睐的绿色软件,下面只是记录一下过程. 1.从 http://mirrors.cnnic.cn/apache/ ...
- T450的Fn lock
新到手一台T450,有一点让我比较恼火,就是F1~F12不能直接按必须先按Fn. 使用一阵突然发现,按住Fn+Esc能锁定/解锁Fn,锁定后F1~F12就可以直接按了. 设计者想得还是比较周到的. 2 ...