Spring常用注解总结,持续更新Ing…
@Component
@Component作用:实现bean的注入
@Component三个衍生注解:为了更好的进行分层,Spring可以使用其它三个注解,功能一样,目前使用哪一个功能都一样。写上这些注解,就相当于将这个类交给Spring管理装配了。
- @Controller:web层
- @Service:service层
- @Repository:dao层
@Controller
@Controller的作用:声明该类是Controller层的Bean,将该类声明进入Spring容器中进行管理。
@ResponseBody
@ResponseBody的作用:表明该类的所有方法的返回值都直接进行提交而不经过视图解析器,且返回值的数据自动封装为json的数据格式。
@RestController
@RestController的作用相当于@Controller加@ResponseBody共同作用的结果,支持Restful风格的数据提交方式。
@RequestMapping
@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
方法级别的注解变体有如下几个:
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@Autowired
Bean自动装配注解
- @Autowired
- @Qualifier
- @Resource
@Autowired是一种注解,可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作,@Autowired可以标注在对象属性上和set方法上,当标注在属性上的时候,属性上对应的set方法可以省略不写,spring会在IOC容器中按照属性类型寻找如找到一个则进行注入,如找到多个或没找到会报错。
使用 @Autowired 可以不用编写set方法了,前提:自动装配的属性在IOC(Spring)容器中存在,且符合名字byName
@Qualifier
@Qualifier,在使用Spring框架中@Autowired标签时默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。
@Configuration
@Configuration注解的作用:声明一个类为配置类,用于取代bean.xml配置文件注册bean对象,可以在这个类中管理创建Bean。
@Configuration注解主要标注在某个类上,相当于xml配置文件中的<beans>
@Bean注解主要标注在某个方法上,相当于xml配置文件中的<bean>
@Bean
@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。 产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。
@Bean和@Component的区别
注解作用:
- @Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。
- @Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。
两者对比:
-
相同点:
- 两者的结果都是为spring容器注册Bean。
-
不同点:
-
@Component 通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中。
-
@Bean 注解通常是我们在标有该注解的方法中定义产生这个bean的逻辑。
-
理解:
@Component (@Controller @Service @Respository)作用于类上,只有在我们的SpringBoot应用程序启用了组件扫描并且包含了被注解的类时才有效。通过组件扫描,Spring将扫描整个类路径,并将所有@Component注释类添加到Spring Context,这里有的不足就是会把整个类当成bean注册到spring 容器上,如果这个类中并不是所有方法都需要注册为bean的话,会出现不需要的方法都注册成为bean,这时候必须确保这些不需要的方法也能注册为bean或者在扫描中加filter 过滤这些不需要的bean,否者spring将无法成功启动。
@Bean相对来说就更加灵活了,它可以独立加在方法上,按需注册到spring容器,而且如果你要用到第三方类库里面某个方法的时候,你就只能用@Bean把这个方法注册到spring容器,因为用@Component你需要配置组件扫描到这个第三方类路径而且还要在别人源代码加上这个注解,很明显是不现实的。
@Scope
@RequestBody
@RequestBody作用:RequestBody的作用是将前端传来的json格式的数据转为自己定义好的javabean对象,需要注意的是传入数据的属性名称要和后端javabean中定义的一致。
@WebFilter
@WebFilter作用:@WebFilter 用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。
@ControllerAdvice
@ControllerAdvice作用:在Spring里,我们可以使用@ControllerAdvice来声明一些全局性的东西,最常见的是结合@ExceptionHandler注解用于全局异常的处理。
@ControllerAdvice是在类上声明的注解,其用法主要有三点:
- @ExceptionHandler注解标注的方法:用于捕获Controller中抛出的不同类型的异常,从而达到异常全局处理的目的;
- @InitBinder注解标注的方法:用于请求中注册自定义参数的解析,从而达到自定义请求参数格式的目的;
- @ModelAttribute注解标注的方法:表示此方法会在执行目标Controller方法之前执行 。
@PathVariable
@PathVariable主要作用:映射URL绑定的占位符
带占位符的URL是 Spring3.0 新增的功能,URL中的 {xxx} 占位符可以通过 @PathVariable(“xxx”) 绑定到操作方法的入参中。
@TableField
@TableField作用1:MP中的默认规则,字段会自动转换为相应的驼峰,作用2:注解加到属性字段上实现MyBatisPlus的自动填充功能。
@Mapper
在使用Mybatis持久层框架来操作数据库时,我们可以使用@Mapper注解和@MapperScan注解来将Mapper接口类交给Sprinig进行管理。
@Value
通过@Value将外部配置文件的值动态注入到Bean中。配置文件主要有两类:
- application.properties。application.properties在spring boot启动时默认加载此文件自定义属性文件。
- 自定义属性文件通过@PropertySource加载。@PropertySource可以同时加载多个文件,也可以加载单个文件。如果相同第一个属性文件和第二属性文件存在相同key,则最后一个属性文件里的key启作用。加载文件的路径也可以配置变量,如下文的${anotherfile.configinject},此值定义在第一个属性文件config.properties。
@Transactional(声明式事物管理)
@Transactional是Spring中常用的注解之一,通常情况下我们在需要对一个service方法添加事务时,加上这个注解,如果发生unchecked exception,就会发生rollback。
@Transactional 实质是使用了 JDBC 的事务来进行事务控制的
@Transactional 基于 Spring 的动态代理的机制
@Transactional 实现原理:
- 事务开始时,通过AOP机制,生成一个代理connection对象,
并将其放入 DataSource 实例的某个与 DataSourceTransactionManager 相关的某处容器中。
在接下来的整个事务中,客户代码都应该使用该 connection 连接数据库,
执行所有数据库命令。
[不使用该 connection 连接数据库执行的数据库命令,在本事务回滚的时候得不到回滚]
(物理连接 connection 逻辑上新建一个会话session;
DataSource 与 TransactionManager 配置相同的数据源)- 事务结束时,回滚在第1步骤中得到的代理 connection 对象上执行的数据库命令,
然后关闭该代理 connection 对象。
(事务结束后,回滚操作不会对已执行完毕的SQL操作命令起作用)