@Controller @Service @Controller和 @Component
註冊一個action 到spring 上下文中,bean 的ID 默認爲類名稱開頭字母小寫。
@Repository、@Service 和@Controller。這 3 個註解和 @Component 是等效的,可是從註解類的命名上,很容易看出這 3 個註解分別和持久層、業務層和控制層(Web 層)相對應。雖然目前這 3 個註解和 @Component 相比沒有什麼新意,但 Spring 將在之後的版本中爲它們添加特殊的功能。因此,若是 Web 應用程序採用了經典的三層分層結構的話,最好在持久層、業務層和控制層分別採用@Repository、@Service 和 @Controller 對分層中的類進行註解,而用 @Component 對那些比較中立的類進行註解。前端
例:java
@Controller public class Apple extends Friut {}
@Autowired
以byType的方式對類成員變量、方法及構造函數進行標註,完成自動裝配的工做。Spring 將直接採用 Java 反射機制對 類 中的 私有成員變量進行自動注入。因此對成員變量使用 @Autowired 後,可將它們的getter和setter 方法刪除。
例:git
public class Boss { @Autowired private Car car; @Autowired private Office office; }
也能夠對set方法和構造函數使用@ Autowired註解 ,等同於上文正則表達式
public class Boss { private Car car; private Office office; @Autowired public void setCar(Car car) { this.car = car; } @Autowired public void setOffice(Office office) { this.office = office; } } public class Boss { private Car car; private Office office; @Autowired public Boss(Car car ,Office office){ this.car = car; this.office = office ; } }
如何使用Autowired 的required參數 spring
@Autowired(required = false) public void setOffice(Office office) { this.office = office; }
通常狀況下,使用 @Autowired 的地方都是須要注入 Bean 的,使用了自動注入而又容許不注入的狀況通常僅會在開發期或測試期碰到(如爲了快速啓動 Spring 容器,僅引入一些模塊的 Spring 配置文件),因此 @Autowired(required = false) 會不多用到。數組
@Resource
@Resource 的做用至關於 @Autowired,只不過 @Autowired 按 byType 自動注入,而 @Resource 默認按 byName 自動注入。@Resource 有兩個屬性是比較重要的,分別是 name 和 type,Spring 將 @Resource 註解的 name 屬性解析爲 Bean 的名字,而 type 屬性則解析爲 Bean 的類型。因此若是使用 name 屬性,則使用 byName 的自動注入策略,而使用 type 屬性時則使用 byType 自動注入策略。若是既不指定 name 也不指定 type 屬性,這時將經過反射機制使用 byName 自動注入策略。
例:app
public class Boss { // 自動注入類型爲 Car 的 Bean @Resource private Car car; // 自動注入 bean 名稱爲 office 的 Bean @Resource(name = "office") private Office office; }
@PostConstruct 和 @PreDestroy
只須要在方法前標註 @PostConstruct 或 @PreDestroy,這些方法就會在 Bean 初始化後或銷燬以前被 Spring 容器執行, 經常使用於對靜態變量的處理。dom
public class Boss { private static Car car = initCar(); @Resource(name = "office") private Office office; @PostConstruct public void initCar(){ System.out.println("postConstruct1"); } @PreDestroy public void preDestroy1(){ System.out.println("preDestroy1"); } }
@RequestMapping
將URL映射到類或方法上。jsp
@RequestMapping(value="/car") public class Car { @RequestMapping(value="/getName") public String myCarName(){ return 「audi」; } }
經過http://{ ip:port/上下文}/car/getName 來請求該方法函數
當它定義在類級別時,標明該控制器處理全部的請求都被映射到 /car路徑下。@RequestMapping中可使用 method 屬性標記其所接受的方法類型,若是不指定方法類型的話,可使用 HTTP GET/POST 方法請求數據,可是一旦指定方法類型,就只能使用該類型獲取數據。支持方法共有四種:GET, POST, PUT, DELETE
@RequestMapping(value="/getName", method = RequestMethod.GET) public String getName(String userName) { return userName; }
綁定 @RequestMapping參數
使用 @PathVariable 註解方法參數並將其綁定到URI模板變量的值上
@RequestMapping(value="/departments/{departmentId}/employees/{employeeId}") public String findEmployee( @PathVariable String departmentId, @PathVariable String employeeId){ System.out.println("Find employee with ID: " + employeeId + " from department: " + departmentId); return "someResult"; }
支持正則表達式
@RequestMapping(value="/{textualPart:[a-z-]+}.{numericPart:[\\d]+}") public String regularExpression( @PathVariable String textualPart, @PathVariable String numericPart){ System.out.println("Textual part: " + textualPart + ", numeric part: " + numericPart); return "someResult"; }
@RequestParam
能夠把請求參數傳遞給請求方法
例: http://{ ip:port/上下文}/car/getName?ownerId=5
@RequestMapping(value="/car") public class Car {
@RequestMapping(value="/getName") public String myCarName(@RequestParam("ownerId") int ownerId){ return 「audi」; } }
@ModelAttribute
@ModelAttribute有三種用法:
一、註解方法
當它做用在方法上時,標明該方法的目的是添加一個或多個模型屬性(model attributes)。該方法支持與@RequestMapping同樣的參數類型,但並不能直接映射成請求。controller中的@ModelAttribute方法會在全部@RequestMapping方法調用以前而調用,所以要當心使用。
利用這個特徵進行權限驗證, index方法執行以前會先執行preRun方法
@Controller @RequestMapping(value="/test") public class PassportController { @ModelAttribute public void preRun() { if(user != 「admin」){ throw Exception(「沒有權限」); } } @RequestMapping(method=RequestMethod.GET) public String index() { return "login/index"; } }
二、註解方法中的入參
用於將多個請求參數綁定到一個命令對象,將這個對象添加到request做用域,從而簡化綁定流程,並且自動暴露爲模型數據用於jsp展現時使用
@RequestMapping(value="test") public String test(@ModelAttribute("user") UserModel user){ User.setName(「aaa」); }
此時能夠在視圖頁面使用${user.name}來獲取綁定的命令對象的屬性
三、註解方法的返回值,效果同上,將返回值添加到request做用域,jsp頁面中能夠經過${user.name}的方式直接調用,@ModelAttribute 註解的返回值會覆蓋@RequestMapping 註解方法中的@ModelAttribute 註解的同名命令對象。
public @ModelAttribute("user2") UserModel test3(@ModelAttribute("user2") UserModel user)
@RequestBody
讀取Request請求的body部分數據,使用系統默認配置的HttpMessageConverter進行解析,而後把相應的數據綁定到要返回的對象上 ,再把HttpMessageConverter返回的對象數據綁定到 controller中方法的參數上。
@ResponseBody
將Controller的方法返回的對象,經過適當的HttpMessageConverter轉換爲指定格式後,寫入到Response對象的body數據區。
@ExceptionHandler和@ControllerAdvice
@ExceptionHandler 註解到方法上,出現異常時會執行該方法。 @ControllerAdvice 使一個Contoller成爲全局的異常處理類,類中用@ExceptionHandler方法註解的方法能夠處理全部Controller發生的異常。
@RestController (spring 3.1 以上)
使一個類以Rest風格返回請求數據, 它與@Controller的差異在於使用@Controller標註的類別最後會回傳一個String,而後透過viewResolver組裝出完整的view page路徑後將這個view呈如今前端頁面中。而使用 @RestController標註表示此類別最後會回傳一個POJO對象而非一個頁面,所以也不須要透過viewResolver來幫忙組裝回傳值。
經過jackson套件,能夠將RestController回傳的domain對象以JSON或XML格式的方式返回前端。
@RestController public class HelloWorldRestController { @RequestMapping("/hello/{player}") public Message message(@PathVariable String player) { Message msg = new Message(player, "Hello, " + player); return msg; } }
VO字段驗證
@AssertFalse
驗證的數據類型 :Boolean,boolean
說明 :驗證註解的元素值是false
@AssertTrue
驗證的數據類型 :Boolean,boolean
說明 :驗證註解的元素值是true
@NotNull
驗證的數據類型 :任意類型
說明 :驗證註解的元素值不是null
@Null
驗證的數據類型 :任意類型
說明 :驗證註解的元素值是null
@Min(value=值)
驗證的數據類型 :BigDecimal,BigInteger, byte,short, int, long,等任何Number或CharSequence(存儲的是數字)子類型
說明 :驗證註解的元素值大於等於@Min指定的value值
@Max(value=值)
驗證的數據類型 :和@Min要求同樣
說明 :驗證註解的元素值小於等於@Max指定的value值
@DecimalMin(value=值)
驗證的數據類型 :和@Min要求同樣
說明 :驗證註解的元素值大於等於@ DecimalMin指定的value值
@DecimalMax(value=值)
驗證的數據類型 :和@Min要求同樣
說明 :驗證註解的元素值小於等於@ DecimalMax指定的value值
@Digits(integer=整數位數, fraction=小數位數)
驗證的數據類型 :和@Min要求同樣
說明 :驗證註解的元素值的整數位數和小數位數上限
@Size(min=下限, max=上限)
驗證的數據類型 :字符串、Collection、Map、數組等
說明 :驗證註解的元素值的在min和max(包含)指定區間以內,如字符長度、集合大小
@Past
驗證的數據類型 :java.util.Date,java.util.Calendar,Joda Time類庫的日期類型
說明 :驗證註解的元素值(日期類型)比當前時間早
@Future
驗證的數據類型 :與@Past要求同樣
說明 :驗證註解的元素值(日期類型)比當前時間晚
@NotBlank
驗證的數據類型 :CharSequence子類型
說明 :驗證註解的元素值不爲空(不爲null、去除首位空格後長度爲0),不一樣於@NotEmpty,@NotBlank只應用於字符串且在比較時會去除字符串的首位空格
@Length(min=下限, max=上限)
驗證的數據類型 : CharSequence子類型
說明 :驗證註解的元素值長度在min和max區間內
@NotEmpty
驗證的數據類型 :CharSequence子類型、Collection、Map、數組
說明 :驗證註解的元素值不爲null且不爲空(字符串長度不爲0、集合大小不爲0)
@Range(min=最小值, max=最大值)
驗證的數據類型 :BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子類型和包裝類型
說明 :驗證註解的元素值在最小值和最大值之間
@Email(regexp=正則表達式,flag=標誌的模式)
驗證的數據類型 :CharSequence子類型(如String)
說明 :驗證註解的元素值是Email,也能夠經過regexp和flag指定自定義的email格式
@Pattern(regexp=正則表達式,flag=標誌的模式)
驗證的數據類型 :String,任何CharSequence的子類型
說明 :驗證註解的元素值與指定的正則表達式匹配
@Valid驗證的數據類型 :任何非原子類型說明 :指定遞歸驗證關聯的對象;如用戶對象中有個地址對象屬性,若是想在驗證用戶對象時一塊兒驗證地址對象的話,在地址對象上加@Valid註解便可級聯驗證