@SpringBootApplication
我们可以看到@SpringBootApplication 中包含@SpringBootConfiguration 、@EnableAutoConfiguration 、@ComponentScan 通常用在主类上。
我们可以把@SpringBootApplication 看作是@Configuration 、@EnableAutoConfiguration 、@ComponentScan 注解的集合。@SpringBootApplication 。
这是 Spring Boot 最最最核心的注解,用在 Spring Boot 主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。
注解 | 说明 |
---|
@SpringBootApplication | Sprnig Boot项目的核心注解,目的是开启自动配置 | @Configuration | 用来代替 applicationContext.xml 配置文件,所有这个配置文件里面能做到的事情都可以通过这个注解所在类来进行注册 | @SpringBootConfiguration | 这个注解就是 @Configuration 注解的变体,只是用来修饰是 SpringBoot 配置而已,或者可利于 SpringBoot 后续的扩展。 | @EnableAutoConfiguration | 允许 Spring Boot 自动配置注解,开启这个注解之后,Spring Boot 就能根据当前类路径下的包或者类来配置 Spring Bean。 | @ComponentScan | 用来代替配置文件中的 component-scan 配置,开启组件扫描,即自动扫描包路径下的 @Component 注解进行注册 bean 实例到 context 中 |
SpringBean相关
@Component
@Component 是Spring中的一个注解,它的作用就是实现bean的注入。与@Component 注解功能上相同的还有@Service 、@Controller 、@Repository 。
注解 | 说明 |
---|
@Component | 通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注 | @Service | 业务层(server)注入,主要涉及一些复杂的逻辑,需要用到 Dao 层 | @Controller | 控制层(controller)注入,对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。 | @Repository | 持久层(dao)注入,主要用于数据库相关操作 |
@Autowired
自动导入对象到类中,被注入进的类同样要被 Spring 容器管理比如:Service 类注入到 Controller 类中。
@Service
public class UserService {
......
}
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
......
}
@Autowired、@Qualifier和@Resource
与@Autowired 功能相似的还有@Qualifier ,@Resource 这三个注解都是基于自动装配,@Autowired 使用的较多,而@Qualifier 需要配合@Autowired 进行使用,@Resource 则是通过名字进行自动装配
注解 | 说明 |
---|
@Autowired | 会根据属性的类型(by type )找到对应的 Bean 进行注入 | @Qualifier | 按名字注入 一般当出现两个及以上bean时,不知道要注入哪个,结合@AutoWired使用 | @Resource | 默认按名称注入例如@Resource(name = “GQL”)则根据name属性注入找不到则报错,若无name属性则根据属性名称注入,如果匹配不成功则按照类型匹配,再匹配不成功则报错。 |
具体的代码实现请看另一篇文章:
@RestController
@RestController 注解是@Controller 和@ResponseBody 的合集,表示这是个控制器 bean,并且是将函数的返回值直 接填入 HTTP 响应体中。
在传统的 Spring MVC 的应用中关于单独使用单独使用 @Controller 不加 @ResponseBody 的话一般使用在要返回一个视图。
@Controller +@ResponseBody 返回 JSON 或 XML 形式数据
@Controller 和 @RestController的对比
@Controller 返回一个页面
单独使用@Controller 不加@ResponseBody 的话一般使用在要返回一个视图的情况,这种情况属于比较传统的Spring MVC 的应用,对应于前后端不分离的情况
@RestController 返回JSON 或 XML 形式数据
但@RestController 只返回对象,对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中,这种情况属于 RESTful Web服务,这也是目前日常开发所接触的最常用的情况(前后端分离)。
如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使用@Controller 并结合@ResponseBody 注解,也就是说@Controller +@ResponseBody =@RestController (Spring 4 之后新加的注解)。 此处仅作简单介绍,具体内容请参考@RestController vs @Controller
@Scope
声明 Spring Bean 的作用域,使用方法:
@Bean
@Scope("singleton")
public Person personSingleton() {
return new Person();
}
四种常见的 Spring Bean 的作用域:
- singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
- prototype : 每次请求都会创建一个新的 bean 实例。
- request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
- session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
@Configuration
一般用来声明配置类,可以使用@Component 注解替代,不过使用Configuration注解声明配置类更加语义化。
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
@Configuration和@Bean对比
@Configuration 作用于类上面,表明这是一个配置类,而@Bean 产生一个Bean对象加入Spring 容器中
一般来说,这俩个注解会在一起使用
注解 | 说明 |
---|
@Configuration | 作用于类上表示这是一个配置类,可理解为xml配置文件里面的< beans>标签 | @Bean | 产生bean对象加入容器,作用于方法,可理解为xml配置文件里面的标签 |
处理常见的 HTTP 请求类型
5 种常见的请求类型:
- GET :请求从服务器获取特定资源。举个例子:GET /users(获取所有学生)
- POST :在服务器上创建一个新的资源。举个例子:POST /users(创建学生)
- PUT :更新服务器上的资源(客户端提供更新后的整个资源)。举个例子:PUT /users/12(更新编号为 12 的学生)
- DELETE :从服务器删除特定的资源。举个例子:DELETE /users/12(删除编号为 12 的学生)
- PATCH :更新服务器上的资源(客户端提供更改的属性,可以看做作是部分更新),使用的比较少,这里就不举例子了。
GET 请求
@GetMapping("users") 等价于@RequestMapping(value="/users",method=RequestMethod.GET)
@GetMapping("/users")
public ResponseEntity<List<User>> getAllUsers() {
return userRepository.findAll();
}
POST 请求
@PostMapping("users") 等价于@RequestMapping(value="/users",method=RequestMethod.POST)
@PostMapping("/users")
public ResponseEntity<User> createUser(@Valid @RequestBody UserCreateRequest userCreateRequest) {
return userRespository.save(user);
}
PUT 请求
@PutMapping("/users/{userId}") 等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)
@PutMapping("/users/{userId}")
public ResponseEntity<User> updateUser(@PathVariable(value = "userId") Long userId, @Valid @RequestBody UserUpdateRequest userUpdateRequest) {
......
}
DELETE 请求
@DeleteMapping("/users/{userId}") 等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)
@DeleteMapping("/users/{userId}")
public ResponseEntity deleteUser(@PathVariable(value = "userId") Long userId){
......
}
@RequestMapping、@GetMapping、@PostMapping对比
上面提到了五种请求类型,在使用的过程中,他们都可以等价于一种RequestMapping 。只不过RequestMapping 可以发起get请求或者post,而GetMapping 和PostMapping 只能发起get、post的请求。
这3个注解功能也是差不多的,通过注解来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,用在方法上,可以通过配置的url进行访问。
注解 | 说明 |
---|
RequestMapping | @RequestMapping(url),通过该注解就可以通过配置的url进行访问,方式是get或post请求 | GetMapping | @GetMapping(url) ,功能类似的,限定Get请求 | PostMapping | @PostMapping(url),功能类似的,限定Post请求 |
|