1. 程式人生 > 實用技巧 >【Spring】Spring環境搭建、依賴注入

【Spring】Spring環境搭建、依賴注入

Spring 框架

1).Spring簡介、Spring工廠

(1)Spring簡介
簡介: Spring是一個輕量級企業開發框架,核心: IOC程式設計,AOP程式設計。
IOC:[重要]   		I(Inverse)  O(Of)   C(Controll)			 控制反轉
概念: 將物件建立的權利,轉義到(Spring)工廠中。
目的: 將物件建立的耦合,解耦和。
(2)Spring工廠
Spring工廠:
BeanFactory(介面):
    ApplicationContext(介面): 
	ClassPathXmlApplicationContext(實現類);		----在本地環境下使用(主函式啟動)
    XmlWebApplication(實現類); 				----在web環境下使用。(從tomcat環境啟動)
Spring配置檔案: 執行時會將配置檔案中所有的bean載入建立賦值
	applicationContext.xml 或beans.xml

2).Spring環境搭建、Spring工廠以及控制物件的建立次數(單例的懶漢式)

(1)Spring環境搭建
① 匯入需要的jar
   匯入spring的jar
   匯入spring依賴的commons-loggin的jar
② 匯入配置檔案。
   匯入`aopplicationContext.xml`配置檔案,src的任意目錄下即可。
   匯入`log4j.properties`配置檔案,src的根目錄下。
(2)Spring工廠的使用步驟
工廠步驟
① 將類名資訊註冊在applicationContext.xml
    bean標籤的class:類名資訊
    bean標籤的id:對應的名字   getBean(name)
    <bean class="全類名"  id="獲得該物件使用name"  scope=”建立一個或多個”>
② 編碼:建立spring工廠
   ApplicationContext factory = new ClassPathXmlApplicationContext(配置檔案路徑);
③ 編碼:呼叫factory的getBean方法獲得物件。
   factory.getBean("bean標籤的id");
(3)控制物件建立的次數
① 預設spring工廠建立物件的次數  1個。(建立單個,單例項)
	應用: SqlSessionFactory  HttpServlet  DataSource(連線池)   XxxService
② bean標籤下的scope屬性
	scope="prototype" 	多個
	scope=”singleton”  	一個 (對單例有效的屬性lazy-init=”false/default”:延後建立)
   應用: Action控制器(Controller)    SqlSession   Connection 

3).Spring工廠屬性注入(屬性對應型別的注入方式)

(1)Spring工廠屬性注入(屬性賦值)
IOC思想:IOC Inverse Of Controll 反轉控制(控制反轉)。是將物件建立從當前程式碼轉移到spring工廠完成
DI:Dependency  Injection  依賴注入(依賴: 物件的屬性),也就是給物件的屬性賦值
總結[重點]:IOC/DI----反轉控制/依賴注入
① 將物件建立的權利轉移到spring工廠中。
② 將物件的屬性賦值的權利,轉移到了spring工廠中。
(2)依賴注入的編碼(屬性的型別)
① String+基本資料類+包裝型別:
   	屬性必須提供標準的get和set方法,配置檔案如下:
   	<bean id="" class="">
   		<property name="要賦值的屬性名" value="值"></property>
   	</bean>
	或者:
	<property name=””> <value>string或者int型別的值</value>	</property>
② List和陣列型別:
   <property name="list屬性名">
       <list>
           <value>值1</value>
           <value>值2</value>
       </list>
   </property>
③ Map型別:
   <property name="屬性名">
       <map>
           <entry key="key1" value="value1"></entry>
           <entry key="key2" value="value2"></entry>
       </map>
   </property>
④ Properties型別:
   <property name="屬性名">
   	   <props>
       	   <prop key="k1">值value1</prop>
           <prop key="k2">值value2</prop>
       </props>
   </property>
⑤ 使用者自定義型別
注入的屬性也是一個物件型別,先將屬性的物件型別註冊到bean下,再在property的ref屬性裡引入即可
 
(3)賦值原理
spring配置檔案屬性或者標籤的底層原理
① bean標籤 		class屬性(利用發射)
	<bean id="user" class="com.baizhi.demo2.User">
	底層:	String classstr = "com.baizhi.demo2.User";
			Class clazz = Class.forName(classstr);
			Object o = clazz.newInstance();
② property標籤  	name屬性和<prop>標籤的key和標籤體的值
	作用:給屬性賦值
	底層:呼叫的是property標籤的name屬性名對應的set方法【屬性名首字母大寫,前面新增set】
	總結:property標籤的賦值原理是set方法。

4).Spring工廠利用構造方法給屬性注入值、特殊物件建立(例如Connection)

(1)使用有參構造方法給屬性賦值(構造引數表)
<bean id="" class="">
	<constructor-arg index='引數序號,從0開始' value="101"></constructor-arg>
    <constructor-arg index='引數序號,從0開始' value="101"></constructor-arg>
</bean>
(2)特殊物件的建立: 如`Connection`  `SqlSession`   `DataSource`  `SqlSessionFactory`
例:建立connection
① 載入驅動:Class.forName("oracle.jdbc.OracleDriver");
② 獲得conn:Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","hr","hr");
核心編碼思路
思路:
① spring允許使用者自己通過編寫程式碼(實現FactoryBean介面),提供獲得物件的方式
② spring獲得物件,可以藉助於FactoryBean的getObjec方法獲得物件
編碼步驟
① 自定義類,告知spring如何獲得物件
   public class ConnectionFactory implements FactoryBean<Connection>{
       public Object getObject(){    //Spring呼叫getObject方法,間接獲得conn並管理在spring工廠中
           //獲得複雜物件的程式碼       }
       public boolean isSingleton(){	//該方法告知spring物件管理個數,true為一個,false為多個
           return false;       }
	   public Class<?> getObjectType() {return Connection.class}	//獲得返回物件的型別
   }
② 將FactoryBean介面的實現類交給spring工廠管理
   <bean id="connFactory" class="xxx.xxx.xxx.ConnectionFactory"></bean>
   補充:
   如果class對應的全類名實現FactoryBean介面
   ① bean標籤作用就自動呼叫該類的getObject方法,獲得物件,並將物件管理起來
   ② 該被管理起來的物件的id "connFactory"
③ 從spring工廠獲得該connection物件
   factory.getBean("connFactory");
   作用: 獲得 connFactory對應的bean標籤的class對應的類的getObject方法的返回值