Spring Boot 注解总结(ing...)
1. @SpringBootApplication
这个注解是Spring Boot最核心的注解,用在 Spring Boot的主类(启动类)上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。
实际上这个注解是@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解的组合。
由于这些注解一般都是一起使用,所以Spring Boot提供了一个统一的注解@SpringBootApplication。
@SpringBootApplication(exclude =ClassName.class)
2. @ComponentScan
@ComponentScan(basePackages = {"com.a.process","org.jeecg"})
指定Spring扫描注解的package,启动类使用。如果没有指定包,那么默认会扫描此配置类所在的package。
3.@MapperScan
@MapperScan("com.a.process.mapper")
通过使用@MapperScan可以指定要扫描的Mapper类的包的路径,启动类使用。
接口类上添加@Mapper,在编译之后会生成相应的接口实现类,这种方式要求每一个mapper类都需要添加此注解,比较麻烦。
4.@EnableAsync
使用@EnableAsync来开启异步的支持,使用多线程,启动类使用。
@Async
使用@Async就可以定义一个线程任务,来对某个方法进行异步执行。
5.@log4j和@slf4j
log4j( log for java )
Apache的一个开源项目,可以灵活地记录日志信息,我们可以通过Log4j的配置文件灵活配置日志的记录格式、记录级别、输出格式,而不需要修改已有的日志记录代码。slf4j:simple log facade for java
slf4j不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。可以将log4j看成是一个完整的日志库,而slf4j是一个日志库的规范接口。
6.@EnableScheduling
开启定时任务,启动类使用。
编写定时任务
任务的类上写@Component,将当前的任务类注入到容器。
任务方法上写@Scheduled(),参数为fixedDelay、fixedRate、cron表达式。
fixedDelay和fixedRate,单位是毫秒,它们的区别就是:fixedRate就是每多少时间执行一次,不论你业务执行花费了多少时间。而fixedDelay是当任务执行完毕后隔多少时间再执行。根据实际业务不同,选择不同的方式。
cron表达式:比如要设置每天什么时候执行,就可以用它,有专门的语法,不再详细描述。
7.@Controller
通常是被使用服务于web 页面的。默认,你的controller方法返回的是一个string 串,是表示要展示哪个模板页面或者是要跳转到哪里去。return时会被视图处理器识别成静态文件的路径,默认为templates文件夹下。如return "test/hello"表示的是默认路径下的test文件夹中的名叫hello的文件,带上后缀名.html或btl等也可以识别。
8.@ResponseBody
@ResponseBody可以标注方法也可以标注类,当标注方法时表示该方法的返回值会被解析成json(字符串会不会被转换),直接写入HTTP Response Body中,视图处理器将不会将return的参数识别成路径。当它标注类时,类中所有方法的返回值都将直接返回值到页面,相当于给所有的类都加上@ResponseBody注解。
9.@RestController
@RestController是@Controller和@ResponseBody的结合体,只能注解类,return返回的值将被转换成json,字符串除外,直接写入HTTP相应体返回到页面中。
10.@RequestMapping
它可以注解类也可以注解方法,注解类时标注请求的路径,标注方法时表示将特定的URL映射到指定的方法。可以用(value="url")的写法,支持URL模板,正则表达式;也可以直接用("url")。
8种属性
(1)value属性
由于value属性是@RequestMapping注释的默认属性,因此如果只有唯一的属性,则可以省略该属性名,如果有超过一个属性,则必须写上value属性名称。即如下两个标注含义一样:
@RequestMapping(value="getUser")
@RequestMapping("getUser")
(2)path属性
和(1)中的value属性使用一致,两者都是用来作为映射使用的。path属性支持通配符匹配。@RequestMapping(value="getUser")、@RequestMapping(path="getUser"),这两种情况都能对getUser()方法进行访问
(3)name属性
相当于注释,增加可读性
(4)method属性
该属性用来表示该方法仅仅处理哪些HTTP请求方式,如果没有method属性,则说明该方法支持全部的HTTP请求。
如:@RequestMapping(value = "url", method = RequestMethod.GET)
(5)params属性
该属性指定,请求中必须包含params属性规定的参数时,才能执行该请求
@RequestMapping(value = "getUser",params = "flag") @ResponseBody public ModelAndView getUser(){ ModelAndView view = new ModelAndView(); return view; }
以上方法,说明请求中必须包含flag参数才能执行该请求,flag参数值不做要求
http://localhost:8080/getUser?flag=xxx 此URL能够正常访问getUser()方法
http://localhost:8080/getUser 此URL则不能正常访问getUser()方法
@RequestMapping(value = "getUser",params = "flag=true") @ResponseBody public ModelAndView getUser(){ ModelAndView view = new ModelAndView(); return view; }
以上方法,说明请求中必须包含flag参数,而且参数值必须为true才能执行该请求
http://localhost:8080/getUser?flag=true 此URL能够正常访问getUser()方法
http://localhost:8080/getUser?flag=false 此URL不能正常访问getUser()方法
http://localhost:8080/getUser 此URL则不能正常访问getUser()方法
(6)header属性
该属性指定,请求中必须包含某些指定的header值,才能够让该方法处理请求
@RequestMapping(value = "getUser",headers = "Referer=http://www.xxx.com") @ResponseBody public ModelAndView getUser(){ ModelAndView view = new ModelAndView(); return view; }
以上方法 ,必须满足请求的header中包含了指定的"Referer"请求头和值为"http://www.xxx.com"时,才能执行该请求
(7)consumers属性
指定处理请求的提交内容类型(Content-Type),例如:application/json、text/html时,才能够让该方法处理请求
(8)roduces属性
指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中所包含的类型。
此外,produces属性还可以指定返回值的编码
@RequestMapping(value = "getUser",produces = "application/json,charset=utf-8"),则指明返回utf-8编码
现在比较典型的REST Controller 一般是像下面这样来映射路由的:
@RestController @RequestMapping("/team") public class UsersController { @GetMapping("/users") public List<User> index() {...} }
11.@GetMapping、@PostMapping、@PutMapping、@PatchMapping、@DeleteMapping
路由http method,从命名约定我们可以看到每个注释都是为了处理各自的传入请求方法类型,即@GetMapping用于处理请求方法的GET类型,@ PostMapping用于处理请求方法的POST类型等。
@GetMapping("url")等同于@RequestMapping(value = "url", method = RequestMethod.GET),大大简化了书写方法。
1.@GetMapping-->通常对应查询操作
2.@PostMapping-->通常对应新增操作
3.@PutMapping-->通常对应修改操作
4.@DeleteMapping-->通常对应删除操作
12.传统的controller和REST风格的controller
传统的controller,这类型的controller返回值表示要展示的页面或要跳转到哪个请求。
@Controller @RequestMapping("/users") public class UsersController { @GetMapping public String index() { return "users/index"; } @GetMapping("{id}") public String show(@PathVariable long id) { return "users/show"; }
@PostMapping @ResponseStatus(HttpStatus.CREATED) public String create(@ModelAttribute UserCreateRequest request) {
return "redirect:/users"; }
@PutMapping("{id}") public String update(@PathVariable long id, @RequestBody UserUpdateRequest request) { return "redirect:/users/" + id; }
@DeleteMapping("{id}") public String delete(@PathVariable long id) { return "redirect:/users"; } }
REST controller,这类型的controller返回值是一些对象,这些对象要被序列化成JSON、XML等其他格式,并不是表示要跳转到哪个HTML模板。
@RestController @RequestMapping("/users") public class UsersController { @GetMapping public List<User> index() {
return new ArrayList<User>(); } @GetMapping("{id}") public User show(@PathVariable long id) {
return new User(); } @PostMapping @ResponseStatus(HttpStatus.CREATED) public User create(@RequestBody UserCreateRequest request) {
return new User(); } @PutMapping("{id}") public User update(@PathVariable long id, @RequestBody UserUpdateRequest request) {
return new User(); } @DeleteMapping("{id}") public void delete(@PathVariable long id) {} }
13.@Resource和@Autowired
共同点
@Resource和@Autowired都可以作为注入属性的修饰,在接口仅有单一实现类时,两个注解的修饰效果相同,可以互相替换,不影响使用。
不同点
@Resource是Java自己的注解,@Resource有两个属性是比较重要的,分是name和type;Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Autowired是spring的注解,是spring2.5版本引入的,Autowired只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来修饰。
14.@Transactional
是声明式事务管理编程中使用的注解,数据库事务的存在是为了保证“多个数据库操作”的“原子性”。
事务的引入,举个最简单的银行汇款业务的场景,A向B汇款1000元。这个汇款动作主要有两个,①是A的银行账户上扣去1000元,②是B的银行账户上增加两千元。假如操作①成功了,而操作②失败了,这样A的账户上就白白少了1000元,而B的账户上却没有增加1000。所以我们需要用技术来保证操作①和操作②整体的原子性(即让操作①和②要么同时成功,要么同时失败),数据库的事务就是为此而生的。
在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两种方式。
编程式事务管理: 使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
声明式事务管理: 建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
15.@Data
@Data注解在类上时,简化java代码编写。
1、可以为类提供读写功能,从而不用写get、set方法。
2、他还会为类提供 equals()、hashCode()、toString() 方法。
16.@TableName
@TableName是mybatis-plus中的注解,主要是实现实体类型和数据库中的表实现映射。
参数说明:

