1. 匯入Jar包
3.0.2是spring與市面上其他工具類的整合.
根據所需要實現的功能,匯入相對應的Jar包.基礎功能就匯入beans,core,context,expression.
除此之外還需要匯入日誌包,否則執行會報錯
2. 匯入約束,書寫配置檔案.(Spring的配置檔案的約束檔案是Schema)
- 檔案的位置:建議放到src下,配置檔案的名字建議applicationContext.xml
- 匯入約束:
- 選擇約束檔案的路徑
- 在建立了xml檔案的情況下,新增約束.
開啟檢視
- 引入約束
- 書寫配置檔案,將物件註冊到配置檔案中
<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);
}
}
複製程式碼
配置詳解
- Bean 元素:使用該元素描述需要被spring管理的物件
屬性 | 詳解 |
---|---|
class | 被管理物件的完整類名 |
name | 給被管理的物件起一個名字.獲取物件的時候根據這個名稱獲取物件.(==可以重複,可以使用特殊字元,但不推薦==) |
id | 與name屬性的作用一樣.(==不能重複,不能使用特殊字元==) |
==結論:儘量使用name 屬性==
- scope 屬性:
值 | 詳解 |
---|---|
singleton | 表示該物件為單例物件,在spring容器中只會存在一個例項 |
prototype | 表示該物件為多例物件.每次在spring容器中獲取該物件時都會建立一個新的物件. |
request | 表示該物件的生命週期與request一樣,一次請求結束後就會從spring容器中移除 |
session | 表示該物件的生命週期與session一樣,會話結束後就會從spring容器中移除 |
注意:scope的預設值為singleton,在整合struts2時,action物件的scope的值就需要設定為prototype.因為action物件必須是多例的
- 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();
}
複製程式碼
- 模組化
隨著專案物件會越來越多,因此配置需要分模組,一個配置檔案中可以引入其他配置檔案
<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屬性注入
- 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屬性.
- 建構函式注入
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;
}
複製程式碼
- 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>
複製程式碼
- 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,跟之前的引用型別用法一樣
- 複雜型別注入
陣列,集合,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>
複製程式碼