太厲害了!終於有人把Spring Boot常用註釋講明白了!

語言: CN / TW / HK

前言

Spring Boot 是由 Pivotal 團隊提供的全新框架,其設計目的是用來簡化新 Spring 應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。

Java學習筆記共享地址:spring boot的核心技術100多頁學習筆記

Spring Boot 被認為是 Spring MVC 的“接班人”,它可以幫我們自動配置,如果預設配置不能滿足需求,我們還可以替換掉自動配置類,使用自己的配置。另外,Spring Boot 還集成了嵌入式的 Web 伺服器,系統監控等很多有用的功,讓我們快速構建企業及應用程式。

1、@Conditional

可以控制更為複雜的配置條件。在Spring內建的條件控制註解不滿足應用需求的時候,可以使用此註解定義自定義的控制條件,以達到自定義的要求。

示例:

@Conditioanl(CustomConditioanl.class)
CustomProperties addCustomProperties(){
 //...
}/2、

2、@ConditionalOnResource

用於檢測當某個配置檔案存在使,則觸發被其標註的方法,下面是使用此註解的程式碼

示例:

@ConditionalOnResource(resources = "classpath:website.properties")
Properties addWebsiteProperties(){
 //...
}

3、@ConditionalOnClass與@ConditionalOnMissingClass

這兩個註解屬於類條件註解,它們根據是否存在某個類作為判斷依據來決定是否要執行某些配置。

示例:

@Configuration
@ConditionalOnClass(DataSource.class)
class MySQLAutoConfiguration {
 //...
}

4、@SpringBootApplication

註解是一個快捷的配置註解,在被它標註的類中,可以定義一個或多個Bean,並自動觸發自動配置Bean和自動掃描元件。此註解相當於@Configuration、@EnableAutoConfiguration和@ComponentScan的組合。

在Spring Boot應用程式的主類中,就使用了此註解。

示例:

@SpringBootApplication
public class Application{
 public static void main(String [] args){
   SpringApplication.run(Application.class,args);
 }
}

5、@Autowired

@Autowired註解用於標記Spring將要解析和注入的依賴項。此註解可以作用在建構函式、欄位和setter方法上,作用於建構函式

示例:

@RestController
public class userController {
	private UserService userService;
	@Autowired
	UserController(userService userService){
		this.userService = userservice;
	}
}

6、@Primary

當系統中需要配置多個具有相同型別的bean時,@Primary可以定義這些Bean的優先順序。

示例:

7、Scops註解

@Scope註解可以用來定義@Component標註的類的作用範圍以及@Bean所標記的類的作用範圍。@Scope所限定的作用範圍有:singleton、prototype、request、session、globalSession或者其他的自定義範圍。這裡以prototype為例子進行講解。

當一個Spring Bean被宣告為prototype(原型模式)時,在每次需要使用到該類的時候,Spring IoC容器都會初始化一個新的改類的例項。在定義一個Bean時,可以設定Bean的scope屬性為

prototype:scope=“prototype”

也可以使用@Scope註解設定

@Scope(value=ConfigurableBeanFactory.SCOPE_PROPTOTYPE)

兩種不同的方式來使用@Scope註解,示例:

8、@RequestBody

在處理請求方法的引數列表中使用,它可以將請求主體中的引數繫結到一個物件中,請求主體引數是通過HttpMessageConverter傳遞的,根據請求主體中的引數名與物件的屬性名進行匹配並繫結值。此外,還可以通過@Valid註解對請求主體中的引數進行校驗。

示例:

9、@PostMapping

@PostMapping註解用於處理HTTP POST請求,並將請求對映到具體的處理方法中。@PostMapping與@GetMapping一樣,也是一個組合註解,它相當於是@RequestMapping(method=HttpMethod.POST)的快捷方式。

示例:

10、@DeleteMapping

@DeleteMapping註解用於處理HTTP DELETE請求,並將請求對映到刪除方法中。@DeleteMapping是一個組合註解,它相當於是@RequestMapping(method=HttpMethod.DELETE)的快捷方式。

示例:

11、@ResponseBody

@ResponseBody會自動將控制器中方法的返回值寫入到HTTP響應中。特別的,@ResponseBody註解只能用在被@Controller註解標記的類中。如果在被@RestController標記的類中,則方法不需要使用@ResponseBody註解進行標註。@RestController相當於是@Controller和@ResponseBody的組合註解。

示例:

12、@ResponseStatus

註解可以標註請求處理方法。使用此註解,可以指定響應所需要的HTTP STATUS。特別地,我們可以使用HttpStauts類對該註解的value屬性進行賦值。

示例:

13、@RequestParam

註解用於將方法的引數與Web請求的傳遞的引數進行繫結。使用@RequestParam可以輕鬆的訪問HTTP請求引數的值。

示例:

14、@Controller

是@Component註解的一個延伸,會自動掃描並配置被該註解標註的類。此註解用於標註Spring MVC的控制器。

示例:

15、@ModelAttribute

可以通過模型索引名稱來訪問已經存在於控制器中的model

示例:

與@PathVariable和@RequestParam註解一樣,如果引數名與模型具有相同的名字,則不必指定索引名稱,簡寫示例如下:

如果使用@ModelAttribute對方法進行標註,Spring會將方法的返回值繫結到具體的Model上

示例:

在Spring呼叫具體的處理方法之前,被@ModelAttribute註解標註的所有方法都將被執行。

16、@Component

註解用於標註一個普通的元件類,它沒有明確的業務範圍,只是通知Spring被此註解的類需要被納入到Spring Bean容器中並進行管理。

