首页 > 其他分享 >Spring

Spring

时间:2022-09-06 22:13:21浏览次数:56  
标签:事务 -- Spring Bean AOP 组件

1、详细描述什么是Spring?

  • Spring是轻量级的,面向切面编程(AOP)和控制反转(IoC)的容器框架,主要负责技术的整合;
  • 它是一个容器,框架的框架,管理业务逻辑层;
  • 优点:
    1. 可以降低组件之间的耦合度,方便解耦,简化开发;
    2. 便于系统组件的维护,扩展和替换,方便集成各种优秀框架;
    3. 利用Spring容器管理Controller、Service、Dao组件;
    4. 利用IoC特性降低Service和Dao之间的关联;
    5. 利用AOP进行事务等共通部分的处理;
    6. 使用Spring框架来创建性能好、易于测试、可重用的代码。

2、什么是Spring IoC?

  • Inversion of Control控制反转,也可以称为依赖倒置,是一种设计思想,将设计好的对象交给容器控制;

  • 控制:对象的创建、初始化、销毁和对象之间关系的指定;

  • 反转:由Spring容器进行对象创建和依赖注入,将控制的逻辑交给第三方框架或者容器负责,当两个组件之间的关系发生改变时,只需要修改框架或者容器的配置

  • 正转:由程序员进行对象创建和依赖注入

  • 组件:具有功能的类

  • 资源:被创建的对象

3、什么是Spring AOP?描述其应用场景

  • OOP(Object-Oriented Programing,面向对象编程),引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。

  • AOP(Aspect-Oriented Programming,面向切面编程),以OOP为基础,主要关注的是Aspect方面,方面组件主要用来封装通用的逻辑,可以以低耦合的方式切入到某一批目标对象中。

  • 将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。

  • 实现AOP的技术,主要分为两大类:一是采用动态代理技术;二是采用静态织入Weaving的方式,引入特定的语法创建Aspect“方面”。

  • 应用场景:

    • Authentication 权限
    • Caching 缓存
    • Context passing 内容传递
    • Error handling 错误处理
    • Lazy loading 懒加载
    • Debugging 调试
    • logging, tracing, profiling and monitoring 记录跟踪 优化 校准
    • Performance optimization 性能优化
    • Persistence 持久化
    • Resource pooling 资源池
    • Synchronization 同步
    • Transactions 事务

4、AOP的通知有几个,分别是什么?

  • 前置通知(Before):方面组件在目标组件之前执行
  • 后置通知(After):方面组件在目标组件之后执行,目标组件方法没有抛出异常才会执行方面组件
  • 最终通知(After-returning ):方面组件在目标组件之后执行,目标组件不管是否发生异常都会执行 方面组件
  • 异常通知(After-throwing):方面组件在目标组件抛出异常之后执行
  • 环绕通知(Around):方面组件在目标组件之前和之后执行

5、描述Spring Bean的作用域?

Spring框架支持以下五种bean的作用域:

  • singleton : 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值;
  • prototype:每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行 newXxxBean()。以下作用域仅在基于web的Spring ApplicationContext情形下有效;
  • request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring WebApplicationContext环境;
  • session:同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web 的Spring WebApplicationContext环境;
  • application:限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的 Spring WebApplicationContext环境。

6、Spring Bean注入有几种方式?

  • setter注入:单例、多例
  • 构造方法注入
  • 自动装配