17.@TableId
主键使用,比如数据中的表中的字段是id,但是实体类是userId,就需要在userId上打上这个注解。
参数说明:

18.@TableField
非主键字段使用,比如数据中的表中的字段是name,但是实体类是userName,就需要在userName上打上这个注解。
参数说明:
exist 表示是否为是数据库字段;
select 表示是否查询该字段;
fill 表示是否自动填充{
DEFAULT --默认不处理
INSERT --插入时填充字段(第一次添加的时候)
INSERT_UPDATE --插入和更新时填充字段(最近一次更新的时候,也就是插入和更新都满足)
UPDATE --更新时填充字段
}

19.@JsonFormat和DateTimeFormat
常用写法为@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")和@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")。
pattern:需要转换的时间日期的格式,timezone:时间设置为东八区,避免时间在转换中有误差。
@JsonFormat主要是后台到前台的时间格式的转换,@DataFormAT主要是前后到后台的时间格式的转换。
20.@Dict(dicCode = " ")
数据字典,dicCode对应字典表中的记录,自动转换value为相应信息
21.@Value
两种写法@Value("#{}")与@Value("${}")
-
@Value(“#{}”) 表示SpEl表达式通常用来获取bean的属性,或者调用bean的某个方法。当然还有可以表示常量
-
用 @Value(“${xxxx}”)注解从配置文件读取值的用法
不通过配置文件的注入属性的情况
通过@Value将外部的值动态注入到Bean中,使用的情况有:
- 注入普通字符串
- 注入操作系统属性
- 注入表达式结果
- 注入其他Bean属性:注入beanInject对象的属性another
- 注入文件资源
- 注入URL资源
通过配置文件的注入属性的情况
通过@Value将外部配置文件的值动态注入到Bean中。配置文件主要有两类:
application.properties或application.yml。application.properties在spring boot启动时默认加载此文件
自定义属性文件。自定义属性文件通过@PropertySource加载。@PropertySource可以同时加载多个文件,也可以加载单个文件。如果相同第一个属性文件和第二属性文件存在相同key,则最后一个属性文件里的key启作用。加载文件的路径也可以配置变量,如下文的${anotherfile.configinject},此值定义在第一个属性文件config.properties
22.
23.
参考:
| @Controller | https://cloud.tencent.com/developer/article/1082720 |
|
@RequestMapping |
https://blog.csdn.net/lzb348110175/article/details/88552507 |
| @Transactional | https://blog.csdn.net/weixin_39644377/article/details/111282075 |
|
@TableName |
https://blog.csdn.net/qq_36963950/article/details/117338631 |
| @TableId,@TableField | https://blog.csdn.net/weixin_42526068/article/details/113039510 |
| @Resource,@Autowired | https://www.zhihu.com/question/39356740 |

浙公网安备 33010602011771号