本文首发自[慕课网](imooc.com) ,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"及“慕课网公众号”!
人在职场混,哪有不被问,作为一名Java语言开发者,在面试的过程中,经常会和各种面试官频繁交手,甚至是有些来自灵魂的拷问~
不过没关系,小慕认为每次面试都是对自我知识储备掌握能力的一个输出和总结,提到java面试,面试官少不了会问spring的一些问题,在这里我把常见的几个基础问题进行一一解剖列举。
一、什么是spring框架
简单总结概括的话,就是一个快速开发java服务的后端框架,用户只需要关注业务需求,其他的事情交给框架处理。
二、Spring 框架中用到了哪些设计模式?
这种题目,在我们去面试前,刷各种题库的时候,肯定会遇到,这是一个非常基础的面试题,一方面考察面试前的准备是否充分,另一方面也是看我们作为一个程序员对spring框架的设计模式的掌握和了解程度,就我个人理解而言,常见的有以下几种:
工厂设计模式 : Spring
使用工厂模式通过 BeanFactory、ApplicationContext
创建 bean
对象。
代理设计模式 : Spring AOP
功能的实现。
单例设计模式 : Spring
中的 Bean
默认都是单例的。
模板方法模式 : Spring
中 jdbcTemplate、hibernateTemplate
等以 Template
结尾的对数据库操作的类,它们就使用到了模板模式。
包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
观察者模式: Spring
事件驱动模型就是观察者模式很经典的一个应用。
适配器模式 :Spring AOP
的增强或通知(Advice)使用到了适配器模式、spring MVC
中也是用到了适配器模式适配Controller
。
三、说说你对动态代理设计模式的理解
在Spring框架内,大量用到了反射及动态代理技术,一般而言,动态代理一般分为两种,一种是JDK反射机制提供的代理,另一种就是CGLIB代理技术。
其中,JDK动态代理是需要实现类通过接口定义业务方法,对于没有接口的类,就需要使用CGLIB来实现动态代理。
四、静态代理和动态代理有什么区别?
对于这类题目同样是理论知识的掌握和自己对两种代理的理解是否能够做到理解透彻,个人觉得可能从概念,特点和区别上去回答,并通过实际生活中的场景例子说明。
静态代理是什么?
某个对象提供一个代理,代理角色固定,以控制对这个对象的访问。代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。
举个生活中的例子:比如一对新人结婚要举办婚礼,需要请这个婚庆公司的司仪帮助主持婚礼,将婚礼的整个过程的举办委托给婚庆公司,由它帮我们去执行工作同时解决工作相关的各种麻烦,最后把工作成果交给我们。那在这个过程中,两个人结婚就是为共同行为,是目标,这对新人就是我们的目标角色,而婚庆公司司仪为了完成这次新人的结婚完美举行,负责代理整个环节流程的主持,气氛调节处理等,就是这个代理的角色。
所以不难从上面的实例中看到静态代理的特点是:
1、目标角色固定
2、在应用程序执行前就得到目标角色
3、代理对象会增强目标对象的行为
4、有可能存在多个代理 引起"类爆炸"(缺点)
动态代理是什么?
相比于静态代理,动态代理在创建代理对象上更加的灵活,动态代理类的字节码在程序运行时,由Java反射机制动态产生。它会根据需要,通过反射机制在程序运行期,动态的为目标对象创建代理对象,无需程序员手动编写它的源代码。动态代理不仅简化了编程工作,而且提高了软件系统的可扩展性,因为反射机制可以生成任意类型的动态代理类。代理的行为可以代理多个方法,即满足生产需要的同时又达到代码通用的目的。
同样举个例子:孩子要过生日了,为了给孩子一个仪式感,最起码先送个蛋糕。那蛋糕的口味多种多样了。有巧克力,冰淇淋,奶油等等。这都是基本的了,为了好吃又好看还再加点额外的装饰,如蛋糕里放点卡通动物图案、放贺卡、放点干果吃着更香等等。如果采用继承会造成大量的蛋糕子类,所以就会采用蛋糕作为主体,卡通图案,贺卡,果仁等是装饰者,需要时加到蛋糕上。要啥我就加啥。所以这里面是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它通过创建一个包装对象,也就是装饰来包裹真实对象,提供了比继承更具弹性的代替方案。
动态代理的两种实现有方式:
分别是JDK
动态代理和 CGLIB
动态代理;两者之间的区别在于JDK动态代理实现接口,Cglib
动态代理继承思想,JDK动态代理(目标对象存在接口时)执行效率高于Ciglib
。对于这两种方式如何去进行选择,非常简单,如果目标对象有接口实现,就选择JDK代理,如果没有接口实现选择Cglib代理。
动态代理的特点是什么?
1、目标对象不固定
2、在应用程序执行时动态创建目标对象
3、代理对象会增强目标对象的行为
五、谈谈你对代理模式的理解?
对于面试官这种提问的方式,首先要搞清楚这个问题的本质为了考察你的临时总结能力,是对你是否有自己独特观点视角的一个呈现机会,这种开放式的提问没有标准答案,所以只需要我们介于自己对代理模式的理解,对知识点进行个人观点阐述和总结,用自己理解的语言能很好的组织表达出来即可。
纵观上述所说,我个人认为:代理模式可以说是对原来被代理对象功能上的一种增强。代理模式的核心是通过一个类或者接口来获取子类代理对象的方法对象从而实现调用它们,并在调用它们的时候我们可以环绕被调用的方法添加我们需要添加的处理。这种方式能够大大简化我们在客户端的一些处理成本,提升效率,另一方面它能够灵活应对一些特殊需求,让其主体不受影响。
六、Spring 管理事务的方式有几种?
编程式事务,在代码中硬编码。(不推荐使用)
声明式事务,在配置文件中配置(推荐使用)
声明式事务又分为两种:
基于XML的声明式事务
基于注解的声明式事务
七、spring的http请求全流程
简单理解就可以是:http->tomcat->filter->dispatcher->controller
八、关于Spring Bean的生命周期
回答这个问题之前,首先我们要思考为什么要了解了解 Spring 生命周期?
了解它的意义就在于,可以利用 Bean 在其存活期间的指定时刻完成一些相关操作。这种时刻可能有很多,但一般情况下,会在 Bean 被初始化后和被销毁前执行一些相关操作。
在 Spring 中,Bean 的生命周期是一个很复杂的执行过程,我们可以利用 Spring 提供的方法定制 Bean 的创建过程。
当一个 Bean 被加载到 Spring 容器时,它就具有了生命,而 Spring 容器在保证一个 Bean 能够使用之前,会进行很多工作。Spring 容器中 Bean 的生命周期流程如下图所示:
九、写在最后
不管是作为一个刚毕业入职的新手还是职场奋进三五年的老手码农,在面试的时候,都会遇到各种面试题,有简有难,因人而异。
而这些常规会被问到的题目,最好是在面试前做好充分准备,毕竟,最基础最常见的问题考的都是知识点以及在过往经历中的应用。
面试最重要的核心是以不变应万变,题目是万变不离其宗,变来变去,都是从基础入手出发,也没有哪家企业变态的故意去搞很刁钻古怪的问题去考你,除非这家企业的面试官真的很闲。
毕竟面试的本质是为了看看你的水平能否在未来胜任公司的岗位;而作为面试人员,扎实的技术功底和充分的准备是面试的制胜法宝,知己知彼,百战不殆。
欢迎关注「慕课网」官方帐号,我们会一直坚持提供IT圈优质内容,分享干货知识,大家一起共同成长吧!
本文原创发布于慕课网 ,转载请注明出处,谢谢合作