Spring Boot 常用注解

@SpringBootApplication

@SpringBootApplication 是启动类上的注解,它组合了3个其他的注解。

  • @SpringBootConfiguration:将该类声明为配置类,这个注解实际上是@Configuration注解的特殊形式。

  • @EnableAutoConfiguration:启用Spring Boot的自动配置,这个注解会告诉SpringBoot自动配置它认为我们会用到的组件。

  • @ComponentScan:启用组件扫描。这样我们能够通过像@Component、@Controller、@Service这样的注解声明其他类,Spring会自动发现它们并将它们注册为Spring应用上下文中的组件。

@JsonFormat

时间注解 @JsonFormat 用在对象属性上,即 bean 层,或者 model 层,使其返回的时间满足指定格式,示例如下:

public class Salary {
    ...
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createDate;
    ...
}

@Transactional

注解 @Transactional 用于事务管理,常用在 service 层,使用了注解 @Transactional 的方法,如果发生 unchecked exception,就会发生 rollback 。

@Conditional

条件注解 @Conditional 是 Spring 4.0 引入的新特性

示例:

@Conditional(JdbcTemplateCondition.class)
        public MyService myService() {
            ...
        }

在这个例子里,只有当 JdbcTemplateCondition 类的条件成立时,才会创建 MyService 这个 Bean。

下表列出了 Spring Boot 提供的条件化注解。

@PathVariable

@PathVariable 是 spring3.0 的一个新功能:接收请求路径中占位符的值。

语法:

@PathVariable("xxx")
通过 @PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“) 

示例:

@GetMapping("/getUserById/{name}")
    public User getUser(@PathVariable("name") String name){
        return userService.selectUser(name);
    }

@CrossOrigin

注解 @CrossOrigin 用于跨域访问支持,@CrossOrigin 有 2 个参数:

  • origins: 允许可访问的域列表
  • maxAge:准备响应前的缓存持续的最大时间(以秒为单位)。

使用示例如下:

// 允许来自百度站点的访问
@CrossOrigin(origins = "http://baidu.com", maxAge = 3600)

// 允许来自任何站点的访问
@CrossOrigin(origins = "*")

@RequestBody 和 @ResponseBody

@ResponseBody 是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP 响应体中,一般在异步获取数据时使用(也就是AJAX),在使用 @RequestMapping 后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。

@RequestBody 是作用在形参列表上,用于将前台发送过来固定格式的数据(xml 格式或者 json等)封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。

只使用 @ResponseBody 的示例:

    @RequestMapping("/login.do")
    @ResponseBody
    public Object login(String name, String password, HttpSession session) {
        user = userService.checkLogin(name, password);
        session.setAttribute("user", user);
        return new JsonResult(user);
    }

既使用 @ResponseBody 又使用 @RequestBody 的示例:

    @RequestMapping("/login.do")
    @ResponseBody
    public Object login(@RequestBody User loginUuser, HttpSession session) {
        user = userService.checkLogin(loginUser);
        session.setAttribute("user", user);
        return new JsonResult(user);
    }

@Data

@Data 注解就是由 Lombok 提供的,它会告诉Lombok生成所有缺失的方法,同时还会生成所有以final属性作为参数的构造器。

即,@Data 在运行时动态生成 getter 和 setter 方法

通过使用 Lombok,我们能够让代码简洁明了。

@Slf4j

如果不想每次都写

private  final Logger logger = LoggerFactory.getLogger(当前类名.class); 

可以用注解@Slf4j,该注解来自于 lombok 依赖,用法如下:

@Controller
@Slf4j
@RequestMapping("/orders")
public class OrderController {

    @GetMapping("/current")
    public String orderForm(Model model){
        model.addAttribute("order", new Order());
        return "orderForm";
    }

    @PostMapping
    public String processOrder(Order order){
        // 使用 log.info() 打印日志
        log.info("Order submitted:" + order);
        return  "redirect:/";
    }
}

@NoArgsConstructor、@AllArgsContructor、@RequiredArgsConstructor

这三个注解,都来自于 Lombok 依赖,其中:

  • @NoArgsConstructor : 生成一个无参数的构造方法,如果由于存在final字段而无法编写此类构造函数,将生成错误消息。

  • @AllArgsContructor: 会生成一个包含所有参数的构造函数

  • @RequiredArgsConstructor:生成带有必需参数的构造函数,必填参数是final字段和具有约束的字段,例如@NonNull。

@Configuration

在 Java 配置中,我们用一个 java 配置去代替 Spring 中 applicationContext.xml, 这时,就需要使用注解 @Configuration:

@Configuration
public class JavaConfig{
    @Bean
    SayHello sayHello(){
        return new SayHello();  
    }
}

使用注解 @Configuration表示这个类是一个配置类,它的作用相当于 applicationContext.xml 。

