spring

标题springmvc常用注解

一、组件型注解:

@Component 在类定义之前添加@Component注解,他会被spring容器识别,并转为bean。
@Repository 对Dao实现类进行注解 (特殊的@Component)
@Service 用于对业务逻辑层进行注解, (特殊的@Component)
@Controller 用于控制层注解 , (特殊的@Component)
以上四种注解都是注解在类上的,被注解的类将被spring初始话为一个bean,然后统一管理。

二、请求和参数型注解:

@RequestMapping:用于处理请求地址映射,可以作用于类和方法上。
包括以下参数:
value:定义request请求的映射地址
method:定义地request址请求的方式,包括【GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE.】默认接受get请求,如果请求方式和定义的方式不一样则请求无法成功。
params:定义request请求中必须包含的参数值。
headers:定义request请求中必须包含某些指定的请求头,如:RequestMapping(value = “/something”, headers = “content-type=text/*”)说明请求中必须要包含"text/html", "text/plain"这中类型的Content-type头,才 是一个匹配的请求。
consumes:定义请求提交内容的类型。
produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
2.@RequestParam:用于获取传入参数的值
value:参数的名称
required:定义该传入参数是否必须,默认为true,(和@RequestMapping的params属性有点类似)
3.@PathViriable:用于定义路径参数值
value:参数的名称
required:定义传入参数是否为必须值
4.@ResponseBody:作用于方法上,可以将整个返回结果以某种格式返回,如json或xml格式。
5.@ModelAttribute:用于把参数保存到model中,可以注解方法或参数,注解在方法上的时候,该方法将在处理器方法执行之前执行,然后把返回的对象存放在 session(前提时要有@SessionAttributes注解) 或模型属性中,@ModelAttribute(“attributeName”) 在标记方法的时候指定,若未指定,则使用返回类型的类名称(首字母小写)作为属性名称。 
6.@SessionAttributes
  默认情况下Spring MVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。如果要跨页面使用。那么需要使用到session。而@SessionAttributes注解就可以使得模型中的数据存储一份到session域中。配合@ModelAttribute(“user”)使用的时候,会将对应的名称的model值存到session中
转载出处,详情连接

spring事务的四大特性

事务的概念:
事务一般是指数据库事务,是指作为一个程序执行单元执行的一系列操作,要么完全执行,要么完全不执行。事务就是判断以结果为导向的标准。
(1)原子性(atomicity)
原子性就是一个不可分割的工作单位。简单地说,就是在日常工作中,老板交给你做一件事情,然后你做到半路做不动了或者说做到最后没做完,那么这个老板就会认为你什么都没有做,做一半的东西不算数,因为老板提前告诉你他只看结果,所以最终没有看到结果,不算是做了。通俗的说就是要么全部完成,要么全部没完成回到起始的地方。
(2)一致性(consistency)
一致性就是事务必须是使一个一致性状态变成另一个一致性状态。比如说我们写一个电商项目,一个用户买商品下单的时候一般都是两步,一步就是选择商品下单,第二步就是把商品在数据库中扣除库存,如果我们买了十件商品,那么数据库中扣除了不是十件商品,或者三件或者四件或者别的,那么这就不满足一致性。
(3)隔离性(isolation)
隔离性就是一个事物的执行不能被另一个事务干扰。还是说我们的电商,一个用户下单之后在减库存的过程中,另一个用户也下单了,他也要减库存,在这个用户还没有减的时候,另一个用户给减掉了,那么库存没有了,这就是事务被另一个事务干扰了。
(4)持久性(durability)
持久性就是一个事务一旦被提交,它对数据库中数据的改变就应该是永久性的。就是说我们在执行一个sql语句之后还没有被提交,这是系统宕机了,那么数据并没有被保存下来,但是当我们把数据提交之后,存在了文件中,这时不管怎么样我们的数据都不会遭到破坏。
转载出处,详情连接

事务的传播特性

Propagation (事务的传播属性)

Propagation :  key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。

1: PROPAGATION_REQUIRED

加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务

比如说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED, 那么由于执行ServiceA.methodA的时候,

ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到自己已经运行在ServiceA.methodA

的事务内部,就不再起新的事务。而假如ServiceA.methodA运行的时候发现自己没有在事务中,他就会为自己分配一个事务。

这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。即使ServiceB.methodB的事务已经被

提交,但是ServiceA.methodA在接下来fail要回滚,ServiceB.methodB也要回滚

2: PROPAGATION_SUPPORTS

如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形式运行

3: PROPAGATION_MANDATORY

必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常

4: PROPAGATION_REQUIRES_NEW

这个就比较绕口了。 比如我们设计ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_REQUIRES_NEW,

那么当执行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务,等待ServiceB.methodB的事务完成以后,

他才继续执行。他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了。因为ServiceB.methodB是新起一个事务,那么就是存在

两个不同的事务。如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。如果ServiceB.methodB失败回滚,

如果他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。

5: PROPAGATION_NOT_SUPPORTED

当前不支持事务。比如ServiceA.methodA的事务级别是PROPAGATION_REQUIRED ,而ServiceB.methodB的事务级别是PROPAGATION_NOT_SUPPORTED ,

那么当执行到ServiceB.methodB时,ServiceA.methodA的事务挂起,而他以非事务的状态运行完,再继续ServiceA.methodA的事务。

6: PROPAGATION_NEVER

不能在事务中运行。假设ServiceA.methodA的事务级别是PROPAGATION_REQUIRED, 而ServiceB.methodB的事务级别是PROPAGATION_NEVER ,

那么ServiceB.methodB就要抛出异常了。

7: PROPAGATION_NESTED

理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,

而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。

而Nested事务的好处是他有一个savepoint。


ServiceA {

/**

  • 事务属性配置为 PROPAGATION_REQUIRED

*/

void methodA() {

try {

//savepoint

ServiceB.methodB(); //PROPAGATION_NESTED 级别

} catch (SomeException) {

// 执行其他业务, 如 ServiceC.methodC();

}

}

}


也就是说ServiceB.methodB失败回滚,那么ServiceA.methodA也会回滚到savepoint点上,ServiceA.methodA可以选择另外一个分支,比如

ServiceC.methodC,继续执行,来尝试完成自己的事务。

但是这个事务并没有在EJB标准中定义
转载出处,详情连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值