1.@SpringBootApplication :
Spring Boot應用標注在某個類上說明這個類是SpringBoot的主配置類,SpringBoot就應該運行這個類的main方法來啟動SpringBoot應用。
2.@SpringBootConfiguration:
Spring Boot的配置類;
標注在某個類上,表示這是一個Spring Boot的配置類;
3.@Configuration:
配置類上來標注這個注解;
配置類 ----- 配置文件;配置類也是容器中的一個組件;@Component
4.@EnableAutoConfiguration:
開啟自動配置功能;
以前我們需要配置的東西,Spring Boot幫我們自動配置;
@EnableAutoConfiguration告訴SpringBoot開啟自動配置功能;這樣自動配置才能生效;
5.@AutoConfigurationPackage:
自動配置包
6.@Import(AutoConfigurationPackages.Registrar.class):
Spring的底層注解@Import,給容器中導入一個組件;導入的組件由AutoConfigurationPackages.Registrar.class;
==將主配置類(@SpringBootApplication標注的類)的所在包及下面所有子包里面的所有組件掃描到Spring容器;==
7.@Import(EnableAutoConfigurationImportSelector.class);
給容器中導入組件?
EnableAutoConfigurationImportSelector:
導入哪些組件的選擇器;
將所有需要導入的組件以全類名的方式返回;這些組件就會被添加到容器中;
會給容器中導入非常多的自動配置類(xxxAutoConfiguration);就是給容器中導入這個場景需要的所有組件,并配置好這些組件;
有了自動配置類,免去了我們手動編寫配置注入功能組件等的工作;
8.SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader);
==Spring Boot在啟動的時候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作為自動配置類導入到容器中,自動配置類就生效,幫我們進行自動配置工作;==以前我們需要自己配置的東西,自動配置類都幫我們;
J2EE的整體整合解決方案和自動配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar;
9.@RequestMapping("/hello")
http://localhost:8080/hello:輸入該鏈接打印出標注類/方法的內容,8080是端口號,接收來自瀏覽器的hello請求
10.@RestController
這個類的所有方法返回的數據直接寫給瀏覽器,(如果是對象轉為json數據)
11.@ConfigurationProperties:
將配置文件中配置的每一個屬性的值,映射到這個組件中*
告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定;* prefix = "person":配置文件中哪個下面的所有屬性進行一一映射** 只有這個組件是容器中的組件,才能容器提供的@ConfigurationProperties功能;* @ConfigurationProperties(prefix = "person")默認從全局配置文件中獲取值;
12.@Value獲取值和@ConfigurationProperties獲取值比較
@CONFIGURATIONPROPERTIES | @VALUE | |
---|---|---|
功能 | 批量注入配置文件中的屬性 | 一個個指定 |
松散綁定(松散語法)('-n'='N') | 支持 | 不支持 |
SpEL(表達式的計算) | 不支持 | 支持 |
JSR303數據校驗(例如:增加Email檢驗) | 支持 | 不支持 |
復雜類型封裝 | 支持 | 不支持 |
配置文件yml還是properties他們都能獲取到值;
如果說,我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value;
如果說,我們專門編寫了一個javaBean來和配置文件進行映射,我們就直接使用@ConfigurationProperties;
13.@Validated
配置在類上后可以使用JSR303數據校驗(例如:增加Email檢驗)
14.@controller 控制器(注入服務)
用于標注控制層,相當于struts中的action層
15.@service 服務(注入dao)
用于標注服務層,主要用來進行業務的邏輯處理
16.@repository(實現dao訪問)
用于標注數據訪問層,也可以說用于標注數據訪問組件,即DAO組件.
17.@component
(把普通pojo實例化到spring容器中,相當于配置文件中的 <bean id="" class=""/>)
例如可以放在@ConfigurationProperties上面使用
泛指各種組件,就是說當我們的類不屬于各種歸類的時候(不屬于@Controller、@Services等的時候),我們就可以使用@Component來標注這個類。
18.SpringBootTest
Spring Boot單元測試
可以在測試期間很方便的類似編碼一樣進行自動注入等
19.RunWith(SpringRunner.class)
單元測試用SpringRunner驅動器來跑
20.Test
放在方法上面可以不經過main方法對該方法進行測試
21、@PropertySource&@ImportResource&@Bean
@PropertySource
因為@ConfigurationProperties默認是從全局配置文件中獲取值,但若是將所以文件都配置到全局配置文件就太大了,但若是想要將無關的東西提取出來怎么辦呢?
@PropertySource可以用來讀取指定的配置文件或加載指定的配置文件;
“classpath:”類路徑下的意思
配置文件就是后綴名為“properties”和“yml”的
@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
//@Validated
public class Person {
?
//lastName必須是郵箱格式
// @Email
//@Value("${person.last-name}")
private String lastName;
//@Value("#{11*2}")
private Integer age;
//@Value("true")
private Boolean boss;
?
}
@ImportResource:
導入Spring的配置文件,讓配置文件里面的內容生效;
Spring Boot里面沒有Spring的配置文件,我們自己編寫的配置文件,也不能自動識別;
想讓Spring的配置文件生效,加載進來;@ImportResource標注在一個配置類上
@ImportResource(locations = {"classpath:beans.xml"})
導入Spring的配置文件讓其生效
22.@Configuration
指明當前類是一個配置類;就是來替代之前的的Spring配置文件
在配置文件中用<bean><bean/>標簽添加組件
23.@Bean
將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名
SpringBoot推薦給容器中添加組件的方式;推薦使用全注解的方式
1、配置類@Configuration------>Spring配置文件
2、使用@Bean給容器中添加組件
@Configuration
public class MyAppConfig {
?
//將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名
@Bean
public HelloService helloService02(){
System.out.println("配置類@Bean給容器中添加組件了...");
return new HelloService();
}
}
24.@Autowired
往容器中注入服務;在new對象跟自動注入對象同時使用時會空指針;
25.@Configuration
是告訴 Spring Boot 需要加載這個配置類。
26.@EnableSwagger2
是啟用 Swagger2,如果沒加的話自然而然也就看不到后面的驗證效果了。
27.@Api
:
可設置對控制器的描述。
@Api 主要屬性
注解屬性 | 類型 | 描述 |
---|---|---|
tags | String[] | 控制器標簽。 |
description | String | 控制器描述(該字段被申明為過期)。 |
28.@ApiOperatio
可設置對接口的描述。
@ApiOperation 主要屬性
注解屬性 | 類型 | 描述 |
---|---|---|
value | String | 接口說明。 |
notes | String | 接口發布說明。 |
tags | Stirng[] | 標簽。 |
response | Class<?> | 接口返回類型。 |
httpMethod | String | 接口請求方式。 |
29.@ApiIgnore
:
Swagger 文檔不會顯示擁有該注解的接口。
30.@ApiImplicitParams`:
用于描述接口的非對象參數集。
31.@ApiImplicitParam
:
用于描述接口的非對象參數,一般與 @ApiImplicitParams
組合使用。
@ApiImplicitParam 主要屬性
注解屬性 | 描述 |
---|---|
paramType | 查詢參數類型,實際上就是參數放在那里。取值: path:以地址的形式提交數據,根據 id 查詢用戶的接口就是這種形式傳參。query:Query string 的方式傳參。header:以流的形式提交。form:以 Form 表單的形式提交。 |
dataType | 參數的數據類型。取值: LongString |
name | 參數名字。 |
value | 參數意義的描述。 |
required | 是否必填。取值: true:必填參數。false:非必填參數。 |
Model 相關注解
32.@ApiModel
: 可設置接口相關實體的描述。
33.@ApiModelProperty
: 可設置實體屬性的相關描述。
@ApiModelProperty 主要屬性
注解屬性 | 類型 | 描述 |
---|---|---|
value | String | 字段說明。 |
name | String | 重寫字段名稱。 |
dataType | Stirng | 重寫字段類型。 |
required | boolean | 是否必填。 |
example | Stirng | 舉例說明。 |
hidden | boolean | 是否在文檔中隱藏該字段。 |
allowEmptyValue | boolean | 是否允許為空。 |
allowableValues | String | 該字段允許的值,當我們 API 的某個參數為枚舉類型時,使用這個屬性就可以清楚地告訴 API 使用者該參數所能允許傳入的值。 |
在 Docket 上增加篩選。Docket 類提供了 apis()
和 paths()
兩 個方法來幫助我們在不同級別上過濾接口:
apis()`:這種方式我們可以通過指定包名的方式,讓 Swagger 只去某些包下面掃描。
paths()`:這種方式可以通過篩選 API 的 url 來進行過濾。
在集成 Swagger2 的章節中我們這兩個方法指定的都是掃描所有,沒有指定任何過濾條件。如果我們在我們修改之前定義的 Docket 對象的 apis()
方法和 paths()
方法為下面的內容,那么接口文檔將只會展示 /user/add 和 /user/find/{id} 兩個接口。
使用 Docket 配置接口篩選
.apis(RequestHandlerSelectors.basePackage("cn.itweknow.sbswagger.controller"))
.paths(Predicates.or(PathSelectors.ant("/user/add"),
PathSelectors.ant("/user/find/*")))
經過篩選過后的 Swagger 文檔界面
自定義響應消息
Swagger 允許我們通過 Docket 的 globalResponseMessage()
方法全局覆蓋 HTTP 方法的響應消息,但是首先我們得通過 Docket 的 useDefaultResponseMessages
方法告訴 Swagger 不使用默認的 HTTP 響應消息,假設我們現在需要覆蓋所有 GET 方法的 500 和 403 錯誤的響應消息,我們只需要在 SwaggerConfig.java 類中的 Docket Bean 下添加如下內容:
自定義響應消息
.useDefaultResponseMessages(false)
.globalResponseMessage(RequestMethod.GET, newArrayList(
new ResponseMessageBuilder()
.code(500)
.message("服務器發生異常")
.responseModel(new ModelRef("Error"))
.build(),
new ResponseMessageBuilder()
.code(403)
.message("資源不可用")
.build()
));
添加如上面的代碼后,如下圖所示,您會發現在 SwaggerUI 頁面展示的所有 GET 類型請求的 403 以及 500 錯誤的響應消息都變成了我們自定義的內容。
自定義響應消息
34.Hibernate Validator常用注解
注解 | 釋義 |
---|---|
@Null | 必須為null |
@NotNull | 不能為null |
@AssertTrue | 必須為true |
@AssertFalse | 必須為false |
@Min(value,message=) | 必須為數字,其值大于或等于指定的最小值 |
@Max(value,message=) | 必須為數字,其值小于或等于指定的最大值 |
@DecimalMin(value,message=) | 必須為數字,其值大于或等于指定的最小值 |
@DecimalMax(value,message=) | 必須為數字,其值小于或等于指定的最大值 |
@Size(max, min,message=) | 集合的長度 |
@Digits(integer, fraction,message=) | 必須為數字,其值必須再可接受的范圍內 |
@Past | 必須是過去的日期 |
@Future | 必須是將來的日期 |
@Pattern(value,message=) | 必須符合正則表達式 |
必須是郵箱格式 | |
@Length(min=, max=,message=) | 長度范圍 |
@NotEmpty | 不能為null,長度大于0 |
@Range(min=, max=,message=) | 元素的大小范圍 |
@NotBlank | 不能為null,字符串長度大于0(限字符串) |
@URL(protocol=, host=, port=, regexp=, flags=,message=) | 被注釋的字符串必須是一個有效的url |
@CreditCardNumber | 被注釋的字符串必須通過Luhn校驗算法,銀行卡,信用卡等號碼一般都用Luhn 計算合法性 |
@ScriptAssert (lang=, script=, alias=,message=) 要有Java Scripting API 即JSR 223 (“Scripting for the JavaTM Platform”)的實現 | |
@SafeHtml(whitelistType=,additionalTags=,message=) | classpath中要有jsoup包 |
message="錯誤提示"
主要區分下@NotNull @NotEmpty @NotBlank 3個注解的區別:
@NotNull 任何對象的value不能為null
@NotEmpty 集合對象的元素不為0,即集合不為空,也可以用于字符串不為null
@NotBlank 只能用于字符串不為null,并且字符串trim()以后length要大于0
注意必須先進行為null判斷,否則其他注解有的不會生效。 比如username加了@Length而不加@NotNull注解,當沒有輸入username,那么@Length判斷將不會生效,判斷為null的有@NotNull、@NotEmpty以及@NotBlank
public class User {
@NotBlank(message = "名稱不能為空")
private String name;
?
@Range(min = 1, max = 120, message = "年齡必須為1-120歲")
private Integer age;
?
@NotBlank(message = "描述不能為空")
private String description;
?
@NotNull
@Length(min = 6, max = 18, message = "用戶名長度必須為6-18位")
private String username;
?
@NotNull
@Length(min = 6, max = 18, message = "密碼長度必須為6-18位")
private String password;
?
/** get、set方法 */
?
}
@Valid用在參數上,表示對該參數進行校驗。 如果對參數校驗發現有誤,會將錯誤注入到BindingResult中 我們這里將錯誤進行打印,也可以直接拋出異常
接口入參 需要添加 @Valid
注解,才會對入參進行參數校驗。
@RestController
public class UserController {
?
@GetMapping("/insert")
@ResponseBody
public User insertUser(@Valid User user, BindingResult result) {
if (result.hasErrors()) {
for (ObjectError error : result.getAllErrors()) {
System.err.println(error.getDefaultMessage());
}
}
return user;
}
?
}
35.配置文件占位符
1、隨機數
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
2、占位符獲取之前配置的值,如果沒有可以是用“:”指定默認值
person.last-name=張三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
#如果沒有找到person.hello,則返回默認值hello
person.dog.name=${person.hello:hello}_dog
person.dog.age=15
36.@EnableAuthorizationServer
開啟認證服務,在創建登錄授權接口/類時可以用
37.**@EnableGlobalMethodSecurity
Spring Security默認是禁用注解的,要想開啟注解,需要在繼承WebSecurityConfigurerAdapter的類上加@EnableGlobalMethodSecurity注解,來判斷用戶對某個控制層的方法是否具有訪問權限
1、@EnableGlobalMethodSecurity(securedEnabled=true) 開啟@Secured 注解過濾權限
2、@EnableGlobalMethodSecurity(jsr250Enabled=true)
開啟@RolesAllowed 注解過濾權限
3、@EnableGlobalMethodSecurity(prePostEnabled=true) 使用表達式時間方法級別的安全性 4個注解可用
@PreAuthorize 在方法調用之前,基于表達式的計算結果來限制對方法的訪問
@PostAuthorize 允許方法調用,但是如果表達式計算結果為false,將拋出一個安全性異常
@PostFilter 允許方法調用,但必須按照表達式來過濾方法的結果
@PreFilter 允許方法調用,但必須在進入方法之前過濾輸入值
38.@EnableWebSecurity
1:加載了WebSecurityConfiguration配置類, 配置安全認證策略。
2: 加載了AuthenticationConfiguration, 配置了認證信息。
39.@PathVariable
獲取參數。
40.自動配置中使用的條件化注解
@ConditionalOnBean:配置了某個特定Bean
@ConditionalOnMissingBean:沒有配置特定的Bean
@ConditionalOnClass:Classpath里有指定的類
@ConditionalOnMissingClass:Classpath里缺少指定的類
@ConditionalOnExpression:給定的Spring Expression Language(SpEL)表達式計算結果為 true @ConditionalOnJava:Java的版本匹配特定值或者一個范圍值
@ConditionalOnJndi:參數中給定的JNDI位置必須存在一個,如果沒有給參數,則要有JNDI InitialContext @ConditionalOnProperty:指定的配置屬性要有一個明確的值
@ConditionalOnResource:Classpath里有指定的資源
@ConditionalOnWebApplication:這是一個Web應用程序
@ConditionalOnNotWebApplication:這不是一個Web應用程序