zoukankan      html  css  js  c++  java
  • 撩课-Java每天5道面试题第21天

    136.请解释Spring Bean的生命周期?

    首先说一下Servlet的生命周期:
    实例化,
    初始init,
    接收请求service,
    销毁destroy;
    
     Spring上下文中的Bean生命周期也类似,
    如下:
    1.实例化一个Bean
    也就是我们常说的new;
    
    2.按照Spring上下文
    对实例化的Bean进行配置
    也就是IOC注入;
    
    3.如果这个Bean已经实现了BeanNameAware接口,
    会调用它实现的
    setBeanName(String)方法,
    此处传递的就是Spring配置文件中Bean的id值;
    
    4.如果这个Bean已经实现了BeanFactoryAware接口,
    会调用它实现的
    setBeanFactory(setBeanFactory(BeanFactory)
    传递的是Spring工厂自身
    可以用这个方式来获取其它Bean,
    只需在Spring配置文件中
    配置一个普通的Bean就可以;
    
    5.如果这个Bean已经实现了
    ApplicationContextAware接口,
    会调用setApplicationContext(ApplicationContext)方法,
    传入Spring上下文
    同样这个方式也可以实现步骤4的内容,
    但比4更好,
    因为ApplicationContext是BeanFactory的子接口,
    有更多的实现方法
    
    6.如果这个Bean关联了
    BeanPostProcessor接口,
    将会调用
    postProcessBeforeInitialization(Object obj, String s)方法,
    BeanPostProcessor
    经常被用作是Bean内容的更改,
    并且由于这个是在Bean初始化结束时
    调用那个的方法,
    也可以被应用于内存或缓存技术;
    
    7.如果Bean在Spring配置文件中
    配置了init-method属性
    会自动调用其配置的初始化方法。
    
    8.如果这个Bean关联了BeanPostProcessor接口,
    将会调用
    postProcessAfterInitialization(Object obj, String s)方法、;
    
    注:以上工作完成以后就可以应用这个Bean了,
    那这个Bean是一个Singleton的,
    所以一般情况下
    们调用同一个id的Bean会是
    在内容地址相同的实例,
    当然在Spring配置文件中
    也可以配置非Singleton。
    
    9.当Bean不再需要时,
    会经过清理阶段,
    如果Bean实现了DisposableBean这个接口,
    会调用那个其实现的destroy()方法;
    
    10.最后,
    如果这个Bean的Spring配置中
    配置了destroy-method属性,
    会自动调用其配置的销毁方法。
    
     另外我们这里描述的是应用Spring
    上下文Bean的生命周期,
    如果应用Spring的工厂
    也就是BeanFactory的话去掉第5步就Ok了。

    137.介绍下Spring的主要模块?

    Spring AOP:
    Spring的关键组件之一是AOP框架。
    AOP在Spring中使用:
    提供声明性的企业服务,
    特别是作为EJB声明式服务的替代品。
    最重要的服务是声明式事务管理,
    它建立在Spring的事务抽象之上。
    允许用户实现自定义的切面,
    补充他们使用AOP的OOP的使用。
    
    Spring ORM:
    ORM包与数据库访问有关。
    它为流行的对象关系映射api提供集成层,
    包括JDO、Hibernate和iBatis。
    
    Spring Web:
    web应用程序开发堆栈,
    其中包括Spring MVC。
    
    Spring DAO:
    Spring的DAO(Data Access Object)
    支持主要用于使用JDBC、
    Hibernate或JDO等
    技术标准化数据访问工作。
    
    Spring Context:
    此包构建在bean包之上,
    以增加对消息源的支持和观察者的设计模式支持,
    以及应用程序对象使用一致的
    API获得资源的能力。
    
    Spring Web MVC:
    这是为web应用程序
    提供MVC实现的模块。
    
    Spring Core:
    核心包是Spring框架中最重要的组件。
    
    该组件提供依赖性注入特性。
    BeanFactory提供了一种工厂模式,
    它将诸如初始化、
    创造和访问对象
    与实际程序逻辑的访问分离开来。

    138.Spring事务的种类和各自的区别?

    spring支持
    编程式事务管理
    声明式事务管理
    两种方式:
    
    1.编程式事务管理使用TransactionTemplate
    或者直接使用底层的PlatformTransactionManager。
    对于编程式事务管理,
    spring推荐使用TransactionTemplate。
    
    2.声明式事务管理建立在AOP之上的。
    其本质是对方法前后进行拦截,
    然后在目标方法开始之前创建或者加入一个事务,
    在执行完目标方法之后
    根据执行情况提交或者回滚事务。
    声明式事务最大的优点
    就是不需要通过编程的方式管理事务,
    这样就不需要在业务逻辑代码中
    掺杂事务管理的代码,
    只需在配置文件中
    做相关的事务规则声明
    或通过基于@Transactional注解的方式
    便可以将事务规则应用到业务逻辑中。
    
    3.显然声明式事务管理要优于编程式事务管理,
    这正是spring倡导的非侵入式的开发方式。
    声明式事务管理使业务代码不受污染,
    一个普通的POJO对象,
    只要加上注解就可以获得完全的事务支持。
    和编程式事务相比,
    声明式事务唯一不足地方是,
    后者的最细粒度只能作用到方法级别,
    无法做到像编程式事务
    那样可以作用到代码块级别。

    139.说说spring的事务传播行为?

    spring事务的传播行为
    说的是当一个方法调用另一个方法时,
    事务该如何操作。
    1.PROPAGATION_REQUIRED:
    如果当前没有事务,
    就创建一个新事务,
    如果当前存在事务,
    就加入该事务,
    该设置是最常用的设置。
    
    2.PROPAGATION_SUPPORTS:
    支持当前事务,
    如果当前存在事务,
    就加入该事务,
    如果当前不存在事务,
    就以非事务执行。‘
    
    3.PROPAGATION_MANDATORY:
    支持当前事务,
    如果当前存在事务,
    就加入该事务,
    如果当前不存在事务,
    就抛出异常。
    
    4.PROPAGATION_REQUIRES_NEW:
    创建新事务,
    无论当前存不存在事务,
    都创建新事务。
    
    5.PROPAGATION_NOT_SUPPORTED:
    以非事务方式执行操作,
    如果当前存在事务,
    就把当前事务挂起。
    
    6.PROPAGATION_NEVER:
    以非事务方式执行,
    如果当前存在事务,
    则抛出异常。
    
    7.PROPAGATION_NESTED:
    如果当前存在事务,
    则在嵌套事务内执行。
    如果当前没有事务,
    则执行与PROPAGATION_REQUIRED类似的操作。

    140.Spring事务的实现方式和实现原理

    1.划分处理单元——IOC:
    由于spring解决的问题是
    对单个数据库进行局部事务处理的,
    具体的实现首相用spring中的IOC
    划分了事务处理单元。
    并且将对事务的各种配置
    放到了ioc容器中
    设置事务管理器,
    设置事务的传播特性及隔离机制。
    
    2.AOP拦截需要进行事务处理的类:
    
    Spring事务处理模块
    是通过AOP功能来实现声明式事务处理的,
    具体操作
    比如事务实行的配置和读取,
    事务对象的抽象,
    用TransactionProxyFactoryBean接口
    来使用AOP功能,
    生成proxy代理对象,
    通过TransactionInterceptor完成
    对代理方法的拦截,
    将事务处理的功能
    编织到拦截的方法中。 
    
    读取ioc容器事务配置属性,
    转化为spring事务处理
    需要的内部数据结构
    TransactionAttributeSourceAdvisor
    转化为TransactionAttribute表示的数据对象。 
    
    3.对事物处理实现
    事务的生成、提交、回滚、挂起:
    
    spring委托给具体的事务处理器实现。
    实现了一个抽象和适配。
    适配的具体事务处理器:
    DataSource数据源支持、
    hibernate数据源事务处理支持、
    JDO数据源事务处理支持,
    JPA、JTA数据源事务处理支持。
    这些支持都是通过设计PlatformTransactionManager、
    AbstractPlatforTransaction
    一系列事务处理的支持。
    为常用数据源支持提供了
    一系列的TransactionManager。
    
    结合:
    PlatformTransactionManager实现了
    TransactionInterception接口,
    让其与TransactionProxyFactoryBean结合起来,
    形成一个Spring声明式事务处理的设计体系。

     

  • 相关阅读:
    TP5.1 分页CSS样式(转载)
    简单的layui二级联动
    关于layui部分表单不显示的问题(Select, checkBox)
    MySQL 开启远程访问权限 | 宝塔系统
    tp5.1 本地正常, 线上route.php不起作用的问题
    cocos自动图集
    微信小程序video
    nuxt https
    接口数据加密
    node里读取命令行参数
  • 原文地址:https://www.cnblogs.com/gxq666/p/10129538.html
Copyright © 2011-2022 走看看