什么是Spring
Spring是一个开源的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用,从简单性、可测试性和松耦合的角度而言,通过依赖注入,AOP编程模型,使得任何Java应用都可以从Spring中受益。
Spring提供了什么扩展性
- 在对象创建之前添加某些功能
- 在容器初始化之前添加某些功能
- 在不同的阶段发出不同的事件,完成一些功能
- 抽象出一堆的接口来帮助扩展
- 面向接口编程
Autowired与Resource注解区别
@Autowired默认按类型装配,默认情况下必须要求依赖对象存在,如果要允许null值,可以设置它的required属性为false。如果想使用名称装配可以结合@Qualifier注解进行使用。
@Resource,默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行名称查找。如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
Spring Bean
bean的作用域
- singleton:默认值,单例,SpringIOC容器仅存在一个Bean实例,IOC容器启动时就创建
- prototype:每次调用
getBean()都会返回一个新实例 - request:每次HTTP请求都会创建一个新实例,作用域仅适用于WebApplicationContext环境
session:同一个HTTP session共享一个bean,不同的session使用不同的bean,作用域仅适用于WebApplicationContext环境
Spring 事务
事务传播
使用@Transactional注解执行事务,该注解的propagation属性可以设置事务传播属性
REQUIRED:默认值,如果有事务在运行,当前的方法就在这个事务内运行,否则就启动一个新的事务,并在自己的事务内运行
- REQUIRES_NEW:当前的方法必须启动新事务,并在它自己的事务内运行,如果有事务在运行,就将它挂起
- SUPPORTS:如果有事务在运行,当前的方法就在这个事务内运行,否则它可以不运行在事务中
- NOT_SUPPORTED:当前的方法不应该运行在事务中,如果有运行的事务,将它挂起
- MANDATORY:当前的方法必须运行在事务内部,如果没有正在运行的事务,就抛出异常
- NEVER:当前的方法不应该运行在事务中,如果有运行的事务,就抛出异常
NESTED:如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则,就启动一个新的事务,并在它自己的事务内运行
事务失效的情况
被事务管理的方法内部进行try-catch异常处理
- 默认捕获不被检查的RuntimeException异常(unchecked),checked异常不处理
解决方法:
在注解@Transactional配置只要出现异常就回滚
被事务管理的方法不要进行try-catch操作,使用throws抛出@Transactional(rollbackFor = Exception.class)
