1. 程式人生 > >springboot原始碼探索(一)spring註解

springboot原始碼探索(一)spring註解

   接觸springboot快一年了,對微服務的概念越來越熟悉。而自己也慢慢萌生了探索一下原始碼的想法,寫此部落格,只為記錄一下自己的學習過程。這也是我第一次嘗試寫系列部落格。

   我覺得學習springboot,首先需要了解的就是springboot豐富的註解。

常用註解:

1、@SpringBootApplication 申明讓spring boot自動給程式進行必要的配置, 等價於以預設屬性使用@Configuration,@EnableAutoConfiguration和@ComponentScan

2、@Configuration 等同於spring的XML配置檔案;使用

Java程式碼可以檢查型別安全。

3、@EnableAutoConfiguration使spring獲取約定的配置進行自動配置。(預設從檔案META-INF/spring.factories獲取自動配置類)

4、@ComponentScan 表示將該類自動發現(掃描)並註冊為Bean,可以自動收集所有的Spring元件, 包括@Configuration類。我們經常使用@ComponentScan註解搜尋beans,並結合@Autowired註解匯入。 如果沒有配置的話,Spring Boot會掃描啟動類所在包下以及子包下的使用了@Service,@Repository等註解的類

5、@EnableScheduling 在 Spring Boot 的配置類中,標註上這個註解,就可以對專案中的方法某些方法使用@Schedule註解,將其變為定時自動執行。 但只有兩種註解共同使用時,才能達到本註解應有的作用。(我的專案已經配置了quarz,禁止用這種方式。。。)

6、@Autowired 自動匯入依賴的bean,這個註解大家都用過。。

7、@Qualifier 限定描述符除了能根據名字進行注入,但能進行更細粒度的控制如何選擇候選者

8、@ImportResource 用來載入xml配置檔案,如果你想用xml完全可以的

9、@RestController 返回json字串的資料,是@Controller和@ResponseBody的合集,直接可以編寫RESTFul的介面,返回規則也可配,這裡就不多寫了

10、@ServletComponentScan spring能夠掃描到自己編寫的servlet和filter, SpringBootApplication 上使用@ServletComponentScan註解後,Servlet、Filter、Listener, 可以直接通過 @WebServlet、@WebFilter、@WebListener 註解自動註冊,無需其他程式碼

11、@Import({DynamicDataSourceRegister.class}) 註冊動態多資料來源(很少用)

12、@PropertySource(value = “classpath:spring/config.properties”) 通過@PropertySource註解將properties配置檔案中的值儲存到Spring的 Environment中,Environment介面提供方法去讀取配置檔案中的值, 引數是properties檔案中定義的key值。上面是讀取一個配置檔案,如果你想要讀取多個配置檔案,請看下面程式碼片段 @PropertySource(value = {“classpath:spring/config.properties”,”classpath:spring/news.properties”})  (很少用)

13、@EnableWebSocketMessageBroker 表示開啟使用STOMP協議來傳輸基於代理的訊息,Broker就是代理的意思(很少用)

14、@Repository、@Service、@Controller,它們分別對應儲存層 Bean,業務層 Bean,和展示層 Bean,將類標識為 Bean; 分別用於軟體系統的不同層次: @Component 是一個泛化的概念,僅僅表示一個元件 (Bean) ,可以作用在任何層次。 @Service 通常作用在業務層,但是目前該功能與 @Component 相同。 @Constroller 通常作用在控制層,但是目前該功能與 @Component 相同。 通過在類上使用 @Repository、@Component、@Service 和 @Constroller 註解,Spring會自動建立相應的 BeanDefinition 物件, 並註冊到 ApplicationContext 中。這些類就成了 Spring 受管元件。這三個註解除了作用於不同軟體層次的類, 其使用方式與 @Repository 是完全相同的。

15、@Value(“${spring.datasource.url}”) 獲取 application 配置檔案中的變數

16、@ConfigurationProperties 讀取application屬性配置檔案中的屬性

