2.Spring的配置

一、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"/>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章