Springboot笔记<10>常用注解总结

Springboot常用注解总结

• 项目配置注解

1、@SpringBootApplication 注解

@SpringBootApplication是一个复合注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解。

这三个注解的作用分别为:

  • @SpringBootConfiguration:标注当前类是配置类,这个注解继承自@Configuration。并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。
  • @EnableAutoConfiguration:是自动配置的注解。
  • @ComponentScan:扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。

2、@Configuration:一般声明配置类,使用@Component或者@Configuration

3、@Bean:Bean对象注册Spring IOC容器与使用bean对象是整个Spring框架的重点,其中@Bean就是一个将方法作为Spring Bean对象注册的一种方式。

4、@Scope:****声明Spring Bean**的作用域@Scope("singleton")

Spring Bean的5种作用域:

  • singleton 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值。
  • prototype 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()。
  • request 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring WebApplicationContext环境。
  • session 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web的Spring WebApplicationContext环境。
  • application 限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的Spring WebApplicationContext环境。

• controller 层注解

1、****@Controller 表明这个类是一个控制器类,和@RequestMapping来配合使用拦截请求,如果不在method中注明请求的方式,默认是拦截get和post请求。这样请求会完成后转向一个视图解析器。因为前后端会做分离,所以请求后端只关注数据处理,后端返回json数据的话,需要配合@ResponseBody注解来完成。

@RestController 是@Controller 和@ResponseBody的结合,一个类被加上@RestController 注解,数据接口中就不再需要添加@ResponseBody。更加简洁。同样的情况,@RequestMapping(value="",method= RequestMethod.GET ),我们都需要明确请求方式。这样的写法又会显得比较繁琐,于是乎就有了如下的几个注解。

@RequestMapping(value=“”,method = RequestMethod.GET) @GetMapping(value =“”)
@RequestMapping(value=“”,method = RequestMethod.POST) @PostMapping(value =“”)
@RequestMapping(value=“”,method = RequestMethod.PUT) @PutMapping(value =“”)
@RequestMapping(value=“”,method = RequestMethod.DELETE) @DeleteMapping(value =“”)

2、@CrossOrigin: **@CrossOrigin(origins = "", maxAge = 1000) 这个注解主要是为了解决跨域访问的问题。这个注解可以为整个controller配置启用跨域,也可以在方法级别启用。

3、@Autowired: spring的自动装配,这个个注解可以用到构造器,变量域,方法,注解类型上。当我们需要从bean 工厂中获取一个bean时,Spring会自动为我们装配该bean中标记为@Autowired的元素。

4、@Resource:****@Resource和@Autowired一样都可以用来装配bean,都可以标注字段上,或者方法上。 @resource注解不是spring提供的,是属于J2EE规范的注解。@Resource默认按照名称方式进行bean匹配,@Autowired默认按照类型方式进行bean匹配。**

**5、@EnablCaching:****@EnableCaching: 这个注解是spring framework中的注解驱动的缓存管理功能。自spring版本3.1起加入了该注解。其作用相当于spring配置文件中的cache manager标签。

前后端传值@ParhVariable和@RequestParam

params:指定request中必须包含某些参数值是,才让该方法处理。

@RequestMapping(value = "testParamsAndHeaders", params = { "username","age!=10"})
public String testParamsAndHeaders() {
	System.out.println(``"testParamsAndHeaders");
	return "SUCCESS";
}

params 只是判断url 或者 form data 中的参数是否复合params的定义,并不会直接绑定数据到方法的参数中!

@PathVariable:路径变量注解。绑定路径中的占位符参数到方法参数变量中;只能绑定路径中的占位符参数,且路径中必须有参数。

无论是 GET 或者POST 只要 URL中有参数即可!

【注意】如果URL中无参数,将会出错;如果URL有参数,但是没有使用@PathVariabl该注解,那么URL的参数不会默认与方法参数绑定!方法里的参数会默认绑定表单里面对应的参数!

