记录 Spring Boot 中使用的常用注解
简单记录 pmsys 使用到的 ,也有没有使用到的
@SpringBootApplication
主类的注解。相当于(@Configuration
,@EnableAutoConfiguration
, @ComponentScan
)及他们的默认属性
PS: 通常建议您将主应用类放在其它类之上的根包中,
@EnableAutoConfiguration
注解通常放在主类上,它隐式定义了某些项目的 包搜索的基准起点。
根据 SpringBoot 官网,这三个注解的作用分别是:
@EnableAutoConfiguration
:启用 SpringBoot 的自动配置机制@ComponentScan
: 扫描被(@Component
、@Service
、@Repository
、@Controller
等)注解的 bean,注解默认会扫描该类所在的包下所有的类。@Configuration
:允许在 Spring 上下文中注册额外的 bean 或导入其他配置类
@Component 与 @Configuration
都可以声明配置类,但 @Configuration
更加语义化。
从定义来看,@Configuration
注解本质上还是 @Component
。
-
@Component
:泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component
来标注这个类。 -
@Configuration
:用于定义配置类,被注解的类内部包含有一个或多个被@Bean
注解的方法,等价于spring的xml配置文件中的<bean>
,作用为:注册bean对象。PS: bean 方法会被 AnnotationConfigApplicationContext 或 AnnotationConfigWebApplicationContext 类进行扫描,并用于构建 bean 定义,初始化 Spring 容器
@Repository , @Service , @Controller
传统 MVC 必备三个注解,分别是:
-
@Repository
: 对应持久层即 Dao 层,主要用于数据库相关操作。 -
@Service
: 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。实现接口的形式,为了区别还是取名
@Service("appraiseService") public class AppraiseServiceImpl implements AppraiseService {}
-
@Controller
: 对应控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。
@RestController
在前后端分离的项目中控制层使用 @RestController
注解,该注解是是 @Controller 和
@ResponseBody
的合集。
@RestController
只返回对象,对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中,这种情况属于 RESTful Web服务。
如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使用
@Controller
并结合@ResponseBody
注解
依赖注入 @Autowired 与 @Resource
用于依赖注入,不过 @Autowired
只按照 byType 注入,是 Spring 的;@Resource
默认按 byName 自动注入,也提供按照 byType 注入,是 JDK 的;
被注入进的类同样要被 Spring 容器管理比如:Service 类注入到 Controller 类中。
PS: 现在装配是用构造注入,非必须用 Set 注入。不再是直接标注在字段上。
注意,构造注入允许字段被修饰为
final
,这表示以后它不能被更改
五大请求 GET、POST、PUT、DELETE、PATCH
-
GET :请求从服务器获取特定资源。举个例子:
GET /users
(获取所有学生)@GetMapping("users")
等价于@RequestMapping(value="/users",method=RequestMethod.GET)
-
POST :在服务器上创建一个新的资源。举个例子:
POST /users
(创建学生)@PostMapping("users")
等价于@RequestMapping(value="/users",method=RequestMethod.POST)
-
PUT :更新服务器上的资源(客户端提供更新后的整个资源)。举个例子:
PUT /users/12
(更新编号为 12 的学生)@PutMapping("/users/{userId}")
等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)
-
DELETE :从服务器删除特定的资源。举个例子:
DELETE /users/12
(删除编号为 12 的学生)@DeleteMapping("/users/{userId}")
等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)
-
PATCH :更新服务器上的资源(客户端提供更改的属性,可以看做作是部分更新),使用的比较少,这里就不举例子了。
@PatchMapping("/profile")
等价于@RequestMapping(value = "/profile", method = RequestMethod.PATCH)
地址栏取值 @PathVariable 和 @RequestParam
@PathVariable
用于获取路径参数,如上的 userId ,就是用@PathVariable
取。
@RequestParam
用于获取查询参数, 取地址栏问号 ?
后的值。
@RequestBody
用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且 Content-Type 为 application/json
格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。系统会使用 HttpMessageConverter
或者自定义的 HttpMessageConverter
将请求的 body
中的 json
字符串转换为 java 对象。
读取配置信息 @Value 及两个没用过
常用就是 @Value
直接读取信息,举个例子:
@Value("${fastdfs.nginx.host}")
private String nginxHost;
配置文件中是:
fastdfs.nginx.host=http://192.168.1.10/
还有两个 @ConfigurationProperties
和 @PropertySource
,学习 10 分钟搞定 SpringBoot 如何优雅读取配置文件?
事务 @Transactional 摘自 JavaGuide
在要开启事务的方法上使用@Transactional
注解即可!
@Transactional(rollbackFor = Exception.class)
public void save() {
......
}
我们知道 Exception 分为运行时异常 RuntimeException 和非运行时异常。在@Transactional
注解中如果不配置rollbackFor
属性,那么事物只会在遇到RuntimeException
的时候才会回滚,加上rollbackFor=Exception.class
,可以让事物在遇到非运行时异常时也回滚。
@Transactional
注解一般用在可以作用在类
或者方法
上。
- 作用于类:当把
@Transactional 注解放在类上时,表示所有该类的
public 方法都配置相同的事务属性信息。 - 作用于方法:当类配置了
@Transactional
,方法也配置了@Transactional
,方法的事务会覆盖类的事务配置信息。
更多关于关于 Spring 事务的内容请查看:
json 数据处理
-
过滤 json 数据
@JsonIgnoreProperties
以及@JsonIgnore
-
格式化 json 数据
@JsonFormat
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "Asia/Shanghai")
- 扁平化对象
@JsonUnwrapped
定时任务 @Scheduled 和 @EnableScheduling
@Scheduled
标记要调度的方法的注解。必须指定 cron
,fixedDelay
或 fixedRate
属性之一。该注解共有8个参数,以下对这个8个参数进行记录
PS : 主类中要加
@EnableScheduling
表示开启对定时任务的支持
-
cron
: 该参数为cron表达式,从左到右: [秒] [分] [小时] [日] [月] [周]@Scheduled(cron = "0/30 * * * * ?") 表示 30 秒执行一次
-
zone
: 时区,cron表达式
会基于该时区解析。默认是一个空字符串,即取服务器所在地的时区。比如我们一般使用的时区Asia/Shanghai
。该字段我们一般留空。 -
fixedDelay
: 从上次调用结束到下一次调用之间的固定时间(以毫秒为单位)
@Scheduled(fixedDelay = 5000) *//上次调用结束后5秒再执行*
fixedDelayString
: 与fixedDelay
意思相同,只是使用字符串的形式。唯一不同的是支持占位符
@Scheduled(fixedDelayString = "5000") //占位符的使用(配置文件中有配置:time.fixedDelay=5000): @Scheduled(fixedDelayString = "${time.fixedDelay}")
fixedRate
: 两次调用之间固定的毫秒数,fixedRateString
: 与fixedRate
意思相同,只是使用字符串的形式。唯一不同的是支持占位符。initialDelay
: 第一次执行fixedRate
或者fixedDelay
任务之前要延迟的毫秒数initialDelayString
: 与initialDelay
意思相同,只是使用字符串的形式。唯一不同的是支持占位符。