什麼是Spring、IOC、AOP、DI?html
Spring是一個基於IOC和AOP的結構J2EE系統的框架。java
IOC(Inversion Of Control)控制反轉(Spring的基礎,創造對象由之前的程序員new構造方法來調用,變成交由Spring建立對象)程序員
AOP(Aspect Oriented Programming)面向切面編程 (在面向切面編程中,功能分爲核心業務功能(登錄、增刪改查)和周邊功能(即切面,例如性能統計、日誌、事務管理),二者能夠獨立開發,最後在經過配置文件進行交織在一塊兒)spring
DI(Dependency Injection)依賴注入(簡單來講就是拿到了對象的屬性,已經注入好相關值了,直接使用便可)編程
#第一部分:IOC、DI數組
一、首先建立一個pojo包,裏面有個Product.javaapp
pack com.test.pojo import ...... public class Product { private String name; public void setName(String name) { this.name=name; } public String getName() { return name; } }
二、在applicationContext.xml中配置Product的屬性框架
<?xml> <beans ......> <bean name="p" class="com.test.pojo.Product"> <property name="name" value="天地一號"> </bean> </beans>
三、測試類測試是否運行成功eclipse
package com.test.test; import com.test.pojo.Product; public class TestSpring{ ApplicationContext context = new ClassPathXmlApplicationContext(new String [] {"applicationContext.xml"}); Product p = (Product) context.getBean("p"); System.out.println(p.getName()); // 輸出: 天地一號 }
#第二部分:注入對象函數
一、在剛剛的基礎基礎之上,建立一個Category.java
pack com.test.pojo import ...... public class Category{ private String name; public void setName(String name) { this.name=name; } public String getName() { return name; } }
二、在applicationContext.xml中追加配置Category這個bean對象
<?xml> <beans ......> <bean name="p" class="com.test.pojo.Product"> <property name="name" value="天地一號" > <property name="category" ref="c"> <!--DI體現:注入Category這個bean對象--> </bean> <bean name="c" class="com.test.pojo.Category"> <property name="name" value="飲料類別"> </bean> </beans>
三、測試類測試是否運行成功
package com.test.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; // 注意,這裏雖然用到了Category這個對象,可是不用導入包,由於在xml配置文件裏面,早已經把Category注入到了Product這個bean對象當中!!! import com.how2java.pojo.Product; public class TestSpring { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" }); Product p = (Product) context.getBean("p"); System.out.println(p.getName()); // 輸出:天地一號 System.out.println(p.getCategory().getName()); // 輸出:飲料類別 } }
#第三部分:註解方式
爲何使用註解?
這是由於註解,可以減輕applicationContext.xml這個spring配置文件的代碼負擔,因此說,註解最大的好處是簡化了XML的配置。要否則你寫代碼的時候,這邊寫java還要切換到xml那邊再看類的配置是怎樣的,這樣開發效率過低了。
3.1 @Autowired的註解方式
一、首先,在xml文件中註釋掉以前注入到Product類的Category類,而後在前面添加一行如下代碼
<context:annotation-config/> // 表示告訴Spring要用註解的方式進行配置
applicationContext.xml文件修改具體以下:
<?xml> <beans....> <context:annotation-config/> // 加上這一行,表示告訴spring要用註解的方式進行配置 <bean name="c" class="com.test.pojo.Category"> <property name="name" value="category 1" /> </bean> <bean name="p" class="com.test.pojo.Product"> <property name="name" value="product1" /> <!-- <property name="category" ref="c" /> --> //註釋掉這一行 </bean> </beans>
二、直接在Product中,把Category放進去,加上get/set方法,而後@Autowired能夠放在兩處地方,具體以下修改Proudct類
package com.test.pojo; import org.springframework.beans.factory.annotation.Autowired; // 別忘了引入註解的包 public class Product { private int id; private String name; @Autowired // 註解位置一 很強的地方在於,不用import Category 這個類!!!! private Category category; public String getName() { return name; } public void setName(String name) { this.name = name; } public Category getCategory() { return category; } // @Autowired //註解位置2 public void setCategory(Category category) { this.category = category; } }
3.2 @Resource的註解方式
說明:@Resource是J2ee的規範,而@Autowired
@Resources是J2ee的規範,而@Autowired是Spring 的規範,經過註解的形式把本來寫在xml中的依賴替代,在xml中添加<context:annotation-config/>以通知Spring解析註解,簡化操做;註解本質是一種標記,只是告知做用
package com.test.pojo; import javax.annotation.Resource; // 別忘了引入註解的包 public class Product { private int id; private String name; @Resource(name="c") private Category category; .... .... }
3.3 對bean的註解 @Component
3.1和3.2的註解方式是對注入對象行爲的註解,那麼其實還有一種註解,能夠直接對bean進行註解,意思是把Product、Category這些bean直接移出applicationContext.xml配置文件。
一、修改以前的applicationContext.xml,把以前寫的東西所有刪除掉,只須要新增下面這句:
<?xml> <beans ...> <context:component-scan base-package="com.test.pojo"/> // 告訴Spring,bean都放在com.test.pojo這個包下面了
二、由於applicationContext中已經沒有配置bean的屬性了,因此在Product、Category類中,須要本身自定義私有屬性,而且在類的頭部添加註解 @Component,代表此類是bean以下:
Product.java
package com.test.pojo; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component("p") // 對bean的註解,表面此類是bean public class Product { private String name="天地一號"; @Autowired // 注意注入仍是少不了的!! private Category category; public String getName() { return name; } public void setName(String name) { this.name = name; } public Category getCategory() { return category; } public void setCategory(Category category) { this.category = category; } }
Category.java
package com.test.pojo; import org.springframework.stereotype.Component; @Component("c") // 對bean的註解,表面此類是bean public class Category { private String name="飲料類別"; public String getName() { return name; } public void setName(String name) { this.name = name; } }
3.4 對上面註解進行測試(同一個main函數,會發現運行結果是同樣的)
package com.test.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.how2java.pojo.Product; public class TestSpring { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" }); Product p = (Product) context.getBean("p"); System.out.println(p.getName()); // 輸出: 天地一號 System.out.println(p.getCategory().getName()); // 輸入:飲料分類 } }
#第四部分:註解方式寫Java單元測試(可忽略,有空能夠了解)
爲何要用到測試類?爲何要單元測試?
單元測試是編寫測試代碼,應該準確、快速保證程序基本模塊的正確性
簡單來講,就是類裏面的方法就是一個單元,看看每個方法是否正確,這個正確性的標準很廣,它分不少方面,例如一個兩數相加的方法add,給他一個用例,add(1,1),而後給它一個正確的答案2,看看計算出來的結果是否等於預期結果2。
這是一方面,另外一方面,例如
限時測試
有時候,一些方法裏面的邏輯很是複雜,循環嵌套比較深,極可能出現死循環,那你要怎麼預防呢?限時測試能夠幫到你。咱們給測試函數設定一個執行時間,超過這個時間,就會被系統強行終止,而後系統會告訴你終止的緣由是由於超時,這樣就可發現這些Bug了。並且用JUnit很好實現,只須要給@Test添加一個timeout參數就行。
@Test(timeout = 1000)
異常測試
java由拋出異常機制。若是有一個函數須要拋出自定的異常,可是它沒拋出來,這就是一個BUG了。例如10除以0,理應拋出ArithmeticException.class異常,因此咱們須要設置一個測試類來測試它到底有沒有拋出異常,而且是否是咱們想要的異常,JUnit也幫咱們實現了,
@Test(expected = ArithmeticException.class)
參數化測試
這個對測試人員很是有用,例如一個函數,它的參數有許多的特殊值,即有不少區域,例如「計算一個平方」這個函數,暫且分爲三個區域:正數、0、負數,因此寫測試的時候,須要在測試類裏面至少寫三個測試方法,可是JUnit的參數化測試,就簡化了,只須要寫一個方法就OK,原理是把參數數組塞進同一個方法體,讓它自動執行就行。
@Parameters public static Collection data() { return Arrays.asList(new Object[][]{ {2, 4}, {0, 0}, {-3, 9}, }); }
測試類註解簡單例子
package com.test.test; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.test.pojo.Category; @RunWith(SpringJUnit4ClassRunner.class) // 表示這是一個Spring的測試類 @ContextConfiguration("classpath:applicationContext.xml") // 定位Spring的配置文件 public class AnnotationTest { @Autowired // 給測試類裝配Category對象 Category c; @Test // 測試邏輯,打印c對象的名稱 public void test() { System.out.println(c.getName()); } }
注:JUnit4是Java單元測試框架,已經在eclipse中默認安裝,經過配置能夠快捷地生成對應的測試類。