spring 面试总结

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 方法。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容