一、Spring Web MVC注解
1.1 @RequestMapping
@RequestMapping注解的主要用途是将Web请求与请求处理类中的方法进行映射。SpringMVC通过RequestMappingHandlerMapping和RequestMappingHandlerAdapter两个类来提供对@RequestMapping注解的支持。
@RequestMapping注解对请求处理类中的处理方法进行标注:@RequestMapping注解拥有以下六个配置的特性:
- value:映射的请求URL或其他别名
- method:兼容HTTP的方法名
- params:根据HTTP参数的存在、缺省或值,对请求进行处理
- header:根据HTTP Header的存在、缺省或值,对请求进行过滤
- consume:设定在HTTP请求正文中允许使用的媒体类型
- product:在HTTP响应体中允许使用的媒体类型
注意:
在使用@RequestMapping之前,要对请求处理的类使用@Controller或@RestController注解。
@RestController
public class TestController {
@RequestMapping(value = "/demo/test", method = RequestMethod.POST)
public String test() {
return "/test";
}
}
@RestController
@RequestMapping(value = "/demo")
public class TestController {
@RequestMapping(value = "/test", method = RequestMethod.POST)
public String test() {
return "/test";
}
}
1.2@RequestBody
@RequestBody在处理请求方法的参数列表中使用,它可以将请求参数绑定到一个对象中,请求主体参数是通过 HttpMessageConverter传递的,根据请求主体中的参数名与对象的属性名进行匹配并绑定值。此外,还可以通过@Valid注解对请求主体中的参数进行校验。
@RestController
@RequestMapping(value = "/order")
public class TestController {
@Autowired
private OrderService orderService;
@PostMapping("/create")
public OrderDTO createOrder(@Valid @RequestBody OrderDTO orderDTO){
return orderService.create(orderDTO);
}
}
1.3 @GetMapping
@GetMapping注解用于处理HTTP GET请求,并将请求映射到具体的处理方法中。具体的说,@GetMapping是一个组合注解,它相当于是@RequestMapping(method=RequestMethod.GET)
@GetMapping的使用示例:
@RestController
@RequestMapping(value = "/order")
public class TestController {
@Autowired
private OrderService orderService;
@GetMapping("/find/{id}")
public OrderDTO findOneById(@PathVariable(name = "id") String id){
return orderService.findOne(id);
}
}
1.4 @PutMapping
@PutMapping注解用于处理HTTP PUT请求,并将请求映射到具体的处理方法中。具体的说,@PutMapping是一个组合注解,它相当于是@RequestMapping(method=RequestMethod.PUT)
@PutMapping的使用示例:
@RestController
@RequestMapping(value = "/order")
public class TestController {
@Autowired
private OrderService orderService;
@PutMapping("/paid/{id}")
public OrderDTO paid(@PathVariable(name = "id") String id){
OrderDTO orderDTO = orderService.findOne(id);
return orderService.paid(orderDTO);
}
}
1.5 @PostMapping
@PostMapping注解用于处理HTTP POST请求,并将请求映射到具体的处理方法中。具体的说,@PostMapping是一个组合注解,它相当于是@RequestMapping(method=RequestMethod.POST)
@PostMapping的使用示例:
@RestController
@RequestMapping(value = "/order")
public class TestController {
@Autowired
private OrderService orderService;
@PostMapping("/orders")
public OrderDTO cancelOrder(@Valid @RequestBody OrderDTO orderDTO){
return orderService.cancel(orderDTO);
}
}
1.6 @DeleteMapping
@DeleteMapping注解用于处理HTTP DELETE请求,并将请求映射到具体的处理方法中。具体的说,@DeleteMapping是一个组合注解,它相当于是@RequestMapping(method=RequestMethod.DELETE)
@DeleteMapping的使用示例:
@RestController
@RequestMapping(value = "/order")
public class TestController {
@Autowired
private OrderService orderService;
@DeleteMapping("/cancel/{id}")
public OrderDTO cancelOrder(@PathVariable(name = "id") String id){
OrderDTO orderDTO = orderService.findOne(id);
return orderService.cancel(orderDTO);
}
}
1.7 @PatchMapping
@PatchMapping注解用于处理HTTP PATCH请求,并将请求映射到具体的处理方法中。具体的说,@PatchMapping是一个组合注解,它相当于是@RequestMapping(method=RequestMethod.PATCH)
@PatchMapping的使用示例:
@RestController
@RequestMapping(value = "/order")
public class TestController {
@PatchMapping("/orders/patch")
public ResponseEntity<Object> patch(){
return new ResponseEntity<>("Patch method response message", HttpStatus.OK);
}
}
1.8 @ResponseBody
@ResponseBody会将Controller层中的方法返回值写入到HTTP响应中。@ResponseBody只能用在@Controller注解标记的类中。如果在被@RestController注解标记的类中,则不需要@ResponseBody注解进行标注。@RestController相当于是@Controller和@ResponseBody的组合注解。
@ResponseBody的使用示例:
@Controller
@RequestMapping(value = "/order")
public class TestController {
@Autowired
private OrderService orderService;
@ResponseBody
@PutMapping("/orders/{id}")
public OrderDTO findById(@PathVariable(name = "id") String id){
return orderService.findOne(id);
}
}
1.9 @PathVariable
@PathVariable注解是将方法中的参数绑定到请求URI的模板变量上。可以通过@RequestMapping注解来指定URI的模板变量,然后使用@PathVariable注解将方法中的参数绑定到模板上,@PathVariable注解允许我们使用value或name属性给参数取一个别名。
@PathVariable的使用示例:
@Controller
@RequestMapping(value = "/order")
public class TestController {
@Autowired
private OrderService orderService;
@ResponseBody
@PutMapping("/orders/{id}")
public OrderDTO findById(@PathVariable(name = "id") String id){
return orderService.findOne(id);
}
}
模板变量名需要使用“{ }”进行包裹,如果方法的参数名与URI模板变量名一致,则在@PathVariable中就可以省略别名的定义。
简单示例:
@Controller
@RequestMapping(value = "/order")
public class TestController {
@Autowired
private OrderService orderService;
@ResponseBody
@PutMapping("/orders/{id}")
public OrderDTO findById(@PathVariable String id){
return orderService.findOne(id);
}
}
提示:如果参数是一个非必须的,可选的项,则可以在@PathVariable中设置require = false,默认是true
1.10@RequestParam
@RequestParam注解用于将方法的参数与web请求的传递的参数进行绑定。使用@RequestParam可以轻松获取HTTP请求参数的值。
@RequestParam的使用示例:
@Controller
@RequestMapping(value = "/order")
public class TestController {
@Autowired
private OrderService orderService;
@ResponseBody
@PutMapping("/orders/{id}")
public OrderDTO findById(@RequestParam(name = "id") String id ){
return orderService.findOne(id);
}
}
@RequestParam注解的其他属性配置与@PathVariable的配置相同,特别的是,如果传递的参数为空,还可以通过defaultValue设置一个默认值。
示例代码如下:
@Controller
@RequestMapping(value = "/order")
public class TestController {
@Autowired
private OrderService orderService;
@ResponseBody
@GetMapping
public OrderDTO findById(@RequestParam(name = "id", defaultValue = "1") String id ){
return orderService.findOne(id);
}
}
1.11 @Controller
@Controller是@Component注解的一个延伸,Spring会自动扫描并配置被该注解标注的类。此注解用于标注Spring MVC的控制器。
@Controller的使用示例:
@Controller
@RequestMapping(value = "/order")
public class TestController {
@Autowired
private OrderService orderService;
@ResponseBody
@PutMapping("/orders/{id}")
public OrderDTO findById(@RequestParam(name = "id", defaultValue = "1") String id ){
return orderService.findOne(id);
}
}
1.12 @RestController
@RestController是再Spring 4.0开始引入的,这是一个特定的控制器注解。此注解是一个组合注解相当于,@Controller和@ResponseBody的快捷方式,当使用此注解时,不需要在方法上使用@ResponseBody注解。
@RestController的使用示例:
在这里插入代码片
@RestController
@RequestMapping(value = "/order")
public class TestController {
@Autowired
private OrderService orderService;
@PutMapping("/orders/{id}")
public OrderDTO findById(@RequestParam(name = "id", defaultValue = "1") String id ){
return orderService.findOne(id);
}
}
2、Spring Bean注解
2.1 @ComponentScan
@ComponentScan用于配置Spring需要扫描的被组件注解注释的类所在的包,可以通过配置其basePackages属性或者value属性来配置需要扫描的包路径。value属性是basePackages的别名。
@ComponentScan的使用示例:
@Configuration
@ComponentScan(basePackages = "com.henya.config")
public class TestConfig {
// ...
}
2.2 @Component
@Component注解用于标注一个普通的组件类,它没有明确的业务范围,只是告知Spring被此注解标注的类需要被纳入到Spring Bean容器中进行管理。
@Component的使用示例:
@Component
public class TestConfig {
public void testComponent(){
// ...
}
}
2.3 @Service
@Service注解是@Component的一个延伸(特例),它用于标注业务逻辑类。与@Component注解一样,被此注解标注的类,会自动被Spring所管理。
@Service的使用示例:
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductInfoDao productInfoDao;
@Override
public ProductInfo findOne(String productId) {
return productInfoDao.findOne(productId);
}
}
2.4 @Repository
@Repository注解是@Component注解的延伸,与@Component注解一样,被此注解标注的类会被Spring容器管理起来,@Repository注解用于标注DAO层的数据持久化类。
@Repository的使用示例:
@Repository
public interface TestRepository extends JpaRepository<OrderDTO, String> {
// ...
}
3、容器配置注解
3.1@Autowired
@Autowired注解用于标记Spring将要解析和注入的依赖项。此注解可以作用在构造函数,字段和Setter方法上。
作用在构造函数示例:
@RestController
public class TestController {
private OrderService orderService;
@Autowired
TestController(OrderService orderService){
this.orderService = orderService;
}
}
作用在字段示例:
@RestController
@RequestMapping(value = "/order")
public class TestController {
@Autowired
private OrderService orderService;
@PutMapping("/orders/{id}")
public OrderDTO findById(@RequestParam(name = "id", defaultValue = "1") String id ){
return orderService.findOne(id);
}
}
作用在Setter方法上示例:
@RestController
public class TestController {
private OrderService orderService;
@Autowired
public void setOrderService(OrderService orderService){
this.orderService = orderService;
}
}
3.2 @Primary
当系统中需要配置多个具有相同类型的Bean时,@Primary可以定义这些Bean的优先级。
@Primary的使用示例:
public interface MessageService {
String sendMessage();
}
@Primary
@Component
public class EmailMessageImpl implements MessageService {
@Override
public String sendMessage() {
return "this is send email method message";
}
}
@Component
public class DingDingMessageImpl implements MessageService {
@Override
public String sendMessage() {
return "this is send dingding method message";
}
}
@Component
public class WeChatMessageImpl implements MessageService {
@Override
public String sendMessage() {
return "this is send wechat method message";
}
}
@RestController
public class MessageController {
@Autowired
private MessageService messageService;
@GetMapping("/info")
public String info(){
return messageService.sendMessage();
}
}
输出结果为this is send email method message
,说明EmailMessageImpl 的优先级较高。
四、Spring Boot注解
4.1@SpringBootApplication
@SpringBootApplication是一个快捷的配置注解,被他标注的类中,可以定义一个或多个Bean,并自动触发自动配置Bean和自动扫描组件。此注解相当于是@Configuration、@EnableAutoConfiguration和@ComponentScan的组合。SpringBoot主程序类中,就是用来此注解。
@SpringBootApplication的使用示例:
@SpringBootApplication
public class SellApplication {
public static void main(String[] args) {
SpringApplication.run(SellApplication.class, args);
}
}
4.2 @EnableAutoConfiguration
@EnableAutoConfiguration注解用于告知Spring,根据当前类路径下引入的依赖包,自动配置与这些依赖包相关的配置项。
4.3 @ConditionalOnClass与@ConditionalOnMissingClass
这两个注解属于类条件注解,它们根据是否存在某个类作为判断依据来决定是否要执行某些配置。
简单使用示例:
@Configuration
@ConditionalOnClass(OrderDTO.class)
public class MessageController {
// ...
}
4.4 @ConditionalOnBean与@ConditionalOnMissingBean
这两个注解属于对象条件注解,根据是否存在某个对象作为依据来决定是否要执行某些配置方法。
简单使用示例:
@Bean
@ConditionalOnBean
LocalContainerEntityManagerFactoryBean entityManagerFactory(){
// ...
}
@Bean
@ConditionalOnMissingBean
public LocalContainerEntityManagerFactoryBean myBean(){
// ...
}
4.5 @ConditionalOnProperty
@ConditionalOnProperty注解会根据Spring配置文件中的配置项是否满足配置要求,从而决定是否要执行被标注的方法。
4.6 @ConditionalOnResource
@ConditionalOnResource注解是当某个配置文件存在时,则执行被其标注的方法。
4.7 @ConditionalOnWebApplication与@ConditionalOnNotWebApplication
这两个注解用于判断当前应用程序是否是Web应用程序。如果是Web应用程序,则使用Spring WebApplicationContext,并定义其会话的生命周期。