17、@ControllerAdvice 全域性異常處理類,以將對於控制器的全域性配置放在同一個位置。

  • 註解了@Controller的類的方法可以使用@ExceptionHandler、@InitBinder、@ModelAttribute註解到方法上。
  • ControllerAdvice註解將作用在所有註解了@RequestMapping的控制器的方法上
  • ExceptionHandler:用於全域性處理控制器裡的異常。
  • InitBinder:用來設定WebDataBinder,用於自動繫結前臺請求引數到Model中。
  • ModelAttribute:本來作用是繫結鍵值對到Model中,此處讓全域性的@RequestMapping都能獲得在此處設定的鍵值對。

18、@WebFilter 將一個實現了javax.servlet.Filter介面的類定義為過濾器

  • 屬性filterName宣告過濾器的名稱,可選
  • 屬性urlPatterns指定要過濾的URL模式,也可使用屬性value來宣告.(指定要過濾的URL模式是必選屬性)

19、@Scope(“prototype”) Spring預設產生的bean是單例的,”prototype” 表示原型即每次都會new一個新的出來

20、@Bean標註在方法上(返回某個例項的方法),作用為註冊bean物件

  • @Bean註解在返回例項的方法上,如果未通過@Bean指定bean的名稱,則預設與標註的方法名相同;
  • @Bean註解預設作用域為單例singleton作用域,可通過@Scope(“prototype”)設定為原型作用域;
  • 既然@Bean的作用是註冊bean物件,那麼完全可以使用@Component、@Controller、@Service、@Ripository等 註解註冊bean,當然需要配置@ComponentScan註解進行自動掃描

21、@EnableAspectJAutoProxy表示開啟AOP代理自動配置,如果配@EnableAspectJAutoProxy表示使用cglib進行代理物件的生成;設定@EnableAspectJAutoProxy(exposeProxy=true)表示通過aop框架暴露該代理物件,aopContext能夠訪問.

Controller層常用註解:

1、@PathVariable 當使用@RequestMapping URI template 樣式對映時,即 someUrl/{paramId}, 這時的paramId可通過 @Pathvariable註解繫結它傳過來的值到方法的引數上

2、@RequestHeader 可以把Request請求header部分的值繫結到方法的引數上如(@RequestHeader("Accept-Encoding") String encoding){}

3、@CookieValue 可以把Request header中關於cookie的值繫結到方法的引數上如(@CookieValue("JSESSIONID") String cookie){}

4、@RequestParam

  • 常用來處理簡單型別的繫結,通過 Request.getParameter() 獲取的String可直接轉換為簡單型別的情況 ( String–> 簡單型別的轉換操作由ConversionService配置的轉換器來完成); 因為使用request.getParameter()方式獲取引數,所 以可以處理get 方式中queryString的值,也可以處理post方式中 body data的值;
  • 用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內容,提交方式GET、POST;
  • 該註解有兩個屬性: value、required; value用來指定要傳入值的id名稱,required用來指示引數是否必須繫結;

5、@RequestBody 通過使用HandlerAdapter預設配置的HttpMessageConverters來解析Request請求的Body部分資料並將相應的資料繫結到Controller中方法的引數上,其常用來處理Content-Type不是application/x-www-form-urlencoded編碼的內容,例如application/json, application/xml等。

  • 它是通過使用HandlerAdapter 配置的HttpMessageConverters來解析post data body,然後繫結到相應的bean上的。
  • 因為配置有FormHttpMessageConverter,所以也可以用來處理 application/x-www-form-urlencoded的內容,處理完的結果放在一個MultiValueMap<String, String>裡,這種情況在某些特殊需求下使用。

6、@SessionAttributes 用來繫結HttpSession中的attribute物件的值,便於在方法中的引數裡使用。 該註解有value、types兩個屬性,可以通過名字和型別指定要使用的attribute 物件

7、@ModelAttribute 該註解有兩個用法,一個是用於方法上,一個是用於引數上:

  • 用於方法上時: 通常用來在處理@RequestMapping之前,為請求繫結需要從後臺查詢的model;
  • 用於引數上時: 用來通過名稱對應,把相應名稱的值繫結到註解的引數bean上;要繫結的值來源於:
    • @SessionAttributes 啟用的attribute 物件上;
    • @ModelAttribute 用於方法上時指定的model物件;
    • 上述兩種情況都沒有時,new一個需要繫結的bean物件,然後把request中按名稱對應的方式把值繫結到bean中, 這種方式實際的效果就是在呼叫@RequestMapping的方法之前,為request物件的model裡put(“account”, Account)