示例:

17、@Repository

是@Component註解的延伸,與@Component註解一樣,被此註解標註的類會被Spring自動管理起來,@Repository註解用於標註DAO層的資料持久化類。

示例:

18、@DependsOn

可以配置Spring IoC容器在初始化一個Bean之前,先初始化其他的Bean物件

示例:


Spring boot 返回 json 資料

在做如下操作之前,我們對之前的 Hello 進行簡單的修改,我們新建一個包 com.hpit.test.web 然後新建一個類 HelloControoler, 然後修改 App.java 類,主要是的這個類就是一個單純的啟動類。

主要程式碼如下:

iackage com.hpit; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Hello world!
*/

//其中@SpringBootApplication 申明讓 spring boot 自動給程式進行必要的配置,等價於以預設屬性使用
//@Configuration,@EnableAutoConfiguration 和@ComponentScan
//@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
} }
com.hpit.test.web.HelloController :
package com.hpit.test.web;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController// 標記為:restful
public class HelloController {
@RequestMapping("/")
public String hello(){
return"Hello world!"; } }

我們在編寫介面的時候,時常會有需求返回 json 資料,那麼在 spring boot 應該怎麼操作呢?主要是在 class 中

加入註解@RestController,。

返回 JSON 之步驟:

(1)編寫一個實體類 Demo

(2)編寫 DemoController;

(3)在 DemoController 加上@RestController 和@RequestMapping 註解;

(4)測試

具體程式碼如下:

com.hpit.test.bean.Demo :
package com.hpit.test.bean;
/**
* 測試實體類. * @author Administrator
*
*/
public class Demo {
  private longid;//主鍵.
private String name;//測試名稱.
public long getId() {
returnid; }
public void setId(longid) {
this.id = id; }
public String getName() {
returnname; }
publicvoid setName(String name) {
this.name = name; } }
com.hpit.test.web.DemoController:
package com.hpit.test.web;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.hpit.test.bean.Demo;
/**
* 測試. * @author Administrator
*
*/
@RestController
@RequestMapping("/demo")
public class DemoController {
/**
* 返回 demo 資料: * 請求地址:http://127.0.0.1:8080/demo/getDemo
* @return
*/
@RequestMapping("/getDemo")
public Demo getDemo(){
  Demo demo = new Demo();
demo.setId(1);
demo.setName("Zjs");
return demo; } }

那麼在瀏覽器訪問地址:http://127.0.0.1:8080/demo/getDemo 返回如下資料: { id: 1, name: "Zjs" }

是不是很神奇呢,其實 Spring Boot 也是引用了 JSON 解析包 Jackson,那麼自然我們就可以在 Demo 物件上使用 Jackson 提供的 json 屬性的註解,對時間進行格式化,對一些欄位進行忽略等等。

Spring boot 匯入 spring XML 配置檔案

在 App.java 類編寫 HelloService2;

首先我們這裡有幾個包:com.hpit,org.hpit,我們這裡打算把 App.java 啟動類放到 com.hpit 中,根據 SpringBoot 掃描(根包到子包的原則),我們把 HelloService2 寫在 Spring Boot 可以掃描的位置,HelloService 寫在Spring Boot 無法掃描到的位置,那麼我們使用配置檔案 bean 的方式進行引入,具體程式碼如下:

1.建立一個 App 預設無法掃描到的 bean

package org.hpit.demo.service;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
/**
* TODO 當前類無法被App掃描到將被配置在applicationContext.xml中 * @author 鄭江山
*
*/
@Service("helloService")
public class HelloService {
private Logger logger = Logger.getLogger(getClass());
public void hello() {
logger.info("這個bean是springboot預設情況下無法掃描到的"); } }

2.在 resource 下建立 spring 傳統配置檔案 applicationContext.xml(名字任意)

src/main/resource/applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 在傳統spring配置檔案中託管springboot預設無法掃描到的bean --> <bean id="helloService" class="org.hpit.demo.service.HelloService"></bean>
</beans>

3.建立一個系統啟動任務類,用於測試 App 無法掃描到的 Bean 是否能自動裝配

com.hpit.springboot03.runner.TestXMLBeanRunner

package com.hpit.springboot03.runner;
import javax.annotation.Resource;
import org.hpit.demo.service.HelloService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* TODO 測試App無法掃到的Bean是否能引入
** @author 鄭江山
*
*/
@Component
@Order(value = 1)
public class TestXMLBeanRunner implements CommandLineRunner { @Resource
private HelloService helloService;
@Override
public void run(String... arg0) throws Exception {
helloService.hello(); } }

4.在 App.java 中配置引入配置檔案的註解 @ImportResource

package com.hpit.springboot03;
import javax.servlet.MultipartConfigElement;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource; @SpringBootApplication
@ServletComponentScan // 開始servlet掃描
@ComponentScan(basePackages = { "com.hpit" })
@ImportResource(locations = { "applicationContext.xml" }) // 匯入spring配置檔案 
public class App {
public static void main(String[] args) throws Exception {
SpringApplication.run(App.class, args); }
// 配置檔案上傳 @Bean
public MultipartConfigElement multipartConfigFactory() {
MultipartConfigFactory configFactory = new MultipartConfigFactory();
configFactory.setMaxFileSize("128MB");// KB MB 設定單個上傳檔案大小
configFactory.setMaxRequestSize("1024MB");
configFactory.setLocation("/");// 設定檔案上傳路徑
return configFactory.createMultipartConfig(); } }

5.啟動應用,觀察日誌輸出,發現系統可以引入 App 無法掃描到的 bean