@RequestParam: 该注解相关属性如下:

  • value:参数key,可以不写,默认为"";
  • name:和value作用一样;
  • required:默认值为true,可以不写;
  • 获取URL或者 form data 中的参数

【注意】GET中的参数形式为:username=tom&age=11&sex=boy;POST中的参数形式为:以键值对形式保存在form data

@RequestBody: 用于读取Request请求的body部分,且Content-Type为application/json格式数据,接收到数据后会自动将数据绑定在Java对象上,系统会使用HttpMessageConverter来讲请求的body中的json字符串转换为Java对象

@RequestMapping("/getUserById/{name}")
public User getUser(@PathVariable("name") String userName){
    return userService.selectUser(userName);
}
@GetMapping("/users/{userId}/teachers")
public List<Teacher> getUserRelatedTeachers(@PathVariable("userId") Long userId,@RequestParam(value = "type",required = false) String type){
...
}

• servcie层注解

1、@Service:这个注解用来标记业务层的组件,我们会将业务逻辑处理的类都会加上这个注解交给spring容器。事务的切面也会配置在这一层。

• DAO层注解

1、@Repository:@Repository注解类作为DAO对象,管理操作数据库的对象。

总得来看,@Component, @Service, @Controller, @Repository是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理@Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能。通过这些注解的分层管理,就能将请求处理,义务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。所以我们在正常开发中,如果能用@Service, @Controller, @Repository其中一个标注这个类的定位的时候,就不要用@Component来标注。

• 配置文件注解

dog: keji
my-profile:
  name: xiaoming
  email: 11111@163.com

library:
  location: hubei
  books:
    - name: honglou
      description: honglou
    - name: sanguo
      description: sanguo

@Value:首先是使用@Value("${property}")读取简单的配置信息

@Value("${dog}")
String dog;

@ConfigurationProperties: 我们同样可以通过@ConfigurationProperties读取配置信息并与bean绑定

@Component
@ConfigurationProperties(prefix = "library")
class LibraryProperties{
    @NotEmpty
    private String location;
    private List<Book> books;
    @Data
    @ToString
    static class Book{
        String name;
        String description;
    }
}

• 异常处理注解

@ControllerAdvice :实现全局异常处理,只需要定义类。

使用这个 Controller ,可实现三个方面的功能,因为这是SpringMVC提供的功能,所以可以在springboot中直接使用:

  • 全局异常处理 (@ExceptionHandler)
  • 属性编辑器 (@InitBinder)
  • 全局数据 (@ModelAttribute)

@ExceptionHandler:针对哪一种异常进行处理

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ModelAndView customException(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("message",e.getMessage());
        mv.setViewName("error");
        return mv;
    }
}

在该类中可以定义多个异常处理方法,不同方法处理不同的异常,例如空指针、数据越界、非法参数异常等;@ExceptionHandler 注解用来指明异常的处理类型,即如果这里指定为 NullpointerException,则数组越界异常就不会进到这个方法中来。

@ModelAttribute: 全局数据
全局数据绑定功能可以用来做一些初始化的数据操作,可以将一些公共数据定义在添加了 @ControllerAdvice 注解的类中,从而在每一个 Controller 的接口中,就都能够访问导致这些数据,定义如下:

@ControllerAdvice
public class GlobalExceptionHandler1{
    @ModelAttribute(name = "keji")
    public Map<String,Object> data(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("age", 18);
        map.put("sex", "男");
        return map;
    }
}

使用 @ModelAttribute 注解标记该方法的返回数据是一个全局数据,默认情况下全局数据的 key 就是返回的变量名,value 就是方法返回值,开发者可以通过 @ModelAttribute 注解的 name 属性去重新指定 key

• 事务注解

数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。springboot中只需要在方法上加上@Transactional注解,该方法即可成为一个事务。

posted @ 2022-01-06 10:45  aixueforever  阅读(200)  评论(0编辑  收藏  举报