工作雜記(三)

幾個使用過註解標記:

1、@Qualifier:我們在 Spring 容器中配置了兩個類型爲 Office 類型的 Bean,當對 Boss 的 office 成員變量進行自動注入時,Spring 容器將無法確定到底要用哪一個 Bean,就會發生異常。Spring 允許我們通過 @Qualifier 註釋指定注入 Bean 的名稱,這樣歧義就消除了,可以通過下面的方法解決異常:

public class Boss {
	private Office office;
	@Autowired
	public void setOffice(@Qualifier("office")Office office) {
 	   this.office = office;
	}
}

@Qualifier("office") 中的 office 是 Bean 的名稱,所以 @Autowired 和 @Qualifier 結合使用時,自動注入的策略就從 byType 轉變成 byName 了。

@Autowired 可以對成員變量、方法以及構造函數進行註釋,而 @Qualifier 的標註對象是成員變量、方法入參、構造函數入參。正是由於註釋對象的不同,所以 Spring 不將 @Autowired 和 @Qualifier 統一成一個註釋類。

如:

public class Boss {
    @Autowired
    private Car car; 
    @Autowired
    @Qualifier("office")
    private Office office;
    …
}

2、@RunWith:使用RunWith註解改變JUnit的默認執行類,並實現自已的Listener在平時的單元測試,如果不使用RunWith註解,那麼JUnit將會採用默認的執行類Suite執行。如:

public class TestClass {
	@Test public void  t1(){}
}
JUnit允許用戶指定其它的單元測試執行類,只需要我們的測試執行類繼承類org.junit.runners.BlockJUnit4ClassRunner就可以了,Spring的執行類SpringJUnit4ClassRunner就是繼承了該類。我們平時用Spring也比較多,爲了能夠更加方便的引用配置文件,我們單元測試就使用了Spring實現的執行類。此時的單元測試執行類將會看起來是這樣:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:/spring1.xml", "classpath*:/spring2.xml" })
@TestExecutionListeners( { DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class })
@Transactional
public class TestClass {
	@Inject
	//這個類會在執行時被注入,這裏是按類型注入,如果想按名稱注入,需要加上@Named註解,如@Named("class1")
	//實現類可以加上@Named("class1")註解,也可以是配置在配置文件中的
	Class1 class1;
	
	@Test 
	public void  t1(){}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章