然后定义方法,方法返回对象,方法上添加@Bean 注解,表示将这个方法的返回值注入到 Spring 容器中。也就是说,@Bean 对应的方法,就相当于 applicationContext.xml 中的 bean 节点。

@Service

如果希望将一个类自动注册到 Spring 容器中,那么可以给这个类添加一个注解 @Service .

和 @Service 注解功能类似的注解,一共有四个:

  • @Component
  • @Repository
  • @Service
  • @Controller

这四个中,其他三个都是基于 @Component 做出来的,源码基本一致,功能也是一致的。

为什么要区分出来,主要是为了在不同的类上面添加时方便:

  • 在 Service 层上,添加注解,使用 @Service
  • 在 Dao 层上,添加注解时,使用 @Repository
  • 在 Controller 层上,添加注解时,使用 @Controller
  • 在其他组件上添加注解时,使用 @Component

@ComponentScan

通过注解 @ComponentScan 指定要扫描的包:

@ComponentScan(basePackages = "com.example.demo")

这表示扫描 com.example.demo 下所有的 Bean。

@Autowired

注解 @Autowired 的作用是对象注入。自动扫描的对象注入有三种方式:

  • @Autowired
  • @Resources
  • @Injected

如果一个对象只有一个实例,则用 @Autowired ,如果一个对象有多个实例,则用 @Resources ,或者 @Autowired + @Qualifier 结合起来使用。

@Profile


@Profile 是条件注解,可以用于多环境切换。

如:

@Bean
@Profile("dev") // 使用开发环境
DataSource devDataSource(){
 ...
}

@RequestMapping

这个注解用来标记一个请求 URL ,如:

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello(){
        return "hello";
    }
}

这里的 @RequestMapping("/hello") 表示当请求地址为 /hello 时,这个方法会被触发。

@RequestMapping 还可以用于请求窄化(给请求添加一个前缀),示例:

@RestController
@RequestMapping("/api")
public class HelloController {

    @RequestMapping("/hello")
    public String hello(){
        return "hello";
    }
}

这个时候访问 hello ,地址就应该是:http://localhost:8080/api/hello.

@GetMapping

@GetMapping用于将 HTTP get 请求映射到特定处理程序的方法注解。具体来说,@GetMapping 是一个组合注解,是 @RequestMapping(method = RequestMethod.GET) 的缩写。

如下面两行是等价的:

@RequestMapping(method = RequestMethod.GET, value = "/hello2")
@GetMapping("/hello2")

@GetMapping 可以看作是 @RequestMapping 的一个细分,自 Spring 4.3 版本,引入了如下 5 个注解。

  • @GetMapping,
  • @PostMapping、
  • @PutMapping、
  • @DeleteMapping
  • @PatchMapping,

@RestController

注解 @RestController = @Controller + @ResponseBody,一般用在类上,表示将这个类自动注册到 Spring 容器中,并且该类下的所有方法都会返回 JSON 格式的数据。

@ResponseBody,一般是使用在单独的方法上的,需要哪个方法返回json数据格式,就在哪个方法上使用,具有针对性。

@RequestParam

当服务端的接口变量名和前端不一致时,可以使用注解 @RequestParam 来接解决,等价于 request.getParam,示例:

 @ResponseBody
    @RequestMapping("login")
    public String login(@RequestParam("name") String username,
                        @RequestParam("password") String password) {
     
   }     

这表示用 username 来接收前端传来的 name 参数。

@Param 用于 DAO 层(也就是 Mapper 层),是 mybatis 中的注解。使得 mapper.xml 中的参数与后台的参数对应上,也增强了可读性。示例:

@Mapper
@Repository
public interface UserMapper {
    @Select("SELECT * FROM user where username=#{username} and password=#{password}")
    User login(@Param("username") String username,@Param("password") String password);
}

@PropertySource

通过注解 @PropertySource 来引入相关配置,进行属性注入。

每一个参数使用 @Value("${xxx.xx}") 形式进行注入。

@Component  // 注入到 Spring 容器中
@PropertySource(value = {"classpath:book.properties"}, encoding = "UTF-8") // 自动加载 book.properties 文件
public class Book {
    @Value("${book.id}")
    private Integer id;
    @Value("${book.name}")
    private String name;
    @Value("${book.author}")
    private String author;
 ...
}

@ConfigurationProperties

@ConfigurationProperties 注解会将 Spring 容器中对应的数据注入到对象对应的属性中,就不用通过 @Value 注解挨个注入了。

@Component  // 注入到 Spring 容器中
@PropertySource(value = {"classpath:book.properties"}, encoding = "UTF-8") // 自动加载 book.properties 文件
@ConfigurationProperties(prefix = "book") // 类型安全的属性注入,不再使用 @Value注解 挨个注入
public class Book {
    private Integer id;
    private String name;
    private String author;
 ...
}

每天学习一点点,每天进步一点点。

posted @ 2020-08-13 15:13  爱吃西瓜的番茄酱  阅读(240)  评论(0编辑  收藏  举报