Spring MVC 4 常用註解彙總
1. @Controller
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="org.springframework.samples.petclinic.web"/> <!-- ... --></beans>
2. @RequestMapping
@Controller @RequestMapping("/favsoft") public class AnnotationController { @RequestMapping(method=RequestMethod.GET) public String get(){ return ""; } @RequestMapping(value="/getName", method = RequestMethod.GET) public String getName(String userName) { return userName; } @RequestMapping(value="/{day}", method=RequestMethod.GET) public String getDay(Date day){ DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); return df.format(day); } @RequestMapping(value="/addUser", method=RequestMethod.GET) public String addFavUser(@Validated FavUser favUser,BindingResult result){ if(result.hasErrors()){ return "favUser"; } //favUserService.addFavUser(favUser); return "redirect:/favlist"; } @RequestMapping("/test") @ResponseBody public String test(){ return "aa"; } }
3. @PathVariable
String findOwner( String , Model model) {
FavUser favUser = favUserService.findFavUser();
model.addAttribute(
;
}
@RequestMapping(value="/owners/{ownerId}/pets/{petId}", method=RequestMethod.GET)public String findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
Owner owner = ownerService.findOwner(ownerId);
Pet pet = owner.getPet(petId);
model.addAttribute("pet", pet); return "displayPet";
}
@RequestMapping(value = "/something", method = RequestMethod.PUT)public void handle(@RequestBody String body, Writer writer) throws IOException { writer.write(body); }
@RequestMapping(value = "/something", method = RequestMethod.PUT)@ResponseBodypublic String helloWorld() { return "Hello World"; }
@RestController
public class FavRestfulController {
@RequestMapping(value="/getUserName",method=RequestMethod.POST)
public String getUserName(@RequestParam(value="name") String name){
return name;
}
}
8. HttpEntity
@RequestMapping("/something")public ResponseEntity<String> handle(HttpEntity<byte[]> requestEntity) throws UnsupportedEncodingException {
String requestHeader = requestEntity.getHeaders().getFirst("MyRequestHeader")); byte[] requestBody = requestEntity.getBody(); // do something with request header and body
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.set("MyResponseHeader", "MyValue"); return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
}
9. @ModelAttribute
@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 ...
}
@Cacheable 和@CacheFlush
• @Cacheable :宣告一個方法的返回值應該被快取。例如:@Cacheable(modelId = "testCaching")
• @CacheFlush :宣告一個方法是清空快取的觸發器。例如:@CacheFlush(modelId = "testCaching")
• 說明
spring3.0沒有對快取提供支援,不過3.1之後就有了,可以參考:Spring3.1 Cache註解
@Resource
• 例如
@Resource
private DataSource dataSource; // inject the bean named 'dataSource'
• 或者
@Resource(name="dataSource")
@Resource(type=DataSource.class)
• 說明
@Resource 預設按bean 的name 進行查詢,如果沒有找到會按type 進行查詢,
此時與@Autowired 類 似
在沒有為 @Resource 註解顯式指定 name 屬性的前提下,如果將其標註在 BeanFactory 型別、ApplicationContext 型別、ResourceLoader 型別、 ApplicationEventPublisher 型別、MessageSource 型別上,那麼 Spring 會自動注入這些實現類的例項,不需要額外的操作。此時 name 屬性不需要指定 ( 或者指定為""),否則注入失敗;
@PostConstruct 和@PreDestroy
• @PostConstruct
在方法上加上註解@PostConstruct ,這個方法就會在Bean 初始化之後被Spring 容器執 行
(注:Bean 初始化包括,例項化Bean ,並裝配Bean 的屬性(依賴注入))。
• @PreDestroy
在方法上加上註解@PreDestroy ,這個方法就會在Bean 被銷燬前被Spring 容器執行。
@Repository
• 與@Controller 、@Service 類似,都是向spring 上下文中註冊bean ,不在贅述。
@Component (不推薦使用)
• @Component
@Component 是所有受Spring 管理元件的通用形式,Spring 還提供了更加細化的註解形式: @Repository 、@Service、@Controller ,它們分別對應儲存層Bean ,業務層Bean ,和展示層Bean 。
目前版本(2.5 )中,這些註解與@Component 的語義是一樣的,完全通用, 在Spring 以後的版本中可能會給它們追加更多的語義。 所以,我們推薦使用@Repository 、@Service 、@Controller 來替代@Component 。
@Scope
• 例如
@Scope("session")
@Repository()
public class UserSessionBean implementsSerializable {}
• 說明
在使用XML 定義Bean 時,可以通過bean 的scope 屬性來定義一個Bean 的作用範圍,
同樣可以通過@Scope 註解來完成
@Scope中可以指定如下值:
singleton:定義bean的範圍為每個spring容器一個例項(預設值)
prototype:定義bean可以被多次例項化(使用一次就建立一次)
request:定義bean的範圍是http請求(springMVC中有效)
session:定義bean的範圍是http會話(springMVC中有效)
global-session:定義bean的範圍是全域性http會話(portlet中有效)
@SessionAttributes
• 說明
Spring 允許我們有選擇地指定 ModelMap 中的哪些屬性需要轉存到 session 中,
以便下一個請求屬對應的 ModelMap 的屬性列表中還能訪問到這些屬性。
這一功能是通過類定義處標註 @SessionAttributes 註解來實現的。
@SessionAttributes 只能宣告在類上,而不能宣告在方法上。
• 例如
@SessionAttributes("currUser") // 將ModelMap 中屬性名為currUser 的屬性
@SessionAttributes({"attr1","attr2"})
@SessionAttributes(types = User.class)
@SessionAttributes(types = {User.class,Dept.class})
@SessionAttributes(types = {User.class,Dept.class},value={"attr1","attr2"})
@InitBinder
• 說明
如果希望某個屬性編輯器僅作用於特定的 Controller ,
可以在 Controller 中定義一個標註 @InitBinder 註解的方法,
可以在該方法中向 Controller 了註冊若干個屬性編輯器
• 例如
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
@Required
• 例如
@required
public setName(String name){}
• 說明
@ required 負責檢查一個bean在初始化時其宣告的 set方法是否被執行, 當某個被標註了 @Required 的 Setter 方法沒有被呼叫,則 Spring 在解析的時候會丟擲異常,以提醒開發者對相應屬性進行設定。 @Required 註解只能標註在 Setter 方法之上。因為依賴注入的本質是檢查 Setter 方法是否被呼叫了,而不是真的去檢查屬性是否賦值了以及賦了什麼樣的值。如果將該註解標註在非 setXxxx() 型別的方法則被忽略。
@Qualifier
• 例如
@Autowired
@Qualifier("softService")
private ISoftPMService softPMService;
• 說明
使用@Autowired 時,如果找到多個同一型別的bean,則會拋異常,此時可以使用 @Qualifier("beanName"),明確指定bean的名稱進行注入,此時與 @Resource指定name屬性作用相同。
spring4中提供了大量的註解來支援零配置
@Configuration : 類似於spring配置檔案,負責註冊bean,對應的提供了@Bean註解。需要org.springframework.web.context.support.AnnotationConfigWebApplicationContext註冊到容器中。
@ComponentScan : 註解類查詢規則定義 <context:component-scan/>
@EnableAspectJAutoProxy : 啟用Aspect自動代理 <aop:aspectj-autoproxy/>
@Import @ImportResource: 關聯其它spring配置 <import resource="" />
@EnableCaching :啟用快取註解 <cache:annotation-driven/>
@EnableTransactionManagement : 啟用註解式事務管理 <tx:annotation-driven />
@EnableWebMvcSecurity : 啟用springSecurity安全驗證
最後放上網友整理的spring註解圖
2.1 spring-context模組的註解圖
2.2 spring-web註解
2.3 spring其它模組的註解
3