欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring 常用注解

程序员文章站 2022-07-08 14:22:47
...
1.组件类注解

@Component:标识了一个受Spring管理的组件,泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注;
@Respository: 标识持久层,数据访问组件,即DAO组件;
@Service: 标识业务层组件;
@Controller :标识控制层组件;

注意点:

1)被注解的java类当做Bean实例,Bean实例的名称默认是Bean类的首字母小写,其他部分不变。
2)尽量使用对应组件注解的类替换@Component注解。
3)指定了某些类可作为Spring Bean类使用后,还需要让spring搜索指定路径,在Spring配置文件加入如下配置: 
<!-- 自动扫描指定包及其子包下的所有Bean类 -->
<context:component-scan base-package="com.spring.exam"/>
或者使用@ComponentScan(basePackages = "com.spring.exam")注解。
1-1. @Controller 和 @RestController的区别

       @RestController注解相当于@ResponseBody@Controller

      1) 使用@RestController注解,则Controller中的方法无法返回jsp/html页面,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容;

      2) 使用@Controller,配合视图解析器InternalResourceViewResolver可以返回到指定页面; 如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

2.自动装配注解:@Autowired vs @Resource

@Autowired 注解是按照类型(byType)装配依赖对象,默认情况下,它要求依赖对象必须存在,如果允许为null,则设置他的required属性值为false;如果想通过byName来装配,可以结合@Qualifier注解来一起使用。

@Resource 注解默认按照byName自动注入,也可以按照byType来装配;如果没有指定name属性,当注解写在字段上时,默认取字段名进行查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

    注意点:
    1)@Resource和@Autowired都是做bean的注入时使用,都可以写在类的属性上,或者是setter方法上;
    2)@Autowired是Spring的注解,属于Spring 的org.springframework.beans.factory.annotation包下;
    3)@Resource是javax.annotation注解;
3.事务注解:@Transactional

@Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。

     注意点:
     1) @Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,
     但方法没有事务功能;

     2) 虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,
     但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。

     3)默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法
     并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。   
3-1 @Transactional常用参数
  • readOnly :该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。
  • rollbackFor :该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。
指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)

指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
  • rollbackForClassName :该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:
指定单一异常类名称:@Transactional(rollbackForClassName="RuntimeException")

指定多个异常类名称:@Transactional(rollbackForClassName={"RuntimeException","Exception"})
  • noRollbackFor:该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。
  • noRollbackForClassName:该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。
  • propagation:该属性用于设置事务的传播行为。
//如果有事务, 那么加入事务, 没有的话新建一个(默认情况)
@Transactional(propagation=Propagation.REQUIRED)
//容器不为这个方法开启事务
@Transactional(propagation=Propagation.NOT_SUPPORTED)
//不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.REQUIRES_NEW) 
//必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.MANDATORY)
//必须在一个没有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.NEVER)
//如果其他bean调用这个方法,在其他bean中声明事务, 那就用事务.如果其他bean没有声明事务,那就不用事务.
@Transactional(propagation=Propagation.SUPPORTS)
  • isolation:该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置。
//默认值,表示使用底层数据库的默认隔离级别,
//MYSQL: 默认为REPEATABLE_READ级别,SQLSERVER: 默认为READ_COMMITTED
@Transactional(isolation = Isolation.ISOLATION_DEFAULT)
//表示一个事务可以读取另一个事务修改但还没有提交的数据(会出现脏读, 不可重复读,幻读),基本不使用
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
//表示一个事务只能读取另一个事务已经提交的数据,可以防止脏读(会出现不可重复读和幻读),推荐使用
@Transactional(isolation = Isolation.READ_COMMITTED)
//表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同,可以防止脏读和不可重复读(会出现幻读)
@Transactional(isolation = Isolation.REPEATABLE_READ)
//串行化,所有的事务依次逐个执行,可以防止脏读、不可重复读以及幻读,但严重影响程序性能,通常不使用
@Transactional(isolation = Isolation.SERIALIZABLE):
  • timeout :该属性用于设置事务的超时秒数,默认值为-1表示永不超时。
3-2 spring事务回滚规则

      用 spring 事务管理器,由spring来负责数据库的打开,提交,回滚。默认配置下,spring只有在抛出的异常为运行时(unchecked)异常时才回滚该事务,包括RuntimeException的子类(如Errors也会导致事务回滚);而抛出checked异常则不会导致事务回滚。
      当然,我们也可以明确的配置在抛出哪些异常时回滚事务,包括checked异常。也可以明确定义哪些异常抛出时不回滚事务。使用rollbackFor、notRollbackFor等属性。

4.springmvc web注解

@RequestMapping :是用来处理请求地址映射的注解,可用于类或方法上。用在类上,表示类中所有的响应的方法都是以该地址作为父路径来访问,用在方法上表示该方法的访问的路径;两者结合起来的访问的路径为完整的访问某个方法的路径。

常用属性:

value:指定请求的实际的地址,指定的地址可以是URI Template模式;
method:指定访问的方法;
consumes:指定处理请求的内容类型,比如aplication/json;text/html;
produces:指定返回的内容的类型;
params:指定request中必须包含某些参数值时,才让该方法处理请求;

@RequestParam :将请求的参数绑定到方法中的参数上,有required参数,默认为true,表示该参数必须要传。

@PathVariable : 用来获得请求url中的动态参数的。
@RequestBody : 将方法参数绑定到HTTP请求Body上(方法参数->java类)。

    注意点:
    1)@RequestBody接收的是一个Json对象的字符串
    2)使用时机:POST或者PUT的数据是JSON格式或者XML格式,而不是普通的键值对形式

@ResponseBody: 将返回类型直接输入到HTTP response body中。 常用在输出JSON格式的数据时。
@RequestBody,@ResponseBody 详解可见:https://www.jianshu.com/p/7097fea8ce3f

@ModelAttribute:两种用法

  • 运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用;
  • 运用在方法上,会在Controller每个方法执行之前都执行,如果有返回值,则自动将该返回值加入到ModelMap中;
    @ModelAttribute 详解可见:https://blog.csdn.net/lovesomnus/article/details/78873089