前言
最近在使用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 | 通过@PathVariable,例如/users/1 |
@Valid
参数校验,在model里面设置每个参数的校验方法,例如@NotNull,@NotBlank,之后在controller中的方法参数上添加@Valid注解,就可以对请求参数进行校验,并将校验结果返回在一个BindingResult实例中,所以参数后一定要紧跟BindingResult!
@ModelAttribute
1.在方法上使用
标注在方法上的@ModelAttribute说明方法是用于添加一个或多个属性到model上。在同一个控制器中,注解了@ModelAttribute 的方法实际上会在@RequestMapping 方法之前被调用。通常被用来填充一些公共需要的属性或数据。
2.在方法参数上使用
标注在方法参数上的@ModelAttribute说明了该方法参数的值将由model中取得。在SpringMvc中称为数据绑定。例如:
1 | @RequestMapping("/login",method = RequestMethod.POST) |
可直接把参数自动与user实例的字段进行绑定。
@ExceptionHandler
用来定义函数针对的异常类型。如果@ExceptionHandler方法是在控制器内部定义的,那么它会接收并处理由控制器(或其任何子类)中的@RequestMapping方法抛出的异常。
如果将@ExceptionHandler方法定义在@ControllerAdvice类中,那么它会处理相关控制器中抛出的异常。例如:
1 | @ExceptionHandler(value = CustomException.class)``` |
@Autowired
private UserDAO userDAO;
1 | 意思是让spring自动向userDAO中注入一个UserDAO的实例。 |
@Autowired
private IUserDAO userDAO;
1 | 其中IUserDAO为接口,而UserDAO为实现类。 |
@Component
@ConfigurationProperties(prefix=”mail”)
public class ConnectionSettings {
private String username;
…..
}
1 | 2.也可以使用@EnableConfigurationProperties与@Configuration,但是不推荐。 |
@Bean
@ConfigurationProperties(prefix = “mail”)
public Mail mail(){
return new Mail();
}
//当需要的时候使用Autowired进行注入
1 | 这里有一个开发时发现的问题。在某个工具类中使用@Autowired注入获取对象时,发现无法其属性值总为null,查了许多资料,发现是spring在实例化Bean时,先通过反射调用构造方法生成一个基本对象,然后再填充属性。填充属性之前属性值都为默认值,引用类为null,构造方法中使用属性对象时属性对象还未被设置,所以为null。 |
//需要将该类定义为组件,添加到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后觉得需要理解这些注解。写完文章后发现要理解一个框架比使用一个框架难得多,接下来就是不断在开发中寻找问题与解决办法,总结经验。