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应用程序