幾個使用過註解標記:
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(){}
}