Spring(環境搭建&配置詳解)

JasonTam發表於2018-08-16

1. 匯入Jar包

image

3.0.2是spring與市面上其他工具類的整合.

根據所需要實現的功能,匯入相對應的Jar包.基礎功能就匯入beans,core,context,expression.

除此之外還需要匯入日誌包,否則執行會報錯

image

2. 匯入約束,書寫配置檔案.(Spring的配置檔案的約束檔案是Schema)

  • 檔案的位置:建議放到src下,配置檔案的名字建議applicationContext.xml
  • 匯入約束:
  1. 選擇約束檔案的路徑

image

  1. 在建立了xml檔案的情況下,新增約束.

開啟檢視

image

  1. 引入約束

image

image

  • 書寫配置檔案,將物件註冊到配置檔案中
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
  <bean name="User" class="com.itheima.pojo.User"></bean>
</beans>
複製程式碼
  • 測試配置成功案例
public class Demo {
	@Test
	public void fun (){
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		User u = (User) ac.getBean("User");
		System.out.println(u);
	}
}
複製程式碼

配置詳解

  1. Bean 元素:使用該元素描述需要被spring管理的物件
屬性 詳解
class 被管理物件的完整類名
name 給被管理的物件起一個名字.獲取物件的時候根據這個名稱獲取物件.(==可以重複,可以使用特殊字元,但不推薦==)
id 與name屬性的作用一樣.(==不能重複,不能使用特殊字元==)

==結論:儘量使用name 屬性==

  1. scope 屬性:
詳解
singleton 表示該物件為單例物件,在spring容器中只會存在一個例項
prototype 表示該物件為多例物件.每次在spring容器中獲取該物件時都會建立一個新的物件.
request 表示該物件的生命週期與request一樣,一次請求結束後就會從spring容器中移除
session 表示該物件的生命週期與session一樣,會話結束後就會從spring容器中移除

注意:scope的預設值為singleton,在整合struts2時,action物件的scope的值就需要設定為prototype.因為action物件必須是多例的

  1. init&destory(初始化與銷燬)

在容器啟動的時候會執行物件的初始化方法,因為容器啟動的時候會建立配置檔案中的所有物件.當容器關閉的時候,會執行物件的銷燬方法.

注意:ApplicationContext介面是沒有關閉方法的.子介面ClassPathApplicationContext才有.

//實體類
public void init (){
		System.out.println("user物件被初始化了");
	}
	
	public void destory (){
		System.out.println("user物件被銷燬了");
	}
	
//配置檔案中	
<bean name="user" class="com.demo.pojo.User" init-method="init" destroy-method="destory"></bean>

//執行
@Test
	public void fun2() {
		// 建立容器物件
		ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		// 從容器中獲取User物件
		User u = (User) ac.getBean("user");
		System.out.println(u);
		ac.close();
	}
複製程式碼
  1. 模組化

隨著專案物件會越來越多,因此配置需要分模組,一個配置檔案中可以引入其他配置檔案

<import resource=""/>
複製程式碼

Spring(建立物件的三種方式)

1. 空參構造方式

因為我們使用的介面是applicationContext,因此配置檔案中的物件會在容器啟動的時候全部建立.

@Test
	public void fun1 (){
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
	}
	
	<bean name="user" class="com.itheima.pojo.User"></bean>
複製程式碼

2. 靜態工廠

我們希望由我們開發人員自己來建立物件,然後把物件交給spring容器來管理.當我們需要使用的時候也是從容器中獲取

public static User createUser (){
		
		System.out.println("User物件被建立了");
		
		return new User ();
	}


<bean name="user2" 
	class="com.itheima.test.UserFactory" 
	factory-method="createUser"></bean>
複製程式碼

3. 例項工廠

由於方法不是靜態,不能通過類名進行呼叫,因為我們必須建立物件才能進行呼叫方法,把所需要的物件建立出來.

@Test
public void fun1 (){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
User u = (User) ac.getBean("user3");

}


public User createUser2 (){

System.out.println("User物件被動態建立了");

return  new User ();
}

//配置檔案
<bean name="userFactory" class="com.demo.test.UserFactory"></bean>
	<bean name="user3" 
	factory-method="createUser2"
	factory-bean="userFactory">
	</bean>
複製程式碼

Spring屬性注入

  1. set方式注入
  • 屬性注入
<bean name="user" class="com.demo.pojo.User">
     <property name="name" value="tom"></property>
     <property name="age" value="18"></property>
     </bean>
複製程式碼
  • 物件注入
<bean name="user" class="com.demo.pojo.User">
     <property name="name" value="tom"></property>
     <property name="age" value="18"></property>
     <property name="Car" ref="car"></property>
 </bean>
     
     <bean name="car" class="com.demo.pojo.Car">
      <property name="name" value="AE86"></property>
      <property name="color" value="白色"></property>
     </bean>

複製程式碼

注意:值型別使用value屬性,引用型別使用ref屬性.

  1. 建構函式注入

constructor-arg元素

屬性 詳解
name 物件的屬性名
value
ref 引用什麼物件
index 建構函式的引數列表的順序
type 建構函式的引數型別.
<bean name="user" class="com.demo.pojo.User">
        <constructor-arg name="name" value="666" index="1" type="java.lang.Integer"></constructor-arg>
        <constructor-arg name="car" ref="car" index="0"></constructor-arg>
     </bean>
     
     //構造方法
     public User(String name, Car car) {
		this.name = name;
		this.car = car;
	}

	public User(Car car, Integer name) {
		this.name = name+"";
		this.car = car;
	}
複製程式碼
  1. p名稱空間注入

前置工作:需要匯入p名稱空間

在根元素中新增以下的這段程式碼

 xmlns:p="http://www.springframework.org/schema/p"  
複製程式碼

其實就是set注入方法

<bean name="user2" class="com.demo.pojo.User" p:name="tom"
		p:age="18" p:car-ref="car"></bean>
複製程式碼
  1. spel 注入
<!-- spring expression language -->
	<bean name="user3" class="com.demo.pojo.User">
		<property name="name" value="#{user.name}"></property>
		<property name="age" value="#{user1.age}"></property>
		<property name="car" ref="car"></property>
	</bean>
複製程式碼

注意:引用型別不能使用spel,跟之前的引用型別用法一樣

  1. 複雜型別注入

陣列,集合,Map集合,Properties

注意:資料與集合當值只有一個的時候,值可以寫在property元素中的value屬性中

 <property name="arr" value="tom"></property>
 <property name="list" value="jerry"></property>
複製程式碼
<bean name="cb" class="com.demo.pojo.CollectionBean">
	    <property name="arr">
	       <array>
	           <value>tom</value>
	           <value>jerry</value>
	           <ref bean="car"/>
	       </array>
	    </property>
	    
	    <property name="list">
	       <list>
	         <value>#{user.name}</value>
	         <value>#{user.age}</value>
	         <ref bean="car"/>
	       </list>
	    </property>
	    
	    <property name="map">
	      <map>
	         <entry key="name" value="mama"></entry>
	         <entry key="uu" value-ref="user2"></entry>
	         <entry key-ref="user2" value-ref="user3"></entry>
	      </map>
	    </property>
	    
	    <property name="prop">
	       <props>
	           <prop key="name">tom</prop>
	           <prop key="age">18</prop>
	       </props>
	    </property>
	</bean>
複製程式碼

相關文章