spring学习-4

bean的作用域

使用bean的scope属性来配置bean的作用域
scope="singleton"默认是单例模式即容器初始化创建bean实例,在整个容器的生命周期内只创建这一个bean;
scope="prototype":原型的,即容器初始化时不创建bean的实例,而在每次请求时,都会创建一个新的bean实例。

配置spring作用域的scope.xml文件

 	<!-- scope:作用域类型 scope="prototype" -->
	<bean name="car" class="com.test.autowire.Car" scope="singleton">
		<property name="name" value="cc"></property>
		<property name="price" value="33333.0"></property>
	</bean>

测试Main方法代码

public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext(
				"scope.xml");
		Car car = (Car) ctx.getBean("car");
		Car car2 = (Car) ctx.getBean("car");
		System.out.println(car==car2);
	}

运行效果

1、scope="singleton"运行结果:只创建了一个bean实例。返回结果为true,即car与car2指向同一个对象。

constructor create....
true

2、scope="prototype"运行结果:创建了多个bean实例,并且返回结果为false,即说明每次请求时,都会创建一个新的bean实例,指向的不是同一个对象

constructor create....
constructor create....
false

使用外部属性文件

在配置文件里配置 Bean 时, 有时需要在 Bean 的配置里混入系统部署的细节信息(例如: 文件路径, 数据源配置信息等). 而这些部署细节实际上需要和 Bean 配置相分离,
Spring 提供了一个 PropertyPlaceholderConfigurer 的 BeanFactory 后置处理器, 这个处理器允许用户将 Bean 配置的部分内容外移到属性文件中. 可以在 Bean 配置文件里使用形式为 ${var} 为变量赋值, PropertyPlaceholderConfigurer 从属性文件里加载属性, 并使用这些属性来替换变量. Spring 还允许在属性文件中使用 ${propName},以实现属性之间的相互引用。

以配置数据源为例进行外部文件配置

1.导入C3P0和MySQL驱动jia包

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring

2.新建数据源外部配置文件db.properties,配置信息要与本地MySQL配置文件信息保持一致,否则项目运行会出错

user=root
password=root
driverclass=com.mysql.jdbc.Driver
jdbcurl=jdbc:mysql:///test

3.配置spring的properties.xml文件,需要引入context 命名空间,前面文章提到过,不在多说。

<!-- 导入属性文件 使用context下的property-placeholder location:外部配置文件的位置-->
	<context:property-placeholder location="classpath:db.properties" />
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<!-- 使用外部化属性文件的属性 格式:${属性名} -->
		<property name="user" value="${user}"></property>
		<property name="password" value="${password}"></property>
		<property name="driverClass" value="${driverclass}"></property>
		<property name="jdbcUrl" value="${jdbcurl}"></property>
	</bean>

4.Main方法主要代码

public class Main {
	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext(
				"properties.xml");
	    //在强制类型转换时,要引入import javax.sql.DataSource命名空间,否则无法引用getConnection()方法
		DataSource dataSource = (DataSource) ctx.getBean("dataSource");
		try {
			System.out.println(dataSource.getConnection());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

5.运行结果

com.mchange.v2.c3p0.impl.NewProxyConnection@1e4a7dd4
posted @ 2017-01-20 22:56  starryfei  阅读(320)  评论(0编辑  收藏  举报