【Spring】Spring環境搭建、依賴注入
阿新 • • 發佈:2020-09-08
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方法的返回值