Spring框架學習(一)
Spring框架的兩個核心分別是 IOC(Inversion of Control)控制反轉 和 AOP(Asepect-Oriented Programming)面向切面程式設計。
此外,有的書本上將寫的是DI(Dependency Injection)依賴注入和AOP。實際上,DI和IOC的目標和方式非常類似,本質上都是將原來需要通過new例項化的物件轉交給Spring負責。
一。IOC實現
1.首先需要匯入jar包,至少4個核心元件和1個日誌包commos.log.jar
2.新建applicationContext.xml檔案(一般在src下建立,這樣更方便)。applicationContext.xml的配置資訊最終都會儲存到Spring的ApplicationContext容器中
3.對applicationContext.xml檔案進行配置。首先需要配置schema(一種類似DTD的xml語法檢查器),可以通過如下方式獲得
ctrl+F搜尋xmlns即可得到需要的基本schema,然後將其複製到applicationContext.xml檔案中
4.編寫測試方法獲得bean物件。需要載入applicationContext.xml檔案
1 package com.xl.test; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 public class Test { 7public static void main(String[] args) { 8//獲得ApplicationContext容器 9ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); 10//根據bean中的id值獲得裝配的物件,第二個引數通過反射來指定返回的型別,若不指定則返回的是Object型別的物件 11Demo demo = ac.getBean("demo", Demo.class); 12//ac.getBeanDefinitionNames()返回String[] 代表ApplicationContext中裝配的所有物件的名稱; 13demo.demo1(); 14} 15 }
二。建立物件的方式
上述一種使用的是通過無參構造方法建立物件(預設),此外還可以通過有參建構函式建立、通過例項工廠建立、通過靜態工廠建立
1.有參建構函式建立:(1)需要在類中提供有參構造方法 (2)需要在applicationContext.xml中設定呼叫的哪個構造方法,並通過指定標籤傳入引數
1 package com.xl.test; 2 3 public class Demo2 { 4private String name; 5private Demo demo; 6 7public Demo2(String name) { 8this.name = name; 9} 10 11public void test() { 12System.out.println("這是我的名字"+name+"和小弟"+demo.test()); 13} 14 15public Demo2(String name, Demo demo) { 16this.name = name; 17this.demo = demo; 18} 19 }
2.例項工廠建立物件
首先需要編寫一個工廠類, 然後建立一個工廠bean
<!-- 通過例項工廠建立物件 --> <!-- 先配置工廠物件 --> <bean id="demoFactory" class="com.xl.test.DemoFactory"></bean> <!-- 配置需要建立的物件 id為返回的物件名,factory-bean關聯工廠物件的id,factory-method中寫入工廠中建立相應物件的方法 --> <bean id="mydemo" factory-bean="demoFactory" factory-method="newInstance"></bean>
3.靜態工廠建立物件
這種方法不需要事先建立工廠bean,其他的只需要寫一個靜態工廠即可(在方法中新增static修飾符)
三。DI依賴注入
當一個類A中需要依賴另一個類B物件時,把B賦值給A的過程就叫做依賴注入
1 2<!-- 依賴注入 --> 3<bean id="demo" class="com.xl.test.Demo"></bean> 4<!-- 無參建構函式建立Demo3物件 --> 5<bean id="demo3" class="com.xl.test.Demo3"> 6<!-- 通過DI往demo3中注入物件demo --> 7<property name="mydemo" ref="demo"></property> 8<!-- 下面為給Bean的屬性注入,通過set方法,即需要在類中提供set方法 --> 9<!-- 屬性是陣列 --> 10<property name="myarr" > 11<!-- value-type指定出入值的型別 --> 12<array value-type="java.lang.Integer"> 13<value>1</value> 14<value>2</value> 15<value>3</value> 16</array> 17</property> 18 19<!-- 屬性是map --> 20<property name="mymap"> 21<!-- 需要指定map的鍵值對資料型別 --> 22<map key-type="java.lang.String" value-type="java.lang.String"> 23<!-- 通過entry標籤的key和value給map賦值 --> 24<entry key="a" value="你好"></entry> 25<entry key="b" value="再見"></entry> 26</map> 27</property> 28 29<!-- 屬性是Set --> 30<property name="myset"> 31<set value-type="java.lang.String"> 32<value>"你好"</value> 33<value>"我也好"</value> 34</set> 35</property> 36 37<!-- 屬性是List --> 38<property name="mylist"> 39<list value-type="java.lang.String"> 40<value>"wawawa"</value> 41<value>"hahahah"</value> 42</list> 43</property> 44 45<!-- 普通屬性 --> 46<property name="name" value="我是demo3的name"></property> 47</bean>
值得注意的是,我這裡屬性注入使用的是Set注入方式,即需要在類中提供相應屬性的Set方法