什么是Spring

Spring是一个开源的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用,从简单性、可测试性和松耦合的角度而言,通过依赖注入,AOP编程模型,使得任何Java应用都可以从Spring中受益。

Spring提供了什么扩展性

  1. 在对象创建之前添加某些功能
  2. 在容器初始化之前添加某些功能
  3. 在不同的阶段发出不同的事件,完成一些功能
  4. 抽象出一堆的接口来帮助扩展
  5. 面向接口编程

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)