Spring 注解
--------------------------------------------------------------------------------------------
常用:
1. bean : 开启 <context:annotation-config/>
(1) @Component 声明对象
(2) @Controller声明对象 >> MVC 网页提交类 必须用次注解
(3) @Service声明对象
(4) @Repository声明对象
① @Require 根据id
② @Autowired 根据name
2. aop : 开启 <aop:aspectj-autoproxy/>
(1) @Aspect 声明aop
① @pointcut 声明切点
1) @Before 之前
2) @After 之后
3) @Around环绕
4) @AfterReturning最终
3. tx : 开启 <tx:annotation-driven transaction-manager="txManager" />
(1) @Transaction 声明
① propagation : REQUIRED
-------------------------------------------------------------------------------------------------------------------------------------------------------
bean注解(实体类)
开启注解创建bean
`<context:component-scan base-package="cn.po"/>`
创建bean的注解
注解 | 描述 |
@Component | 基础 |
@Controller | WEB层 |
@Service | 业务层 |
@Repository | 持久层 |
l 这四个表示作用一致,其区别是区分创建的层次,暂时没有功能上的意义
开启注解注入
`<context:annotation-config/>`
主要注入注解
注解 | 描述 |
@Required 注解应用于 bean 属性的 setter 方法。 | |
@Autowired 注解可以应用到 bean 属性的 setter 方法,非 setter 方法,构造函数和属性。 | |
通过指定确切的将被连线的 bean,@Autowired 和 @Qualifier 注解可以用来删除混乱。 | |
Spring 支持 JSR-250 的基础的注解,其中包括了 @Resource,@PostConstruct 和 @PreDestroy 注解。 |
@Required 注解
@Required注解用于bean属性的setter方法,它表明受影响的bean属性在配置时必须放在XML文件中,否则容器会抛出一个BeanInitializationException异常
l @Required注解的方法,必须注入属性
l 标记范围:setter方法
@Autowired 注解
@Autowired注解对它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作
替换xml的`<property name="属性名" value=" 属性值"/>`
l @Autowired注解的方法,可以自动装配改方法的对应的属性值
l 标记范围:setter方法和属性
Required : 强调ById;
Autowired: 强调ByName;
@Autowired (required=false)
默认情况下,@Autowired 注释意味着依赖是必须的,它类似于 @Required 注释,然而,你可以使用 @Autowired 的 (required=false) 选项关闭默认行为。
l @Autowired方法也具有必须注入的属性
l @Autowired(reqyured=fakse)设置可以不必注入属性
@Qualifier注解
@Qualifier注解当你创建多个bean时,并且想要用一个属性进行注入.可以同时使用@Qualifier和@Autowired指定哪个是真正的bean装配.
l @Qualifier(“指定bean对象名”),指定了改属性必须装配的对象
AOP注解(切面)
开启AOP注解
`<aop:aspectj-autoproxy/>`
l 需要提供的jar包
1. aspectjrt.jar
2. aspectjweaver.jar
3. aspectj.jar
4. aopalliance.jar
声明@aspect
@Aspect在方法之前
l 表明该方法是一个切面(即插入的一个增强的方法)
声明切入点@Pointcut
@pointcut(execution(* com.biz.*.*(..)))
l 在@Aspect声明的类中声明哪些类和方法是需要加入切点(位置在第一个方法之前)
声明通知方式
注解 | 描述 | 示例 |
@Before | 之前通知 | @Before("方法名()") |
@After | 之后通知 | @After("方法名()") |
@AfterReturning | 后置通知 | @AfterReturning(pointcut = "方法名()", returning="retVal") |
@AfterThrowing | 异常通知 | @AfterThrowing(pointcut = "方法名()", throwing="ex") |
@Around | 环绕通知 | @Around("方法名()") |
@Transaction注解(事务)
开启事务注解
`<tx:annotation-driven transaction-manager="txManager" />`
声明@Transaction
使用范围 | 描述 |
接口\接口方法 | public的接口和方法 必须使用基于接口的代理 |
类\类方法 | public的类和方法 |
@Transaction 的属性
属性 | 类型 | 描述 |
value | String | 可选的限定描述符,指定使用的事务管理器 |
enum: Propagation | 可选的事务传播行为设置 | |
enum: Isolation | 可选的事务隔离级别设置 | |
boolean | 读写或只读事务,默认读写 | |
int (in seconds granularity) | 事务超时时间设置 | |
rollbackFor | Class对象数组,必须继承自Throwable | 导致事务回滚的异常类数组 |
rollbackForClassName | 类名数组,必须继承自Throwable | 导致事务回滚的异常类名字数组 |
noRollbackFor | Class对象数组,必须继承自Throwable | 不会导致事务回滚的异常类数组 |
noRollbackForClassName | 类名数组,必须继承自Throwable | 不会导致事务回滚的异常类名字数组 |
事务的隔离级别 ---> isolation=” ”
l 事务的隔离级别是指若干个并发的事务之间的隔离程度,如表定义了五种隔离级别:
翻译 | 值 | 描述 |
默认 | DEFAULT | 表示使用底层数据库的默认隔离级别.通常是指的READ_COMMITTED |
读未提交的 | READ_UNCOMMITTED | 表示一个事务可以读取,另一个事务修改但是没有提交的数据. 该级别不能防止脏读去\不可重复读取/幻读,因此很少使用. |
读提交的 | READ_COMMITTED | 表示一个事务只能读取已经提交的数据. 推荐使用的隔离 |
可重复读 | REPEATABLE_READ | 表示一个事务在整个过程中可以多次重复执行摸个查询,并且每次返回的记录都相同,该级别可以防止脏读\不可重复读. |
序列化 | SERIALIZABLE | 所有的事务依次逐个执行,这样事务之间就不会产生干扰,但是及其影响性能. |
事务的传播行为 ---> propagation=” ”
l 所谓的事务的传播行为是指,如果在事务开始之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为.Transaction中指定了如表几种传播行为:
翻译 | 值 | 描述 |
要求 | REQUIRED | 如果当前存在事务,则加入该事务; 如果没有,则创建一个事务; |
需要新的 | REQUIRES_NEW | 创建一个新的事务,如果当前存在事务,则把当前事务挂起; |
支持 | SUPPORTS | 如果当前存在事务,则加入该事务; 如果没有事务,则以非事务的方法运行; |
不支持 | NOT_SUPPORTED | 以非实物的方式运行,如果当前存在事务,则把当前事务挂起; |
从来没有 | NEVER | 以非实物进行运行,如果当前存在事务,则抛出异常 |
强制性的 | MANDATORY | 如果当前存在事务,则加入事务; 如果当前没有事务,则抛出异常; |
嵌套的 | NESTED | 如果当前存在事务,则创建事务作为当前事物的嵌套事务来运行; 如果当前没有事务,则创建一个事务; |
事物的只读性 ---> redOnly
l 表名该事务是否可以修改数据
l 默认 : 读写
l 建议不写,使用默认
事务的超时 ---> timeout=” ”
l 指一个事务允许执行的最长时间,如果超时则回滚事务.
l 单位 : 秒
l 默认 : none (没有限制)