Spring學習(四)引用外部屬性文件、自動裝配

引用外部屬性文件:

當bean的配置信息逐漸增多時,查找和修改一些bean的配置信息變得更加困難。這時,可以將一部分信息提取到bean配置文件的外部,以properties格式的屬性文件保存起來,同時在bean的配置文件中引用properties屬性文件中的內容,從而實現一部分屬性值在發生變化時只修改properties文件即可。這種技術多用於連接數據庫的基本信息的配置

以連接數據庫的基本信息的配置爲例:

①導入druid的jar包和mysql驅動

 

②新建datesource.xml文件

 

	<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource" p:driverClassName="com.mysql.jdbc.Driver"
	p:url="jdbc:mysql://localhost:3306/test" p:username="ztt" p:password=123">
	</bean>

測試類:

package com.ztt.spring;

import java.sql.SQLException;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.alibaba.druid.pool.DruidDataSource;

public class Test {
	public static void main(String[] args) throws SQLException{
		ApplicationContext ac = new ClassPathXmlApplicationContext("datasource.xml");
		DruidDataSource bean = ac.getBean("datasource",DruidDataSource.class);
		System.out.println(bean.getConnection());
	}
}

運行結果:

com.mysql.jdbc.JDBC4Connection@5b6feec0

或者以properties方式配置,新建一個db.properties文件:

jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/test
jdbc.username = ztt
jdbc.password = 123

①通過bean標籤加載資源文件,${}從spring加載的資源文件中通過鍵獲得值

	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="db.properties"></property>
	</bean>
	
	<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
		<property name="driverClassName" value="${jdbc.driver}"></property>
		<property name="url" value="${jdbc.url}"></property>
		<property name="username" value="${jdbc.username}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>

②通過context標籤加載資源文件,設置資源文件路徑(需引入context標籤)

	<context:property-placeholder location="db.properties"/>
	<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
		<property name="driverClassName" value="${jdbc.driver}"></property>
		<property name="url" value="${jdbc.url}"></property>
		<property name="username" value="${jdbc.username}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>

自動裝配(屬性必須是非字面量的屬性):

概念:

①以value或ref的方式明確指定屬性值都是手動裝配

②根據指定的裝配規則,不需要明確指定,Spring自動將匹配的屬性值注入bean中

裝配模式(autowire屬性,取值有byType和byName):

①根據類型(byType)自動裝配:將類型匹配的bean作爲屬性注入到另一個bean中,若IOC容器中有多個與目標bean類型一致的bean,Spring將無法判斷哪個bean最適合該屬性,所以不能執行自動裝配

②根據名稱(byName)自動裝配:必須將目標bean的名稱和屬性名設置的完全相同

③通過構造器自動裝配:當bean中存在多個構造器時,此種自動裝配方式將會很複雜,不推薦使用

示例:

根據類型(byType),需注意類型兼容問題,bean管理的對象可以給父類賦值,也可以給實現的接口賦值:

	<bean id="ccc" class="com.ztt.spring.Car" p:brand="Audi" p:price="888888"></bean>
	<bean id="person" class="com.ztt.spring.Person" autowire="byType">
		<property name="name" value="ztt"></property>
		<property name="age" value="18"></property>
	</bean>

根據名稱(byName):

	<bean id="car" class="com.ztt.spring.Car" p:brand="Audi" p:price="888888"></bean>
	<bean id="person" class="com.ztt.spring.Person" autowire="byName">
		<property name="name" value="ztt"></property>
		<property name="age" value="18"></property>
	</bean>

因爲Person類中有一個屬性名爲car,所以必須有一個id爲car的bean

問題:

當設置autowire屬性,會作用於該bean中所有非字面量屬性,但是有時候並不需要爲全部屬性賦值,所以,以上兩種方式都不使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章