Spring基礎學習,附例子代碼講解

什麼是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.13.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中默認安裝,經過配置能夠快捷地生成對應的測試類。

第四部分參考博客:http://www.javashuo.com/article/p-veizxzzl-gx.html

相關文章
相關標籤/搜索