回覆列表
  • 1 # 程式猿W

    下面將介紹常用的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: 同一個會話級別

    @Lazy

    Bean的懶載入@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之前通知我們進行清理工作。

    @Import

    1、透過@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 註解中未宣告要處理的異常型別,則預設為引數列表中的異常型別。所以還可以寫成這樣:

    @Transactional

    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

    `@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引數值

  • 中秋節和大豐收的關聯?
  • 腦栓塞的治療原則是什麼?