Zer0e's Blog

Springboot常用注解

字数统计: 1.2k阅读时长: 4 min
2020/02/10 Share

前言

最近在使用springboot进行开发,也学习了不少spring的知识,记录一下spring中常用的注解,方便自己学习与查找。

正文

@Bean

bean是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象。
该注解主要定义在@Configuration或者@Component注解的类里,声明该方法的返回值是一个bean。

@Component

定义一个最普通的组件(spring管理bean),注入到spring容器中进行管理。

@Repository

是@Component的拓展,被这个注解的类表示为DAO层实现。

@Service

是@Component的拓展,被这个注解的类表示为Service层实现。

@Controller

被这个注解的类表示为Web层实现。通常用于控制web逻辑。

@RestController

Spring 4后加入的新注解,为@Controller 与 @ResponseBody的结合。在其注解的控制器中可直接在页面中返回数据。

@ControllerAdvice,@RestControllerAdvice

控制类增强,通常做全局处理。

@RequestMapping

最常用到的注解之一,会将HTTP请求映射到控制器中。

@RequestParam

用于获取请求中的参数。

@PathVariable

与@RequestParam类似,只不过一个在参数部分,另一个在URL路径部分。例如:

1
2
通过@PathVariable,例如/users/1
通过@RequestParam,例如/users?userid=1

@Valid

参数校验,在model里面设置每个参数的校验方法,例如@NotNull,@NotBlank,之后在controller中的方法参数上添加@Valid注解,就可以对请求参数进行校验,并将校验结果返回在一个BindingResult实例中,所以参数后一定要紧跟BindingResult!

@ModelAttribute

1.在方法上使用

标注在方法上的@ModelAttribute说明方法是用于添加一个或多个属性到model上。在同一个控制器中,注解了@ModelAttribute 的方法实际上会在@RequestMapping 方法之前被调用。通常被用来填充一些公共需要的属性或数据。

2.在方法参数上使用

标注在方法参数上的@ModelAttribute说明了该方法参数的值将由model中取得。在SpringMvc中称为数据绑定。例如:

1
2
@RequestMapping("/login",method = RequestMethod.POST)
public ReturnMsg login(@ModelAttribute User user, HttpServletResponse response)

可直接把参数自动与user实例的字段进行绑定。

@ExceptionHandler

用来定义函数针对的异常类型。如果@ExceptionHandler方法是在控制器内部定义的,那么它会接收并处理由控制器(或其任何子类)中的@RequestMapping方法抛出的异常。
如果将@ExceptionHandler方法定义在@ControllerAdvice类中,那么它会处理相关控制器中抛出的异常。例如:

1
2
3
4
5
@ExceptionHandler(value = CustomException.class)```
则是处理CustomException异常,对其他异常不处理。

## @Autowired
自动装配注解,例如:

@Autowired
private UserDAO userDAO;

1
2
意思是让spring自动向userDAO中注入一个UserDAO的实例。
Spring IoC容器扫描到@Autowired注解会去查询其实现类,写法为:

@Autowired
private IUserDAO userDAO;

1
2
3
4
5
6
7
8
其中IUserDAO为接口,而UserDAO为实现类。

## @Configuration
标注在类上,相当于把这个类作为spring的配置类。

## @ConfigurationProperties
将部分参数配置在application.properties 或 application.yml 文件中,通过这个注解,可以获取到这些值。
1.可以与@Component一起使用,使该类被Component Scan扫描到,并激活。

@Component
@ConfigurationProperties(prefix=”mail”)
public class ConnectionSettings {
private String username;
…..
}

1
2
2.也可以使用@EnableConfigurationProperties与@Configuration,但是不推荐。
3.第三种则是使用@Bean方式在标有@Configuration的类进行注入,这种方式通常可以用在对第三方类进行配置属性注册。

@Bean
@ConfigurationProperties(prefix = “mail”)
public Mail mail(){
return new Mail();
}
//当需要的时候使用Autowired进行注入

1
2
这里有一个开发时发现的问题。在某个工具类中使用@Autowired注入获取对象时,发现无法其属性值总为null,查了许多资料,发现是spring在实例化Bean时,先通过反射调用构造方法生成一个基本对象,然后再填充属性。填充属性之前属性值都为默认值,引用类为null,构造方法中使用属性对象时属性对象还未被设置,所以为null。
这里需要在这个工具类的构造器中将Bean作为参数显式地传入,

//需要将该类定义为组件,添加到spring容器后spring才会自动注入实例(此时可以不使用@Autowired)
@Component
public class OneUtil {

private A a;

// 构造器中将Bean作为参数显式的传入,spring装配时自动将实例的值传给该组件,可以有效避免NPE问题;
public OneUtil(A a){
    this.a = a;
}

```

@MapperScan

可以指定要扫描的Mapper类的包的路径,不用在每个Mapper类上注解@Mapper。

小结

这篇查了许多资料,在用spring写了个demo后觉得需要理解这些注解。写完文章后发现要理解一个框架比使用一个框架难得多,接下来就是不断在开发中寻找问题与解决办法,总结经验。

CATALOG
  1. 1. 前言
  2. 2. 正文
    1. 2.1. @Bean
    2. 2.2. @Component
    3. 2.3. @Repository
    4. 2.4. @Service
    5. 2.5. @Controller
    6. 2.6. @RestController
    7. 2.7. @ControllerAdvice,@RestControllerAdvice
    8. 2.8. @RequestMapping
    9. 2.9. @RequestParam
    10. 2.10. @PathVariable
    11. 2.11. @Valid
    12. 2.12. @ModelAttribute
      1. 2.12.1. 1.在方法上使用
      2. 2.12.2. 2.在方法参数上使用
    13. 2.13. @ExceptionHandler
    14. 2.14. @MapperScan
  3. 3. 小结