引用外部屬性文件:
當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