7、SpringBean 生命周期?

  • Spring Bean的生命周期指的是从一个普通的Java类变成Bean的过程
  • Spring Bean的生命周期分为四个阶段和多个扩展点。扩展点又可以分为影响多个Bean和影响单个Bean。
    • 四个阶段
      • 实例化 Instantiation
      • 属性赋值 Populate
      • 初始化 Initialization
      • 销毁 Destruction
    • 多个扩展点
      • 影响多个Bean
        • BeanPostProcessor
          postProcessBeforeInitialization
          postProcessAfterInitialization
        • InstantiationAwareBeanPostProcessor
          postProcessBeforeInstantiation
          postProcessAfterInstantiation
          postProcessPropertyValues
        • MergedBeanDefinitionPostProcessor
          postProcessMergedBeanDefinition
        • SmartInstantiationAwareBeanPostProcessor
          determineCandidateConstructors
          getEarlyBeanReference
      • 影响单个Bean
        • Aware
          • Aware Group1(调用invokeInitMethods方法)
            BeanNameAware
            BeanClassLoaderAware
            BeanFactoryAware
          • Aware Group2(调用Aware和BeanPostProcessor#postProcessBeforeInitialization方法)
            EnvironmentAware
            EmbeddedValueResolverAware
            ApplicationContextAware(ResourceLoaderAware\ApplicationEventPublisherAware\MessageSourceAware)
        • 生命周期
          InitializingBean
          DisposableBean

8、Spring框架中 用到了哪些设计模式?

  • 工厂设计模式 : Spring使用工厂模式通过 BeanFactoryApplicationContext 创建 bean 对象。
  • 代理设计模式 : Spring AOP 功能的实现。
  • 单例设计模式 : Spring 中的 Bean 默认都是单例的。 - 模板方法模式 : Spring 中 jdbcTemplatehibernateTemplate 等以 Template 结尾的对 数据库操作的类,它们就使用到了模板模式。
  • 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同 的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
  • 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
  • 适配器模式:Spring AOP 的增强或通知(Advice)使用到了适配器模式、Spring MVC 中也是用到了 适配器模式适配Controller

9、描述Spring事务传播行为?

  • REQUIRED(常用):如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。
  • SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
  • MANDATORY:强制的 使用当前的事务,如果当前没有事务,就抛出异常。
  • REQUIRES_NEW:需要JTA事务管理器的支持,新建事务,如果当前存在事务,把当前事务挂起。
  • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 - NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  • NESTED:嵌套 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED类 似的操作
  • 在同一个方法中,因为大多数情况是一系列业务要保证要么都成功要么都失败的,所以各个业务方法使用默 认的REQUIRED方式。
  • 如果一个特殊的业务方法,和其他业务不关联,给它的方法设置REQUIRES_NEW,这样就能保证其他业务有 异常时也不会被回滚。

10、描述Spring事务的隔离级别?

  1. int ISOLATION_DEFAULT = -1; 使用数据库默认的隔离级别
  2. int ISOLATION_READ_UNCOMMITTED = 1;读未提交,A事务可以读到B事务未提交的数据
  3. int ISOLATION_READ_COMMITTED = 2;读提交,A事务可以读到B事务已提交的数据
  4. int ISOLATION_REPEATABLE_READ = 4;可重复读,A事务读不到B事务已提交的数据
  5. int ISOLATION_SERIALIZABLE = 8;串行化

11、Spring事务传播行为REQUIRED和REQUIRES_NEW区别?

  • 事务的默认传播属性是REQUIRED,表示当前方法必须运行在事务中,如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务
  • REQUIRES_NEW表示当前方法必须运行在它自己的事务中,一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起Suspend。适合用某个业务对象所做的事情不想影响到外层事务的情况。

12、Spring循环依赖?

  • Spring Framework体系
  • Spring中的Bean是由BeanDefinition(建模的类)构建
    Bean复杂的生命周期:Spring容器启动--扫描--BeanDefinition--存入BeanDefinition Map中--遍历--验证--创建Bean--推断最佳构造方法--反射实例化Java对象--初始化Bean--是否暴露--创建x对象--属性回填set--回调--(完成代理--发布事件)
    如果直接缓存x,那么拿到的就是x,很难扩展,不直接暴露x,而是暴露ObjectFactory,就能拿到我们想要的x
    循环依赖是支持setter单例的
    非构造方法注入
    x找y,y找x,死循环
    三个Map解决循环依赖
    一级缓存:用于存放完全初始化好的bean,缺点:无法存放半成品对象
    二级缓存:存放原始的bean对象(尚未填充属性),用于解决循环依赖;问题:Spring的AOP
    机制代理对象
    三级缓存:存放bean工厂对象,用于解决循环依赖(针对动态代理对象)

标签:事务,--,Spring,Bean,AOP,组件
From: https://www.cnblogs.com/wyzel/p/16662797.html

相关文章