Spring的常用标注
组件扫描
什么是组件扫描
Spring框架提供了一套 基于注解(标注) 的组件创建 和 装配的技术。这项技术
可以大大的简化XML的配置。这套技术的名字叫组件扫描。
实现组件扫描的步骤
a.建立一个项目 导入jar包(ioc aop) 并拷贝 Spring容器对应的配置文件到src下
b.在Spring 容器对应的配置文件中 开启组件扫描
<context:component-scan base-package="包名" />
c.写一个实体类 在类上加对应的标注
@Component 通用层标注
如果直接加在类上 则组件的名字就是类名首字母小写 可以通过 value 属性来指定
名字,当然只有一个value属性时 value 可以省略。
@Repository 持久层标注
@Service 服务层标注
@Controller 控制层标注
d.创建Spring 容器对象 并从容器中获取对应的组件对象
1.组件扫描中 和 作用域 初始化 销毁等相关的标注
作用域 可以通过 @Scope("singleton|prototype")
初始化 可以通过 @PostConstruct
销毁 可以通过 @PreDestroy
2.和组件装配相关的标注
@Value 可以用在成员变量 set方法 上 用来解决简单值的注入问题 如果要注入复杂的对象
可以结合EL表达式完成。
@Autowired 可以用在成员变量 set方法 以及构造方法上 。
优先按照类型进行匹配 如果有两个及以上相同的类型 则启用名字进行匹配。
如果想指定名字进行查找 可以使用 @Qualifier("组件id")
使用 @Qualifier 不能加在构造方法上
@Autowired 默认对组件的依赖是强依赖(没有对应的组件 程序会抛异常 )
可以requried 属性指定成false 代表尽量去找对应的组件 找不到也不抛异常
@Resource 可以用在 成员变量 set方法上 不能用在构造上
这个标注 不是Spring 框架的标注 这是JDK 中的标注
优先按照名字进行匹配 如果找不到会 启用类型匹配
无法使用requried 如果有多个符合条件的组件 可以使用name 属性指定
3.Spring 的声明式事务的实现步骤
3.1 开启声明式事务
<tx:annotation-driven transaction-manager="事务管理器id"
proxy-target-class="true" />
transaction-manager 指定创建的事务管理器
proxy-target-class 如果是true 优先使用CGLIB 如果是false 优先使用SUN
如果生不成 则启用CGLIB
SUN JDK 的代理API 用来生成动态代理 代理类 和 目标类 必须实现共同接口
他们是兄弟关系
CGLIB 动态代理的API 比较高级 代理类 和目标类不用实现共同接口
他们是 父子关系
3.2 在配置文件中创建一个事务管理器 -- 注入dataSource
<bean id= "txManager"
class= "org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name= "dataSource" ref="ds"/>
</bean>
3.3 在service方法上加 标注 @Transactional
4.@Transactional 的属性
rollbackFor 默认Spring 只指针运行异常进行回滚 ,可以通过这个属性 指定
哪些检查异常 做回滚。
noRollbackFor 指定对应的运行时异常 不回滚
readOnly 事务只读 事务中如果有 增 删 改 语句 则 改属性必须是false
只有全是查询语句时 才可以用true
isolation 隔离级别 四个级别(读未提交 读提交 可重复读 序列化)
针对的问题是 三大读问题
脏读
在一个事务中对数据库中数据做了DML操作没有提交的情况下 被另外一个事务 获取到了
变化的数据。(一个事务读取到了另外一个事务没有提交的数据)
不可重复读(修改问题)
一个事务 在操作的过程中读取到了一份数据,在事务进行的过程中 另外一个事务
修改了对应的数据 并进行了提交。当第一个事务再次读取数据时 发现数据发生了改变。
幻读(增加问题)
一个事务影响了表中所有的数据,这时另外的一个事务 对表中增加了数据 并进行了提交
当第一个事务再次读取数据时 发现数据发生了改变。这叫幻读。
propagation 事务传播特性 一个方法调用另外一个方法 事务应该如何处理的问题
默认REQUIRED 当前如果没有事务 则开启一个新事务,当前如果有事务 则把另外一个
加入当前事务当中。