美文网首页
spring 面试总结

spring 面试总结

作者: 感性的微笑 | 来源:发表于2018-06-08 11:37 被阅读0次

    1、 什么是 Spring 框架? Spring 框架有哪些主要模块?

    Spring 框架是一个为 Java 应用程序的开发提供了综合、 广泛的基础性支持的 Java 平台。 Spring 帮助开发者解决了开发中基础性的问题, 使得开发人员可以专注于应用程序的开发。Spring 框架本身亦是按照设计模式精心打造, 这使得我们可以在开发环境中安心的集成Spring 框架, 不必担心 Spring是如何在后台进行工作的。

    Spring 框架至今已集成了 20 多个模块。 这些模块主要被分如下图所示的核心容器、 数据访问/集成,、Web、 AOP( 面向切面编程) 、 工具、 消息和测试模块

    2.什么是控制反转(IOC)? 什么是依赖注入?

    1、 控制反转是应用于软件工程领域中的, 在运行时被装配器对象来绑定耦合对象的一种编程技巧, 对象之间耦合关系在编译时通常是未知的。 在传统的编程方式中, 业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。 在使用控制反转的情况下, 业务逻辑的流程是由对象关系图来决定的, 该对象关系图由装配器负责实例化, 这种实现方式还可以将对象之间的关联关系的定义抽象化。 而绑定的过程是通过“ 依赖注入” 实现的。

    2、 控制反转是一种以给予应用程序中目标组件更多控制为目的设计范式, 并在我们的实际工作中起到了有效的作用。

    3、 依赖注入是在编译阶段尚未知所需的功能是来自哪个的类的情况下, 将其他对象所依赖的功能对象实例化的模式。 这就需要一种机制用来激活相应的组件以提供特定的功能, 所以依赖注入是控制反转的基础。 否则如果在组件不受框架控制的情况下, 框架又怎么知道要创建哪个组件?

    3.ioc创建过程

    IOC 容器的初始化包括 BeanDefinition 的 Resource 定位、 载入和注册这三个基本的过程。以ApplicationContext为入口,通过源码分析,创建ApplicationContext applicationContext=new ClassPathXmlApplicationContext("ApplicationContext.xml");我们跟源码会发现:()

    a:setConfigLocations(configLocations);//解析Bean定义资源文件的路径,处理多个资源文件字符串数组

    b:ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();//拿到的是DefaultListableBeanFactory

    c:refreshBeanFactory();//这里使用了委派设计模式,父类定义了抽象的refreshBeanFactory()方法,具体实现调用子类容器的

    d:loadBeanDefinitions://调用载入Bean定义的方法,主要这里又使用了一个委派模式,在当前类中只定义了抽象的loadBeanDefinitions方法,具体的实现调用子类容器(XmlBeanDefinitionReader)

    f:doLoadBeanDefinitions //从特定XML文件中实际载入Bean定义资源的方法(XmlBeanDefinitionReader)

    e:registerBeanDefinitions //这里是启动对Bean定义解析的详细过程,该解析过程会用到Spring的Bean配置规则(XmlBeanDefinitionReader)

    f:doRegisterBeanDefinitions

    g:parseDefaultElement////使用Spring的Bean规则解析Document元素节点

    h:processBeanDefinition//解析Bean定义资源Document对象的普通元素

    i:registerBeanDefinition//将解析的BeanDefinitionHold注册到容器中

    j:beanDefinitionMap //存储注册信息的BeanDefinition

    以上是ioc创建的过程;

    4:Spring 事务的传播属性

    PROPAGATION_REQUIRED:支持当前事务, 如果当前没有事务, 就新建一个事务。 这是最常见的选择, 也是Spring 默认的事务的传播。

    PROPAGATION_REQUIRES_NEW:新建事务, 如果当前存在事务, 把当前事务挂起。新建的事务将和被挂起的事务没有任何关系, 是两个独立的事务, 外层事务失败回滚之后, 不能回滚内层事务执行的结果, 内层事务失败抛出异常, 外层事务捕获, 也可以不处理回滚操作

    PROPAGATION_SUPPORTS :支持当前事务, 如果当前没有事务, 就以非事务方式执行

    PROPAGATION_SUPPORTS:支持当前事务, 如果当前没有事务, 就以非事务方式执行。

    PROPAGATION_MANDATORY:支持当前事务, 如果当前没有事务, 就抛出异常。

    PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作, 如果当前存在事务, 就把当前事务挂起。

    PROPAGATION_NEVER:以非事务方式执行, 如果当前存在事务, 则抛出异常

    PROPAGATION_NESTED:如果一个活动的事务存在, 则运行在一个嵌套的事务中。 如果没有活动事务, 则按REQUIRED 属性执行。 它使用了一个单独的事务, 这个事务拥有多个可以回滚的保存点。 内部事务的回滚不会对外部事务 造 成 影 响 。 它 只 DataSourceTransactionManager 事务管理器起效

    5.Spring 中的隔离级别

    ISOLATION_DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级别, 使用数据库默认的事务隔离级别。 另外四个与JDBC 的隔离级别相对应。

    ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离级别, 它充许另外一个事务可以看到这个事务未提交的数据。 这种隔离级别会产生脏读, 不可重复读和幻像读。

    ISOLATION_READ_COMMITTED:保证一个事务修改的数据提交后才能被另外一个事务读取。 另外一个事务不能读取该事务未提交的数据据。

    ISOLATION_REPEATABLE_READ:这种事务隔离级别可以防止脏读, 不可重复读。 但是可能出现幻像读。

    ISOLATION_SERIALIZABLE:这是花费最高代价但是最可靠的事务隔离级别。 事务被处理为顺序执行。

    5.SpringAOP 应用示例

    AOP 是 OOP 的延续, 是 Aspect Oriented Programming 的缩写, 意思是面向切面编程。 可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP 设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP 可以说也是这种目标的一种实现。我们现在做的一些非业务, 如: 日志、 事务、 安全等都会写在业务代码中(也即是说, 这些非业务类横切于业务类), 但这些代码往往是重复, 复制——粘贴式的代码会给程序的维护带来不便, AOP 就实现了把这些业务需求与系统需求分开来做。 这种解决的方式也称代理机制。

    AOP 的相关概念:

    切面( Aspect) : 官方的抽象定义为“ 一个关注点的模块化, 这个关注点可能会横切多个对象” 。 “切面” 在ApplicationContext 中来配置。

    连接点( Joinpoint) : 程序执行过程中的某一行为, 例如, MemberService .get 的调用或者MemberService .delete 抛出异常等行为。

    通知( Advice) :“ 切面”对于某个“ 连接点”所产生的动作。其中, 一个“ 切面”可以包含多个“ Advice”。

    切入点( Pointcut) : 匹配连接点的断言, 在 AOP 中通知和一个切入点表达式关联。 切面中的所有通知所关注的连接点, 都由切入点表达式来决定。

    目标对象( Target Object) : 被一个或者多个切面所通知的对象。 例如, AServcieImpl 和BServiceImpl, 当然在实际运行时, Spring AOP 采用代理实现, 实际 AOP 操作的是 TargetObject的代理对象。

    AOP 代理( AOP Proxy) : 在 Spring AOP 中有两种代理方式, JDK 动态代理和 CGLIB 代理。 默认情况下,TargetObject 实现了接口时, 则采用 JDK 动态代理, 例如, AServiceImpl; 反之, 采用 CGLIB代理, 例如, BServiceImpl。 强制使用 CGLIB 代理需要将 的 proxy-target-class属性设为 true。

    前置通知( Before advice) : 在某连接点( JoinPoint) 之前执行的通知, 但这个通知不能阻止连接点前的执行。ApplicationContext 中在里面使用元素进行声明。 例如,TestAspect 中的 doBefore 方法。

    后置通知( After advice) : 当某连接点退出的时候执行的通知( 不论是正常返回还是异常退出) 。ApplicationContext 中在里面使用元素进行声明。例如,ServiceAspect中的 returnAfter 方法, 所以 Teser 中调用 UserService.delete 抛出异常时, returnAfter 方法仍然执行

    返回后通知( After return advice) : 在某连接点正常完成后执行的通知, 不包括抛出异常的情况。ApplicationContext 中在里面使用元素进行声明

    环绕通知( Around advice) : 包围一个连接点的通知, 类似 Web 中 Servlet 规范中的 Filter 的doFilter 方法。 可以在方法的调用前后完成自定义的行为, 也可以选择不执行。 ApplicationContext中在里面使用元素进行声明。 例如, ServiceAspect 中的 around 方法。

    抛出异常后通知 ( After throwing advice):在方法抛出异常退出时执行的通知。ApplicationContext中在里面使用元素进行声明。 例如, ServiceAspect 中的returnThrow 方法。

    相关文章

      网友评论

          本文标题:spring 面试总结

          本文链接:https://www.haomeiwen.com/subject/zmsosftx.html