bean的作用域 使用bean的 scope 屬性來配置bean的作用域 scope="singleton" : 預設是單例模式 即容器初始化創建bean實例,在整個容器的生命周期內只創建這一個bean; scope="prototype" : 原型的 ,即容器初始化時不創建bean的實例,而在每次 ...
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