假如面试官这样问你spring(spring+springboot+springcloud)

  这是一个风和日丽的下午,小武同学拿着自己的简历在“spring有限公司”的楼下不断徘徊,这是小武同学的第一次面试,心里不免紧张万分。
  “叮叮叮~~”,闹钟响了,还有五分钟就三点了,约好了三点面试的小武整理了一下刚刚洗过的头发,深吸了一口气,推开了公司的门,走了进去。
  在前台简单填了一张面试记录表之后,就在小姐姐的指引下,走到了888号会议室门口,面试官就在里面等着。
  “吱~”,门开了,小武终于见到了面试官,为数不多的头发在光亮的头顶上围成了地中海的形状,"这一看就是大佬啊”,小武的心里更加紧张了。
  “你好,我是本次的面试官,简单介绍一下自己吧”,大佬用一个充满沧桑的语气说道。
  “您好,我叫小武,巴拉巴拉~”,小武把早就准备好的自我介绍台词一口气说完了。
  面试官抬起头,用充满智慧的眼神看着小武:“你了解我们公司吗?”
  “当然了解了,我向往你们公司很久了呢,贵公司致力于使编写java程序变得更快,更简单,更安全,贵公司不止是有超级厉害的spring框架,还有在其基础上的更加简单易用的springboot框架,它们都可以集成很多很多好用的工具,在这个微服务时代,贵公司还提供了springcloud这样一套微服务完整的治理方案,简直是全世界java程序员的救世主!”,小武激动地说到。
  “咳咳”,这么夸自己的公司,面试官都有点不好意思了,就赶紧打断了小武。
  “那你说说,人们为什么会使用spring框架吧”,面试官开始进入正题了。
  小武抬头望着天花板沉思了30秒,说道:“spring是提高开发效率的一整套解决方案,首先,spring框架提出了IOC的这样一个核心概念,通过管理所有的bean对象,解决了在此之前创建对象以及依赖对象混乱的问题;其次,还有一个AOP的概念,用来将一些业务中的公共逻辑提取出来进行复用,比如日志、监控等等;而且,在整个系统开发的链路中,spring都提供了对应的提高开发效率的解决方案,比如web层的springmvc,业务层的各种三方组件,有定时器、邮件组件、junit等等,还有数据访问层的JDBC组件等等,所以会大大减少系统开发的工作量。用过的人都说好!”
  “好的,简单说说什么是IOC吧“,面试官看上去还算满意的说到。
  “IOC,就是控制反转,Inversion of Control,意思就是说将原来放在用户手中bean管理的权限放到了spring容器中,再简单一点说,IOC其实就是一个容纳bean的容器。和IOC一起的还有有个DI的概念,也就是依赖注入,他的意思就是在用户依赖到bean的地方,将这个bean从IOC容器中取出来,注入给程序中去使用”。小武信心满满地说道,心里嘀咕,怎么会问这么简单的问题?
  “嗯,不错,那这个IOC和DI是怎么实现的呢?”面试官继续追问到。
  “实现原理吗?稍等我想想…”小武已经感觉到有点难了。
  “首先,spring要知道自己需要管理哪些类的bean,我们可以通过xml配置、configuration类、以及注解等标识这些类,spring首先通过BeanDefinitionReader将标识的这些类定义读取到内存中,然后通过BeanFactory以及class.getInstance()方法将这些类给初始化成对象,最后再将这些对象放到一个map容器中,其中map的key就是bean的名称或者bean的class,value就是这些初始化好的对象,这样就管理了这些bean。然后在使用到这些bean的地方,我们可以通过@Autoware或者@Resource等标志一下,这样程序在看到这些注解的时候,就会通过属性名或者类将bean从map中取出来,再利用反射机制注入到对应的属性中,这样就实现了依赖注入。’”小武虽然记的不是很清楚,但是也一步一步地推理出来了。
  “只有这些吗?我们既然是一个框架,你觉得我们还会考虑哪个方面的内容?”面试官有点不满意的说到。
  “嗯…既然作为一个框架,那么最重要的其实是扩展性,也就是可以让用户在合适的地方可以自定义一些内容,使框架更加的灵活…哦哦我知道了,我记得在BeanDefinitionReader读取类定义后,可以通过BeanFactoryPostProcessor这个类去自定义一些bean的元信息,比如修改类的属性等等,还有在BeanFactory初始化bean的前后,都会执行BeanPostProcessor里的方法,我们可以实现BeanPostProcessor,在bean初始化前后做一些事情,另外在spring启动的各个节点,我们都可以实现ApplicationListener来做一些扩展的事情,最后我们还可以通过FactoryBean来自定义一些复杂对象的初始化方法,此外还有很多可扩展的方式,比如InitializingBean、DisposableBean,init-method等等,总之,很强大。”
  “嗯不错,基本说的差不多了,刚刚在谈spring框架的时候你提到了AOP是吧,说说你对AOP的理解”,面试官也察觉出来小武已经感觉有点难了,换了个话题。
  松了一口气的小武说道:“AOP就是面向切面编程的简写,它不同于OOP,每个对象的行为都是完整的,而是将一些通用的行为提取出来,放到同一个地方,形成独立的切面,然后在合适的时间,再将这段抽取出来的程序放在合适的地方执行,能够极大的提高代码复用率,比如日志、监控、异常处理等等通用的行为都可以使用AOP来简化”
  “我们是怎么实现AOP的?”面试官继续追问到。
  “一般实现AOP的方式有两种,静态AOP和动态AOP,静态AOP是说在编译期进行,也就是说在形成class字节码文件的时候就将切面的代码编译到合适的地方了,比如aspectj;动态AOP是在运行期进行,也就说class文件还是和我们写的代码是相对应的,只不过,在运行期,我们会使用反射动态地生成代理类,从而实现AOP。而我们spring aop 虽然可以使用aspectj相关的注解,但是实际上是动态代理,它默认使用jdk自带的动态代理,但是jdk自带的动态代理是通过接口实现的,所以如果在没有接口的地方想要实现AOP的话,spring会选择CGLIB作为动态代理的方式,因为CGLIB是通过继承实现的,不需要接口”,小武侃侃而谈,这是他之前复习了好多遍的内容了。
  “嗯…还不错,那咱们换个话题,你说,为什么我们有了spring框架了,还要弄一个springboot框架?”面试官饶有兴趣地问道。
  “springboot吗?我觉得它真是一个伟大的设计!它简直是把简单发挥到了极致!”小武激动地说道。
  “行了行了,别夸了,说说springboot为什么“简单”吧?”面试官有点尴尬地问道。
  小武不好意思地笑了笑,说道:“我觉得springboot简单的第一个要点就是可以快速部署启动,它倡导着约定大于配置的原则,将所有启动所需要的配置都赋予了默认值,并且还内置了tomcat,这样在我们新建一个项目后,不需要配置任何的东西就可以启动运行了;springboot简单的第二个要点是提供了starter的方式,可以让我们的项目管理三方依赖包的bean,极大地简化了三方组件的使用!”
  面试官点点头,继续问道:“那这个starter是怎么实现的你知道吗?”
  “这个我们项目中正好用到过,在springboot启动的时候,会去扫描所有jar包中的MAT-INT/spring.factory的文件,在这个文件中可以配置一些Configuration配置类,在这些配置类中使用@Bean返回的对象就会被当前的IOC容器管理起来,并且我们还可以配合@PropertyConfiguration去让用户在配置文件中配置一些三方组件中需要使用到的属性,比如tomcat的端口号等等。”小武自信地回答到。
  “能在使用的过程中搞懂其中的原理,不错不错。”面试官继续点点头“那咱们聊聊springcloud吧”
  “好的好的”,小武嘴上很自信,心里其实是比较慌的,因为springcloud有很多很多的组件,小武也不是完全知道每个组件的原理的,如果问的深了,那不就完了吗?
  “那你说说你对springcloud的理解吧?”面试官继续问道。
  “springcloud是一整套的微服务治理解决方案,从请求的流程来看,springcloud集成了zuul网关,feign客户端调用,ribbon负载均衡、eureka注册发现、hyrix熔断器、消息总线、配置管理等等组件,几乎涵盖了微服务遇到的所有问题的解决方案!当然这些组件的集成,都离不开springboot的starter…”小武简单的说道。
  “那你知道注册中心为什么不使用zookeeper,而是使用eureka吗?”面试官尝试性地问道。
  “这个正好我研究过,首先,因为zk是CAP模型中的CP模型,而我们在注册中心的需求中,可用性比一致性要重要很多,注册中心不能因为自身的任何原因破坏服务之间本身的可连通性,这是注册中心设计应该遵循的铁律。其次,zk是作为一个协调服务存在的,它的负载并不大,作为注册中心很容易超出负载,再有就是我们服务注册中心其实维护的是一个实时服务列表,服务列表不需要持久化的,所以zk的持久化操作会浪费很多资源,最后,据说zk在用于服务注册中心的时候,会有很多很多坑…”小武一副自信满满的样子说道。
  “嗯,挺好的”,面试官满意地点点头,“那今天的面试就到这里,你还有什么要问我的吗?”
  “我还会有后续的机会吗?”小武小心翼翼地问道。
  “你刚刚是哪只脚先跨进的门?”
  “这…不记得了…”
  “回去等通知吧…”
  “?????”
????

参考文章:
spring的钩子方法.
aspectj理解.

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值