下面將介紹常用的spring註解和Springmvc常用的註解。
作用:在配置類上寫@ComponentScan註解來進行包掃描,具體使用如下:
1、排除用法
①:排除用法 excludeFilters(排除@Controller註解的,和UserService的)
②:包含用法 includeFilters ,注意,若使用包含的用法, 需要把useDefaultFilters屬性設定為false(true表示掃描全部的)
a) 註解形式的FilterType.ANNOTATION @Controller @Service @Repository @Compent
b) 指定型別的 FilterType.ASSIGNABLE_TYPE @ComponentScan.Filter(type =
FilterType.ASSIGNABLE_TYPE,value = {UserService.class})
c) aspectj型別的 FilterType.ASPECTJ(不常用)
d) 正則表示式的 FilterType.REGEX(不常用)
e) 自定義的 FilterType.CUSTOM
①FilterType.CUSTOM 自定義型別如何使用
作用: 配置Bean的作用域物件。
(1) 在不指定@Scope的情況下,所有的bean都是單例項的bean,而且是餓漢載入(容器啟動例項就建立好了)
(2) 指定@Scope為 prototype 表示為多例項的,而且還是懶漢模式載入(IOC容器啟動的時候,並不會建立物件,而是在第一次使用的時候才會建立)。
(3) @Scope指定的作用域方法取值
① singleton: 單例項的(預設)
② prototype: 多例項的
④ session: 同一個會話級別
Bean的懶載入@Lazy(主要針對單例項的bean容器啟動的時候,不建立物件,在第一次使用的時候才會建立)
@Bean
@Lazy
public Person person() {
return new Person();
}
主要用在Controller,用於初始化Bean
主要用在Service,用於初始化Bean。
用來標識持久層
泛指元件,當元件不好歸類的時候,我們可以使用這個註解進行標註
透過@Bean的方式來匯入元件(實用於匯入第三方元件的類)
透過@Value + @PropertySource來給元件賦值
見@Value
① 優先使用byType,而後是byName
② 在多個實現類的 時候,byType的方式不再是唯一,而需要透過byName的方式注入,而這個name就是根據變數名來的。
//一個Dao
@Repository
public class UserDao {
@Service
public class UserService {
@Autowired
private UserDao userDao;
}
結論:
a:自動裝配首先時按照型別進行裝配,若在IOC容器中發現了多個相同型別的元件,那麼就按照 屬性名稱來進行裝配
比如,我容器中有二個XxxDao型別的元件 一個叫userDao 一個叫userDao2
那麼我們透過 @AutoWired 來修飾的屬性名稱時userDao,那麼拿就載入容器的userDao元件,若屬性名稱為
userDao2 那麼他就載入的時xxxDao2元件
b:假設我們需要指定特定的元件來進行裝配,我們可以透過使用@Qualifier("userDao")來指定裝配的元件
或者在配置類上的@Bean加上@Primary註解
@Qualifier("userDao")
private UserDao userDao2;
c:假設我們容器中即沒有userDao 和t userDao2,那麼在裝配的時候就會丟擲異常
No qualifying bean of type "com.xxx.UserDao" available
若我們想不拋異常 ,我們需要指定 required為false的時候可以了
@Autowired(required = false)
配合 @AutoWired,透過@Qualifier註解來指明使用哪一個實現類,實際上也是透過byName的方式實現。
透過@Profile註解 來根據環境來啟用標識不同的Bean
啟用切換環境的方法
方法一:透過執行時jvm引數來切換 -Dspring.profiles.active=test|dev|prod
方法二:透過程式碼的方式來啟用
是Controller 的restful 註解,自動新增@Controller和@ResponseBody註解。
透過`RequestMapping`註解可以定義不同的處理器對映規則。
① URL路徑對映
@RequestMapping(value="/item")或@RequestMapping("/item)
value的值是陣列,可以將多個url對映到同一個方法
② 窄化請求對映
在class上新增@RequestMapping(url)指定通用請求字首,限制此類下的所有方法請求url必須以請求字首為開頭,透過此方法對url進行分類管理。
如下:
@RequestMapping放在類名上邊,設定請求字首
@Controller
@RequestMapping("/item")
方法名上邊設定請求對映url:
@RequestMapping放在方法名上邊,如下:
@RequestMapping("/queryItem ")
訪問地址為/item/queryItem
@RequestMapping(method = RequestMethod.GET)
@RequestMapping(value="/editItem",method=RequestMethod.GET)
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})
`@RequestParam` 用於繫結單個請求引數。
- value:引數名字,即入參的請求引數名字,如value="item_id" 表示請求的引數區中的名字為item_id的引數值將傳入。
- required: 是否必須,預設為true,表示請求中一定要有相應的引數,否則將報錯。
`
TTP Status 400 - Required Integer parameter "XXXX" is not present
- defaultValue:預設值,表示如果請求中沒有同名引數時的預設值。
定義如下:
public String editItem(@RequestParam(value="item_id",required=true) String id) {
形參名稱為id,但是這裡使用value=" item_id"限定請求的引數名為`item_id`,所以頁面傳遞引數的名必須為`item_id`。
注意:如果請求引數中沒有item_id將跑出異常:
`HTTP Status 500 - Required Integer parameter "item_id" is not present`
這裡透過required=true限定item_id引數為必需傳遞,如果不傳遞則報400錯誤,可以使用defaultvalue設定預設值,即使required=true也可以不傳item_id引數值
使用如下:
public String test1(@ModelAttribute("user") User user)
只是此處多了一個註解@ModelAttribute("user"),它的作用是將該繫結的命令物件以“user”為名稱新增到模型物件中供檢視頁面展示使用。我們此時可以在檢視頁面使用${user.username}來獲取繫結的命令物件的屬性。
如請求引數包含“?username=zhang&password=123自動繫結到user 中的username和password屬性中。
功能和@AutoWired的功能差不多一樣,但是不支援@Primary 和@Qualifier的支援
f:使用autowired 可以標註在方法上
標註在set方法上
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}```
標註在構造方法上
public UserService(UserDao userDao) {
標註在配置類上的入參中(可以不寫)
public UserServuce getUserService(@Autowired UserDao userDao) {
UserServuce userService = new UserServuce(userDao);
return userService;
@PostConstruct:在bean建立完成並且屬性賦值完成;來執行初始化方法@PreDestroy:在容器銷燬bean之前通知我們進行清理工作。
1、透過@Import來匯入 元件(匯入元件的id為全類名路徑)
2、透過@Import 的ImportSeletor類實現元件的匯入 (匯入元件的id為全類名路徑)
3、透過@Import的 ImportBeanDefinitionRegister匯入元件 (可以指定bean的名稱)
作用:
@RequestBody`註解用於讀取http請求的內容(字串),透過springmvc提供的HttpMessageConverter`介面將讀到的內容轉換為`json、xml`等格式的資料並繫結到`controller`方法的引數上。
本例子應用:
`@RequestBody`註解實現接收http請求的json資料,將json資料轉換為java物件
33、@ResponseBody
`作用:`
該註解用於將`Controller`的方法返回的物件,透過`HttpMessageConverter`介面轉換為指定格式的資料如:json,xml等,透過Response響應給客戶端
`本例子應用:`
@ResponseBody註解實現將controller方法返回物件轉換為json響應給客戶端
34、@ModelAttribute
`@ModelAttribute`作用如下:
1、繫結請求引數到pojo並且暴露為模型資料傳到檢視頁面
此方法可實現資料回顯效果。
// 商品修改提交
@RequestMapping("/editItemSubmit")
public String editItemSubmit(@ModelAttribute("item") Items items,Model mo
頁面:
如果不用`@ModelAttribute`可以使用`model.addAttribute("item", items)`完成資料回顯。
2、將方法返回值暴露為模型資料傳到檢視頁面
//商品分類
商品型別:
<select name="itemtype">
<c:forEach items="${itemtypes }" var="itemtype">
<option value="${itemtype.key }">${itemtype.value }</option>
</c:forEach>
</select>
@PathVariable用於將請求URL中的模板變數對映到功能處理方法的引數上。
@RequestMapping(value="/users/{userId}/topics/{topicId}")
public String test(
@PathVariable(value="userId") int userId,
@PathVariable(value="topicId") int topicId)
如請求的URL為“控制器URL/users/123/topics/456”,則自動將URL中模板變數{userId}和{topicId}繫結到透過@PathVariable註解的同名引數上,即入參後userId=123、topicId=456。程式碼在PathVariableTypeController中。
這種方式最大的缺陷就是不能全域性控制異常。每個類都要寫一遍。
上文說到 @ ExceptionHandler 需要進行異常處理的方法必須與出錯的方法在同一個Controller裡面。那麼當代碼加入了 @ControllerAdvice,則不需要必須在同一個 controller 中了。這也是 Spring 3.2 帶來的新特性。從名字上可以看出大體意思是控制器增強。 也就是說,@controlleradvice + @ ExceptionHandler 也可以實現全域性的異常捕捉。
如果 @ExceptionHandler 註解中未宣告要處理的異常型別,則預設為引數列表中的異常型別。所以還可以寫成這樣:
1、@Transactional使用注意事項:
① @Transactional 只能被應用到public方法上, 對於其它非public的方法,如果標記了@Transactional也不會報錯,但方法沒有事務功能.
② @Transactional可以作用與介面、介面方法、類以及類方法上,但是Spring建議我們不要在介面或者介面方法上使用該註解,因為這隻有在使用基於介面的代理時它才會生效。
2、@Transactional註解中常用引數說明
① readOnly
該屬性用於設定當前事務是否為只讀事務,設定為true表示只讀,false則表示可讀寫,預設值為false。例如:`@Transactional(readOnly=true)`
② rollbackFor
該屬性用於設定需要進行回滾的異常類陣列,當方法中丟擲指定異常陣列中的異常時,則進行事務回滾。例如:
指定單一異常類:`@Transactional(rollbackFor=RuntimeException.class)`
指定多個異常類:`@Transactional(rollbackFor={RuntimeException.class, Exception.class})`
該屬性用於設定需要進行回滾的異常類名稱陣列,當方法中丟擲指定異常名稱陣列中的異常時,則進行事務回滾。例如:
指定單一異常類名稱:`@Transactional(rollbackForClassName="RuntimeException")`
指定多個異常類名稱:`@Transactional(rollbackForClassName={"RuntimeException","Exception"})`
④ noRollbackFor
該屬性用於設定不需要進行回滾的異常類陣列,當方法中丟擲指定異常陣列中的異常時,不進行事務回滾。例如:
指定單一異常類:`@Transactional(noRollbackFor=RuntimeException.class)`
指定多個異常類:`@Transactional(noRollbackFor={RuntimeException.class, Exception.class})`
⑤ noRollbackForClassName
該屬性用於設定不需要進行回滾的異常類名稱陣列,當方法中丟擲指定異常名稱陣列中的異常時,不進行事務回滾。例如:
指定單一異常類名稱:`@Transactional(noRollbackForClassName="RuntimeException")`
指定多個異常類名稱:
`@Transactional(noRollbackForClassName={"RuntimeException","Exception"})`
⑥ propagation
該屬性用於設定事務的傳播行為:
例如:`@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)`
⑦ isolation
該屬性用於設定底層資料庫的事務隔離級別,事務隔離級別用於處理多事務併發的情況,通常使用資料庫的預設隔離級別即可,基本不需要進行設定
該屬性用於設定事務的超時秒數,預設值為-1表示永不超時
`@Configuration` 標記的類必須符合下面的要求:
- 配置類必須以類的形式提供(不能是工廠方法返回的例項),允許透過生成子類在執行時增強(cglib 動態代理)。
- 配置類不能是` final` 類(沒法動態代理)。
- 配置註解通常為了透過 `@Bean `註解生成 `Spring` 容器管理的類,
- 配置類必須是非本地的(即不能在方法中宣告,不能是` private`)。
- 任何巢狀配置類都必須宣告為`static。`
- `@Bean `方法可能不會反過來建立進一步的配置類(也就是返回的 bean 如果帶有 `@Configuration`,也不會被特殊處理,只會作為普通的 bean)。
① @Configuation載入配置spring並啟動spring容器
② @Configuration啟動容器+@Bean註冊Bean,@Bean下管理bean的生命週期
④ @Configuration總結
(1) @Configuration等價於<beans></beans>
(2) @Bean等價於<bean></bean>
(3) @CompnentScan等價於<context:component-scan base-package=""/>
@Aspect:作用是把當前類標識為一個切面供容器讀取
@After:final增強,不管是丟擲異常或者正常退出都會執行
@Before:標識一個前置增強方法,相當於BeforeAdvice的功能
@Around:環繞增強,相當於MethodInterceptor
配置切點表示式:
public String editItem(@RequestParam(value="item_id",required=true) String id) { }
下面將介紹常用的spring註解和Springmvc常用的註解。
@CompentScan作用:在配置類上寫@ComponentScan註解來進行包掃描,具體使用如下:
1、排除用法
①:排除用法 excludeFilters(排除@Controller註解的,和UserService的)
②:包含用法 includeFilters ,注意,若使用包含的用法, 需要把useDefaultFilters屬性設定為false(true表示掃描全部的)
a) 註解形式的FilterType.ANNOTATION @Controller @Service @Repository @Compent
b) 指定型別的 FilterType.ASSIGNABLE_TYPE @ComponentScan.Filter(type =
FilterType.ASSIGNABLE_TYPE,value = {UserService.class})
c) aspectj型別的 FilterType.ASPECTJ(不常用)
d) 正則表示式的 FilterType.REGEX(不常用)
e) 自定義的 FilterType.CUSTOM
①FilterType.CUSTOM 自定義型別如何使用
@Scope作用: 配置Bean的作用域物件。
(1) 在不指定@Scope的情況下,所有的bean都是單例項的bean,而且是餓漢載入(容器啟動例項就建立好了)
(2) 指定@Scope為 prototype 表示為多例項的,而且還是懶漢模式載入(IOC容器啟動的時候,並不會建立物件,而是在第一次使用的時候才會建立)。
(3) @Scope指定的作用域方法取值
① singleton: 單例項的(預設)
② prototype: 多例項的
④ session: 同一個會話級別
@LazyBean的懶載入@Lazy(主要針對單例項的bean容器啟動的時候,不建立物件,在第一次使用的時候才會建立)
@Bean
@Lazy
public Person person() {
return new Person();
}
@Controller主要用在Controller,用於初始化Bean
@Service主要用在Service,用於初始化Bean。
@Respository用來標識持久層
@Component泛指元件,當元件不好歸類的時候,我們可以使用這個註解進行標註
@Bean透過@Bean的方式來匯入元件(實用於匯入第三方元件的類)
@Value透過@Value + @PropertySource來給元件賦值
@PropertySource見@Value
@AutoWired① 優先使用byType,而後是byName
② 在多個實現類的 時候,byType的方式不再是唯一,而需要透過byName的方式注入,而這個name就是根據變數名來的。
//一個Dao
@Repository
public class UserDao {
}
@Service
public class UserService {
@Autowired
private UserDao userDao;
}
結論:
a:自動裝配首先時按照型別進行裝配,若在IOC容器中發現了多個相同型別的元件,那麼就按照 屬性名稱來進行裝配
@Autowired
private UserDao userDao;
比如,我容器中有二個XxxDao型別的元件 一個叫userDao 一個叫userDao2
那麼我們透過 @AutoWired 來修飾的屬性名稱時userDao,那麼拿就載入容器的userDao元件,若屬性名稱為
userDao2 那麼他就載入的時xxxDao2元件
b:假設我們需要指定特定的元件來進行裝配,我們可以透過使用@Qualifier("userDao")來指定裝配的元件
或者在配置類上的@Bean加上@Primary註解
@Autowired
@Qualifier("userDao")
private UserDao userDao2;
c:假設我們容器中即沒有userDao 和t userDao2,那麼在裝配的時候就會丟擲異常
No qualifying bean of type "com.xxx.UserDao" available
若我們想不拋異常 ,我們需要指定 required為false的時候可以了
@Autowired(required = false)
@Qualifier("userDao")
private UserDao userDao2;
Qualifier配合 @AutoWired,透過@Qualifier註解來指明使用哪一個實現類,實際上也是透過byName的方式實現。
@Profile透過@Profile註解 來根據環境來啟用標識不同的Bean
啟用切換環境的方法
方法一:透過執行時jvm引數來切換 -Dspring.profiles.active=test|dev|prod
方法二:透過程式碼的方式來啟用
@RestController是Controller 的restful 註解,自動新增@Controller和@ResponseBody註解。
@RequestMapping透過`RequestMapping`註解可以定義不同的處理器對映規則。
① URL路徑對映
@RequestMapping(value="/item")或@RequestMapping("/item)
value的值是陣列,可以將多個url對映到同一個方法
② 窄化請求對映
在class上新增@RequestMapping(url)指定通用請求字首,限制此類下的所有方法請求url必須以請求字首為開頭,透過此方法對url進行分類管理。
如下:
@RequestMapping放在類名上邊,設定請求字首
@Controller
@RequestMapping("/item")
方法名上邊設定請求對映url:
@RequestMapping放在方法名上邊,如下:
@RequestMapping("/queryItem ")
訪問地址為/item/queryItem
@RequestMapping(method = RequestMethod.GET)
@RequestMapping(value="/editItem",method=RequestMethod.GET)
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})
@RequestParam`@RequestParam` 用於繫結單個請求引數。
- value:引數名字,即入參的請求引數名字,如value="item_id" 表示請求的引數區中的名字為item_id的引數值將傳入。
- required: 是否必須,預設為true,表示請求中一定要有相應的引數,否則將報錯。
`
TTP Status 400 - Required Integer parameter "XXXX" is not present
`
- defaultValue:預設值,表示如果請求中沒有同名引數時的預設值。
定義如下:
public String editItem(@RequestParam(value="item_id",required=true) String id) {
}
形參名稱為id,但是這裡使用value=" item_id"限定請求的引數名為`item_id`,所以頁面傳遞引數的名必須為`item_id`。
注意:如果請求引數中沒有item_id將跑出異常:
`HTTP Status 500 - Required Integer parameter "item_id" is not present`
這裡透過required=true限定item_id引數為必需傳遞,如果不傳遞則報400錯誤,可以使用defaultvalue設定預設值,即使required=true也可以不傳item_id引數值
@ModeAttribute使用如下:
public String test1(@ModelAttribute("user") User user)
只是此處多了一個註解@ModelAttribute("user"),它的作用是將該繫結的命令物件以“user”為名稱新增到模型物件中供檢視頁面展示使用。我們此時可以在檢視頁面使用${user.username}來獲取繫結的命令物件的屬性。
如請求引數包含“?username=zhang&password=123自動繫結到user 中的username和password屬性中。
@Resource功能和@AutoWired的功能差不多一樣,但是不支援@Primary 和@Qualifier的支援
f:使用autowired 可以標註在方法上
標註在set方法上
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}```
標註在構造方法上
@Autowired
public UserService(UserDao userDao) {
this.userDao = userDao;
}
標註在配置類上的入參中(可以不寫)
@Bean
public UserServuce getUserService(@Autowired UserDao userDao) {
UserServuce userService = new UserServuce(userDao);
return userService;
}
@PostConstruct 和 @PreDestroy@PostConstruct:在bean建立完成並且屬性賦值完成;來執行初始化方法@PreDestroy:在容器銷燬bean之前通知我們進行清理工作。
@Import1、透過@Import來匯入 元件(匯入元件的id為全類名路徑)
2、透過@Import 的ImportSeletor類實現元件的匯入 (匯入元件的id為全類名路徑)
3、透過@Import的 ImportBeanDefinitionRegister匯入元件 (可以指定bean的名稱)
@RequestBody作用:
@RequestBody`註解用於讀取http請求的內容(字串),透過springmvc提供的HttpMessageConverter`介面將讀到的內容轉換為`json、xml`等格式的資料並繫結到`controller`方法的引數上。
本例子應用:
`@RequestBody`註解實現接收http請求的json資料,將json資料轉換為java物件
33、@ResponseBody
`作用:`
該註解用於將`Controller`的方法返回的物件,透過`HttpMessageConverter`介面轉換為指定格式的資料如:json,xml等,透過Response響應給客戶端
`本例子應用:`
@ResponseBody註解實現將controller方法返回物件轉換為json響應給客戶端
34、@ModelAttribute
`@ModelAttribute`作用如下:
1、繫結請求引數到pojo並且暴露為模型資料傳到檢視頁面
此方法可實現資料回顯效果。
// 商品修改提交
@RequestMapping("/editItemSubmit")
public String editItemSubmit(@ModelAttribute("item") Items items,Model mo
頁面:
如果不用`@ModelAttribute`可以使用`model.addAttribute("item", items)`完成資料回顯。
2、將方法返回值暴露為模型資料傳到檢視頁面
//商品分類
頁面:
商品型別:
<select name="itemtype">
<c:forEach items="${itemtypes }" var="itemtype">
<option value="${itemtype.key }">${itemtype.value }</option>
</c:forEach>
</select>
@PathVariable@PathVariable用於將請求URL中的模板變數對映到功能處理方法的引數上。
@RequestMapping(value="/users/{userId}/topics/{topicId}")
public String test(
@PathVariable(value="userId") int userId,
@PathVariable(value="topicId") int topicId)
如請求的URL為“控制器URL/users/123/topics/456”,則自動將URL中模板變數{userId}和{topicId}繫結到透過@PathVariable註解的同名引數上,即入參後userId=123、topicId=456。程式碼在PathVariableTypeController中。
@ExceptionHandler這種方式最大的缺陷就是不能全域性控制異常。每個類都要寫一遍。
@ControllerAdvice上文說到 @ ExceptionHandler 需要進行異常處理的方法必須與出錯的方法在同一個Controller裡面。那麼當代碼加入了 @ControllerAdvice,則不需要必須在同一個 controller 中了。這也是 Spring 3.2 帶來的新特性。從名字上可以看出大體意思是控制器增強。 也就是說,@controlleradvice + @ ExceptionHandler 也可以實現全域性的異常捕捉。
如果 @ExceptionHandler 註解中未宣告要處理的異常型別,則預設為引數列表中的異常型別。所以還可以寫成這樣:
@Transactional1、@Transactional使用注意事項:
① @Transactional 只能被應用到public方法上, 對於其它非public的方法,如果標記了@Transactional也不會報錯,但方法沒有事務功能.
② @Transactional可以作用與介面、介面方法、類以及類方法上,但是Spring建議我們不要在介面或者介面方法上使用該註解,因為這隻有在使用基於介面的代理時它才會生效。
2、@Transactional註解中常用引數說明
① readOnly
該屬性用於設定當前事務是否為只讀事務,設定為true表示只讀,false則表示可讀寫,預設值為false。例如:`@Transactional(readOnly=true)`
② rollbackFor
該屬性用於設定需要進行回滾的異常類陣列,當方法中丟擲指定異常陣列中的異常時,則進行事務回滾。例如:
指定單一異常類:`@Transactional(rollbackFor=RuntimeException.class)`
指定多個異常類:`@Transactional(rollbackFor={RuntimeException.class, Exception.class})`
該屬性用於設定需要進行回滾的異常類名稱陣列,當方法中丟擲指定異常名稱陣列中的異常時,則進行事務回滾。例如:
指定單一異常類名稱:`@Transactional(rollbackForClassName="RuntimeException")`
指定多個異常類名稱:`@Transactional(rollbackForClassName={"RuntimeException","Exception"})`
④ noRollbackFor
該屬性用於設定不需要進行回滾的異常類陣列,當方法中丟擲指定異常陣列中的異常時,不進行事務回滾。例如:
指定單一異常類:`@Transactional(noRollbackFor=RuntimeException.class)`
指定多個異常類:`@Transactional(noRollbackFor={RuntimeException.class, Exception.class})`
⑤ noRollbackForClassName
該屬性用於設定不需要進行回滾的異常類名稱陣列,當方法中丟擲指定異常名稱陣列中的異常時,不進行事務回滾。例如:
指定單一異常類名稱:`@Transactional(noRollbackForClassName="RuntimeException")`
指定多個異常類名稱:
`@Transactional(noRollbackForClassName={"RuntimeException","Exception"})`
⑥ propagation
該屬性用於設定事務的傳播行為:
例如:`@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)`
⑦ isolation
該屬性用於設定底層資料庫的事務隔離級別,事務隔離級別用於處理多事務併發的情況,通常使用資料庫的預設隔離級別即可,基本不需要進行設定
該屬性用於設定事務的超時秒數,預設值為-1表示永不超時
@Configuration`@Configuration` 標記的類必須符合下面的要求:
- 配置類必須以類的形式提供(不能是工廠方法返回的例項),允許透過生成子類在執行時增強(cglib 動態代理)。
- 配置類不能是` final` 類(沒法動態代理)。
- 配置註解通常為了透過 `@Bean `註解生成 `Spring` 容器管理的類,
- 配置類必須是非本地的(即不能在方法中宣告,不能是` private`)。
- 任何巢狀配置類都必須宣告為`static。`
- `@Bean `方法可能不會反過來建立進一步的配置類(也就是返回的 bean 如果帶有 `@Configuration`,也不會被特殊處理,只會作為普通的 bean)。
① @Configuation載入配置spring並啟動spring容器
② @Configuration啟動容器+@Bean註冊Bean,@Bean下管理bean的生命週期
④ @Configuration總結
(1) @Configuration等價於<beans></beans>
(2) @Bean等價於<bean></bean>
(3) @CompnentScan等價於<context:component-scan base-package=""/>
@AspectJ@Aspect:作用是把當前類標識為一個切面供容器讀取
@After@After:final增強,不管是丟擲異常或者正常退出都會執行
@Before@Before:標識一個前置增強方法,相當於BeforeAdvice的功能
@Around@Around:環繞增強,相當於MethodInterceptor
@PointCut配置切點表示式:
@RequestParam`@RequestParam` 用於繫結單個請求引數。
- value:引數名字,即入參的請求引數名字,如value="item_id" 表示請求的引數區中的名字為item_id的引數值將傳入。
- required: 是否必須,預設為true,表示請求中一定要有相應的引數,否則將報錯。
`
TTP Status 400 - Required Integer parameter "XXXX" is not present
`
- defaultValue:預設值,表示如果請求中沒有同名引數時的預設值。
定義如下:
public String editItem(@RequestParam(value="item_id",required=true) String id) { }
形參名稱為id,但是這裡使用value=" item_id"限定請求的引數名為`item_id`,所以頁面傳遞引數的名必須為`item_id`。
注意:如果請求引數中沒有item_id將跑出異常:
`HTTP Status 500 - Required Integer parameter "item_id" is not present`
這裡透過required=true限定item_id引數為必需傳遞,如果不傳遞則報400錯誤,可以使用defaultvalue設定預設值,即使required=true也可以不傳item_id引數值