Spring註解使用
@Component,該註解使用到某個類時,表明該類會作爲組件類,告知Spring爲這個類創建一個bean。@Name註解可以作爲它的替代方案。
@ComponentScan告訴Spring 某個packag下用註解標識的類,需要被spring自動掃描並且裝入bean容器。不配置base package的情況下,以配置類所在的包作爲基礎包進行掃描組件。當然也可以配置base package,並且是多個package。
@Autowired註解由Spring提供,默認按類型裝配,默認情況下要求依賴對象必須存在,如果要允許爲null,則需要設置required屬性爲false。
如果我們想使用名稱裝配可以結合@Qualifier註解進行使用。可以使用Java提供的@Inject來替代。
@Bean,能夠使用@Scope註解來指定該bean的範圍。
用例
@Bean
@Scope("prototype")
public TransferService transferService() {
return new TransferServiceImpl();
}
@Configuration用於定義配置類,標註在某個類上,相當於把該類作爲spring的xml配置文件中的<beans>,其作用是配置Spring容器(應用上下)。
當然還有AOP的一系列的註解,不在此一一述說。
SpringMVC的常用註解
@PathVariable
URI模板 “favusers/{favUserId}"指定變量的名字 favUserId ,當控制器處理這個請求的時候, favUserId的值會被設定到URI中。比如,當有一個像“favusers/favccxx”這樣的請求時,favUserId的值就是 favccxx。
@PathVariable 可以有多個註解,像下面這樣:
@RequestMapping(value="/owners/{ownerId}/pets/{petId}", method=RequestMethod.GET)
public String findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
//ownerId和petId被自動賦值
}
@RequestParam
該註解將請求的參數綁定到方法中的參數上。如果想自定義指定參數的話,如果將@RequestParam的 required 屬性設置爲false
(如@RequestParam(value="id",required=false))。
@ModelAttribute
該註解可以作用在方法或方法參數上,該註解支持一個屬性value,類型爲String,表示綁定的屬性名稱。
當它作用在方法上時,標明該方法的目的是添加一個或多個模型屬性(model attributes)。該方法支持與@RequestMapping一樣的參數類型,但並不能直接映射成請求。控制器中的@ModelAttribute方法會在@RequestMapping方法調用之前而調用。
@ModelAttribute
public Account addAccount(@RequestParam String number) {
return accountManager.findAccount(number);
}
@ModelAttribute
public void populateModel(@RequestParam String number, Model model) {
model.addAttribute(accountManager.findAccount(number));
// add more ...
}
@ModelAttribute方法有兩種風格:一種是添加隱形屬性並返回它。另一種是該方法接受一個模型並添加任意數量的模型屬性。用戶可以根據自己的需要選擇對應的風格。
請舉例說明@Qualifier註解?
@Qualifier註解意味着可以在被標註bean的字段上可以自動裝配。
下面的示例將會在Customer的person屬性中自動裝配person的值。
public class Customer
{
@Autowired
private Person person;
}
在配置文件中配置Person類。
<bean id="customer" class="com.howtodoinjava.common.Customer" />
<bean id="personA" class="com.howtodoinjava.common.Person" >
<property name="name" value="lokesh" />
</bean>
<bean id="personB" class="com.howtodoinjava.common.Person" >
<property name="name" value="alex" />
</bean>
但是這樣子Spring不知道要給Customer裝配那個bean。所以我們需要用到@Qualifier
public class Customer
{
@Autowired
@Qualifier("personA")
private Person person;
}
@Autowired和@Resource的區別是什麼?
相同點:@Autowired與@Resource都可以用來裝配bean. 都可以寫在字段上,或寫在setter方法上。
不同點:
@Autowired註解由Spring提供,默認按類型裝配,默認情況下要求依賴對象必須存在,如果要允許爲null,則需要設置required屬性爲false。
如果我們想使用名稱裝配可以結合@Qualifier註解進行使用,如下:
@Autowired()
@Qualifier("baseDao")
private BaseDao baseDao;
@Resource 是JDK1.6支持的註解,默認按照名稱進行裝配,名稱可以通過name屬性進行指定。Resource有兩個重要的屬性:name和type,而Spring將@Resource註解的name屬性解析爲bean的名字,而type屬性則解析爲bean的類型。
@Resource裝配順序:
①如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常。
②如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常。
③如果指定了type,則從上下文中找到類似匹配的唯一bean進行裝配,找不到或是找到多個,都會拋出異常。
④如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配
示例代碼
@Resource(name="baseDao")
private BaseDao baseDao;