spring 常用注解
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