SpringBoot常用标记注解(不全)

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 文档界面
img

自定义响应消息

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 错误的响应消息都变成了我们自定义的内容。

自定义响应消息
img

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=) 必须符合正则表达式
@Email 必须是邮箱格式
@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应用程序

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345