一、String的配置
1.XML的提示配置
首先,拷貝下圖中的網址,
然後,打開Windows - - Preferences,搜索XML Catalog,點擊User Specified Entries,再點擊Add,
得到如下界面:在1處粘貼複製的網址,2處找到硬盤中對應的文件(本電腦的路徑爲:E:\Spring4.2.4\spring-framework-4.2.4.RELEASE-schema\beans),在3處選擇Schema location,然後點擊OK。
最後,得到如下效果:當輸入左括號<時,會出現如下提示,
2.< bean > 標籤的id和name配置
id:使用了約束中的唯一約束(不能重複),裏面不能出現特殊的字符;
name:沒有使用約束中的唯一約束(理論上不會出現重複數字,但是實際開發不能出現),裏面可以出現特殊字符(比如“\”)
理解:可以認爲id和name的功能是一樣的,都是起一個標識的作用,不過id中不能出現特殊字符,而name可以,將下圖中的id換成name完全沒有問題。
3.< bean > 的生命週期配置
init-method:Bean被初始化的時候執行的方法;
destroy-method:Bean被銷燬的時候執行的方法(前提:Bean是單例創建的,在工廠關閉時執行)。
Spring的單例與多例:
單例(singleton):只有一個共享的實例存在,所有對這個bean的請求都會返回這個唯一的實例。
多例(prototype):對這個bean的每次請求都會創建一個新的bean實例,類似於new。
通俗理解:單例模式只創建一個對象,即new一次,而多例模式,每調用一次new一個對象。
注:Spring bean 默認是單例模式。
轉自:https://www.cnblogs.com/nickup/p/9800120.html
配置代碼:
配置文件中代碼爲:
<!-- spring的生命週期的配置 -->
<bean id = "userdao" class = "com.UserDAOImpl" init-method="setup" destroy-method="destroy"></bean>
另外,在UserDAOImpl類中需要添加setup()和destroy()方法,
public void setup() {
System.out.println("該類的對象被初始化了");
}
public void destroy() {
System.out.println("該類的對象被銷燬了");
}
測試代碼:
@Test
public void demo2() {
//創建spring工廠
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring_first.xml");
UserDAO userdao = (UserDAO) applicationContext.getBean("userdao");
userdao.save();
applicationContext.close(); //銷燬對象
}
運行結果:可見,工廠創建了UserDAOImpl類的實例對象,然後先調用了setup()方法,然後又調用了save()方法,之後在對象被銷燬時,調用了destroy()方法。
4.< bean > 的作用範圍的配置
scope:Bean的作用範圍,singleton和prototype用的最多。
singleton:單例模式,Spring默認的,Spring會默認單例模式去創建對象;
prototype:多例模式,(在Struts2和Spring整合時一定會用到);
request:應用在Web項目中,Spring創建這個類的對象之後,將這個類對象存入request範圍中;
session:應用在Web項目中,Spring創建這個類的對象之後,將這個類對象存入session範圍中;
globalsession:應用在Web項目中,必須在prolet環境(舉個例子,相當於登陸了QQ,則QQ音樂、QQ遊戲等都有不需要登錄了)下使用,如果沒有這種環境,則相當於session。
舉例:單例與多例模式的區別:
配置文件代碼:
<!-- spring的Bean作用範圍的配置 -->
<bean id = "userdao" class = "com.UserDAOImpl" scope="singleton"
init-method="setup" destroy-method="destroy"></bean>
測試代碼:
@Test
public void demo2() {
//創建spring工廠
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring_first.xml");
UserDAO userdao = (UserDAO) applicationContext.getBean("userdao");
System.out.println(userdao);
UserDAO userdao1 = (UserDAO) applicationContext.getBean("userdao");
System.out.println(userdao1);
System.out.println(userdao == userdao1);
applicationContext.close(); //銷燬對象
}
單例測試結果:
多例測試結果:
結果分析:單例創建的對象只new了一次,所以調用兩次該對象(UserDAOImpl類對象)的地址是一樣的,並且userdao 和userdao 1比較結果爲true,而多例創建的對象每調用一次,new一次,所以兩次調用對象的地址不一樣,並且返回false。
5.Spring中屬性注入的方式
給屬性設置值有三種方式:構造函數方式、set方法方式、接口注入的方式。
構造函數方式:
public class User{
private String name;
private String password;
public User(String name, String password){
this.name = name;
this.password = password;
}
}
set方法方式:
public class User {
private String name;
private String password;
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
}
接口注入的方式:
public interface Injection{
public void setName(String name);
}
public class User implements Injection{
private String name;
public void setName(String name){
this.name = name;
}
}
Spring支持的注入方式:構造函數方式、set方法方式
set方法方式舉例(設置普通類型屬性):
屬性類代碼:
public class Car { //屬性類代碼
private String name;
private Double price;
public void setName(String name) {
this.name = name;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
return "Car [name=" + name + ", price=" + price + "]";
}
}
配置文件代碼:
<!-- spring的屬性注入的set方法方式配置 -->
<bean id = "car" class = "com_1.Car">
<property name="name" value = "奔馳"/>
<property name="price" value = "1000000"/>
</bean>
測試代碼:
@Test
public void demo3() {
//創建spring工廠
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring_first.xml");
Car car = (Car) applicationContext.getBean("car");
System.out.println(car);
}
測試結果:
構造函數方式舉例(設置普通類型屬性):與set方法的主要區別爲:配置文件的配置使用,另外注入方式採用構造函數方式,
配置文件代碼:
<!-- spring的屬性注入的構造方法方式配置 -->
<bean id = "car1" class = "com_1.Car1">
<constructor-arg name = "name" value = "寶馬"/>
<constructor-arg name = "price" value = "800000"/>
</bean>
測試結果:
set方法方式舉例(設置引用類型屬性):
引用類型屬性注入代碼:
public class Employee {
private String name;
private Car1 car;
public void setName(String name) {
this.name = name;
}
public void setCar(Car1 car) {
this.car = car;
}
@Override
public String toString() {
return "emplyee [name=" + name + ", car=" + car + "]";
}
}
配置文件代碼:注意,對於對象的屬性注入,使用關鍵字ref = “a”,a爲某一個類的實例對象。
<!-- spring的屬性注入的set方法方式配置 -->
<bean id = "employee" class = "com_1.Employee">
<property name="name" value = "張三"/>
<property name="car" ref = "car1"/>
</bean>
測試代碼:
@Test
public void demo5() {
//創建spring工廠
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring_first.xml");
Employee employee = (Employee) applicationContext.getBean("employee");
System.out.println(employee);
}
測試結果:
注:對於構造函數方式(設置引用類型屬性),只需要改改配置文件和注入方式即可。
6.引入p名稱空間的屬性注入方式(只能替換property,即對應的類只能採用set方法注入)
p名稱空間注入方式的作用是替換下圖中標註的代碼:
格式:
普通屬性: p:屬性名=“值”
對象屬性: p:屬性名-ref=“值”
這裏,屬性名錶示類中創建的變量(包括普通類型和引用類型),值爲要注入的值(可以爲普通類型和引用類型)。
步驟:
第一步:p名稱空間的引入,在配置文件中相應位置添加如下代碼,
xmlns:p="http://www.springframework.org/schema/p"
第二步:先將Spring控制的Car類對象car注入屬性值,然後再將Spring控制的Employee類的對象employee注入屬性值。
<bean id = "car" class = "com_1.Car" p:name="寶馬" p:price="800000"></bean>
<bean id="employee" class="com_1.Employee" p:name="王五" p:car-ref="car"></bean>
重要注意:
若出現如下錯誤:Error creating bean with name ‘employee’ defined in class path resource…,這樣的錯誤,在進行屬性注入時,要考慮是不是構造方式和set方式進行注入的時候出現前後不匹配的情況,並且p名稱空間只能用於set方法方式的屬性注入。
7.Spring中SpEL屬性注入
格式:
value = “#{}”
這裏{}裏邊可以是數字、字符串(字符串需要加單引號,比如’hexufeng’)、引用類型對象、其他對象的屬性
測試代碼:
配置文件代碼:
<!-- spring的屬性注入的SpEL方法方式配置 -->
<bean id = "car" class = "com_1.Car">
<property name="name" value = "#{'桑塔拉'}"/>
<property name="price" value = "#{50000}"/>
</bean>
<bean id = "employee" class = "com_1.Employee">
<property name="name" value = "#{'張三'}"/>
<property name="car" value = "#{car}"/>
</bean>
其他對象的屬性值注入:
其他對象類:
public class spring_Inf {
public String getName() {
return "奔馳";
}
public double getprice() {
return 30000;
}
}
配置文件代碼:
<bean id = "car" class = "com_1.Car">
<property name="name" value = "#{springInf.getName()}"/>
<property name="price" value = "#{springInf.getprice()}"/>
</bean>
運行結果:
8.Spring中集合類型的屬性注入
對於類中數組的注入:
測試代碼:
類代碼:
public class Array {
public String arr[];
public void setArr(String[] arr) {
this.arr = arr;
}
@Override
public String toString() {
return "Array [arr=" + Arrays.toString(arr) + "]";
}
}
public class TestDemo {
@Test
public void demo6() {
//創建spring工廠
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring_first.xml");
Array arr1 = (Array) applicationContext.getBean("arr1");
System.out.print(arr1);
}
}
配置文件代碼:
<bean id = "arr1" class = "com_2.Array">
<property name="arr">
<list>
<value>張三丰</value>
<value>張翠山</value>
<value>張無忌</value>
</list>
</property>
</bean>
測試結果:
對於類中集合的注入:
包括:List、Set、Map
測試代碼:
類文件代碼:
public class Array {
public String arr[];
public List<String> list;
public Set<String> set;
public Map<String,String> map;
public void setArr(String[] arr) {
this.arr = arr;
}
public void setList(List<String> list) {
this.list = list;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
@Override
public String toString() {
return "Array [arr=" + Arrays.toString(arr) + ", list=" + list + ", set=" + set + ", map=" + map + "]";
}
}
public class TestDemo {
@Test
public void demo6() {
//創建spring工廠
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring_first.xml");
Array arr1 = (Array) applicationContext.getBean("arr1");
System.out.print(arr1);
}
}
配置文件代碼:注意List、Set、Map的配置文件中對屬性注入與數組的區別
<property name="list">
<list>
<value>令狐沖</value>
<value>任盈盈</value>
<value>東方不敗</value>
</list>
</property>
<property name="set">
<set>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</set>
</property>
<property name="map">
<map>
<entry key = "郭靖" value = "111"></entry>
<entry key = "黃蓉" value = "222"></entry>
<entry key = "楊過" value = "333"></entry>
</map>
</property>
</bean>
測試結果:
9.Spring中分模塊配置
分爲兩種方式:
1.在加載配置文件的時候加載多個,
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring_first.xml","spring_first1.xml");
Array arr1 = (Array) applicationContext.getBean("arr1");
2.在一個配置文件中可引入多個配置文件,
<import resource="spring_first1.xml"/>