目錄
1 什么是spring框架
2 spring框架的特點
3 spring容器
3.1 什么是spring容器
3.2 spring容器創建對象的編程步驟
3.4 spring容器創建對象的方式
3.5 bean元素的幾個重要屬性
4 IOC
4.1 什么是IOC
4.2 什么事DI
4.3 DI的三種方式
1 什么是spring框架
是一個開源的用來簡化企業級應用開發的框架
?
2 spring框架的特點
2.1?簡化開發
spring對一些常見的api(比如jdbc)做了封裝,使用這些封裝之后的api,代碼會大大簡化。
比如,使用springjdbc來訪問數據庫,就不用考慮如何獲取連接,關閉連接等操作。
2.2 管理對象
spring可以幫我們管理對象之間的依賴關系,這樣一來, 軟件更容易維護。
2.3 集成其它框架
spring可以將一些框架集成進來,更方便使用這些框架。、
比如,可以利用spring集成mybatis(mybatis是一個用 來訪問數據庫的框架),這樣mybatis用起來更加簡單。?
?
3 spring容器
3.1 什么是spring容器
是spring框架當中的一個核心模塊,用來管理對象。
3.2怎么利用 spring容器 來創建對象
3.2.1 創建一個 maven項目
》記得讓maven項目中出現 web.xml 這個配置文件 -->> 還記得咋整嗎?
3.2.2 導包
spring-webmvc -->> 啟動 spring容器 時需要用到
junit -->> 進行單元測試時需要用到
3.2.3 啟動 spring容器
》添加一個 spring容器 配置文件
例:給Student類配置bean,只需在spring的配置文件中添加
<bean id="stu" class="test.Student"></bean>
id : 必須要保證唯一
class:就是需要配置bean的類名,但是必須在前面加上 包名.
》利用 ApplicationContext 的實現類 ClassPathXmlApplicationContext 去啟動容器
3.2.4 利用 getBean(String name, Class<T> requiredType) 來實例化對象
注意:spring容器會利用相關類的無參構造器去創建實例,所以相關類中必須要有無參構造器,否則會報錯:“找不到無參構造器”
3.3 注意
spring容器一旦啟動,就會在 堆 中將所有配置了 bean 的類創建好一個實例


1 package test; 2 3 import java.io.Serializable; 4 5 public class Student implements Serializable { 6 private Integer id; 7 private String name; 8 private String gender; 9 10 11 public Student() { 12 super(); 13 System.out.println("New Student()"); 14 } 15 public Integer getId() { 16 return id; 17 } 18 public void setId(Integer id) { 19 this.id = id; 20 } 21 public String getName() { 22 return name; 23 } 24 public void setName(String name) { 25 this.name = name; 26 } 27 public String getGender() { 28 return gender; 29 } 30 public void setGender(String gender) { 31 this.gender = gender; 32 } 33 34 public String toString() { 35 return "Student [id=" + id + ", name=" + name + ", gender=" + gender + "]"; 36 } 37 38 }


1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:jdbc="http://www.springframework.org/schema/jdbc" 6 xmlns:jee="http://www.springframework.org/schema/jee" 7 xmlns:tx="http://www.springframework.org/schema/tx" 8 xmlns:aop="http://www.springframework.org/schema/aop" 9 xmlns:mvc="http://www.springframework.org/schema/mvc" 10 xmlns:util="http://www.springframework.org/schema/util" 11 xmlns:jpa="http://www.springframework.org/schema/data/jpa" 12 xsi:schemaLocation=" 13 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 14 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd 15 http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd 16 http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd 17 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 18 http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd 19 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 20 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 21 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd"> 22 23 <bean id="stu" class="test.Student"></bean> 24 25 </beans>


1 package test; 2 3 import java.io.Serializable; 4 5 import org.springframework.context.ApplicationContext; 6 import org.springframework.context.support.ClassPathXmlApplicationContext; 7 8 public class Test implements Serializable { 9 public static void main(String[] args) { 10 ApplicationContext ac = new ClassPathXmlApplicationContext("test.xml"); 11 System.out.println(ac); 12 13 Student stu1 = ac.getBean("stu", Student.class); 14 System.out.println(stu1); 15 } 16 }
?
3.4spring容器 實例化對象的三種方法
3.4.1?利用無參構造器實現(很重要)?
必須有無參構造器,如果已經添加了有參構造器,那么默認的無參構造器就會被覆蓋;此時就需要手動添加一個無參構造器
3.4.2?利用靜態工廠方法實現(了解)
3.4.3?利用實例化工廠方法實現(了解)
? 3.5 bean元素的幾個重要屬性
3.5.1 作用域
scope 屬性 : 用來指定作用域
缺省值是 singleton(單例),如果值是prototype(原型),則可以創建多個對象,否則不可以
我們一般使用 單例模式 就可以啦(即:默認值)
3.5.2?生命周期
初始化
init-method屬性:指定初始化方法
銷毀
destroy-method屬性:指定銷毀方法
只有作用域為單例的 bean, 銷毀方法才有效
必須使用這個spring容器接口:AbstractApplicationContext
3.5.3 延遲加載
默認情況下當 spring容器 啟動之后,會將所有作用域為單例的 bean 都創建好
lazy-init屬性:指定是否延遲加載,值為 true 時延遲加載(一般不用延遲加載)
?
4 IOC(Inversion Of Controll 控制反轉)
4.1 什么事IOC
對象之間的依賴關系交給容器來管理。
4.2?什么是DI (Dependency Injection 依賴注入)
容器通過調用set方法或者構造器來建立對象之間的依賴關系
注:IOC是目標,而DI是手段
?
4.3DI 注入的兩種方式
4.3.1?利用 set 方法完成依賴注入(掌握)
注入類中必須有一個成員變量,該成員變量的類型必須是被依賴注入的類
注入類中必須實現需要注入的那個成員變量的 set 方法
set 方法進行依賴注入時,在配置文件中用到的是 property標簽;如果需要注入的類中有有參構造器,那么必須實現無參構造器,因為有參構造器會覆蓋無參構造器(注意:菜鳥一般吧無參構造器和有參構造器都實現)
注意:注入類中那個成員變量的類型 一般都設定為被注入類的一個接口,這樣有利于今后進行維護
利用 property標簽實現依賴注入
<property name="stu" ref="student01"></property>
name:需要依賴注入的成員變量
ref:需要依賴注入類的id屬性值
?
圖解:創建A的實例,而且B是注入到A中的;B類中必須實現無參構造器,A中必須添加一個類型為B的成員變量,而且還必須為該成員變量實現set方法,在spring配置文件中配置A和B的bean,而且在A的bean中還要利用property標簽來實現B的依賴注入
4.3.2?利用有參構造器完成依賴注入(掌握)
這里的構造器是有參構造器,但是它的參數這是你需要注入的參數名,不包含其他的
?
利用constructor-arg標簽實現依賴注入
<constructor-arg index="0" ref="b1"/>
index:有參構造器中參數的位置,從0開始
ref:依賴注入類的id屬性值
圖解:創建A的實例,而且B是注入到A中的;B類中必須實現無參構造器,A中必須添加一個類型為B的成員變量;為A添加一個有參構造器,而且該有參構造器的參數只是你要注入的那個成員變量,不包含其他的;而且該有參構造器任然會覆蓋無參構造器,所以如果想要使用無參構造器就必須先實現無參構造器;在spring的配置文件中配置A和B的bean,而且還需要用constructor-arg標簽實現B的依賴注入
?
4.3.3?自動裝配(一般不用)
注意:依賴注入一般都由注釋實現
?
源代碼鏈接:點擊前往