专栏首页earthchen的专栏java面试知识要点汇总(框架)

java面试知识要点汇总(框架)

网上的常规与经典面试题汇总与答案—–框架

面试常考知识点

Spring

BeanFactory 和 ApplicationContext 有什么区别

  1. ApplicationContext 是 BeanFactory接口的子接口
  2. BeanFactory 采用的是延迟加载,第一次getBean的时候才会初始化Bean
  3. ApplicationContext是对BeanFactory的扩展,提供了更多的功能
    • 国际化处理
    • 事件传递
    • Bean自动装配
    • 各种不同应用层的Context实现

Spring Bean的生命周期

  1. 实例化一个Bean,也就是我们通常说的new
  2. 按照Spring上下文对实例化的Bean进行配置,也就是IOC注入
  3. 如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID
  4. 如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(),传递的是Spring工厂本身(可以用这个方法获取到其他Bean)
  5. 如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文,该方式同样可以实现步骤4,但比4更好,以为ApplicationContext是BeanFactory的子接口,有更多的实现方法
  6. 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用After方法,也可用于内存或缓存技术
  7. 如果这个Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法
  8. 如果这个Bean关联了BeanPostProcessor接口,将会调用postAfterInitialization(Object obj, String s)方法 注意:以上工作完成以后就可以用这个Bean了,那这个Bean是一个single的,所以一般情况下我们调用同一个ID的Bean会是在内容地址相同的实例
  9. 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean接口,会调用其实现的destroy方法
  10. 最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法

以BeanFactory为例,说明一个Bean的生命周期活动

  1. Bean的建立, 由BeanFactory读取Bean定义文件,并生成各个实例
  2. Setter注入,执行Bean的属性依赖注入
  3. BeanNameAware的setBeanName(), 如果实现该接口,则执行其setBeanName方法
  4. BeanFactoryAware的setBeanFactory(),如果实现该接口,则执行其setBeanFactory方法
  5. BeanPostProcessor的processBeforeInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processBeforeInitialization()方法
  6. InitializingBean的afterPropertiesSet(),如果实现了该接口,则执行其afterPropertiesSet()方法
  7. Bean定义文件中定义init-method
  8. BeanPostProcessors的processAfterInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processAfterInitialization()方法
  9. DisposableBean的destroy(),在容器关闭时,如果Bean类实现了该接口,则执行它的destroy()方法
  10. Bean定义文件中定义destroy-method,在容器关闭时,可以在Bean定义文件中使用“destory-method”定义的方法

如果使用ApplicationContext来维护一个Bean的生命周期,则基本上与上边的流程相同,只不过在执行BeanNameAware的setBeanName()后,若有Bean类实现了org.springframework.context.ApplicationContextAware接口,则执行其setApplicationContext()方法,然后再进行BeanPostProcessors的processBeforeInitialization()实际上,ApplicationContext除了向BeanFactory那样维护容器外,还提供了更加丰富的框架功能,如Bean的消息,事件处理机制等

Spring IOC 如何实现

https://www.cnblogs.com/ITtangtang/p/3978349.html

说说 Spring AOP

AOP技术利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

实现原理:代理模式 https://www.jianshu.com/p/874acbfba73a

动态代理

https://www.cnblogs.com/gonjan-blog/p/6685611.html

Spring 事务实现方式

事务的ACID特性

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

事务的传播特性

Spring定义了7中传播行为

  • propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是Spring默认的选择。
  • propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行
  • propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
  • propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
  • propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
  • propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常
  • propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作

事务的隔离级别

  • read uncommited(读未提交):是最低的事务隔离级别,它允许另外一个事务可以看到这个事务未提交的数据
  • read commited(读已提交):保证一个事物提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据。
  • repeatable read(可重复读):这种事务隔离级别可以防止脏读,不可重复读。但是可能会出现幻象读。它除了保证一个事务不能被另外一个事务读取未提交的数据之外还避免了以下情况产生(不可重复读)
  • serializable(串行化):这是花费最高代价但最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读之外,还避免了幻象读

四种隔离级别最高:Seralizable级别,最低的是Read uncommitted级别; 级别越高,执行效率就越低; 隔离级别的设置只对当前链接有效,对JDBC操作数据库来说,一个Connection对象相当于一个链接,只对该Connection对象设置的隔离级别只对该connection对象有效,与其它链接connection对象无关。

事务几种实现方式

  • 编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。
  • 基于 TransactionProxyFactoryBean的声明式事务管理
  • 基于 @Transactional 的声明式事务管理
  • 基于Aspectj AOP配置事务

SpringMvc的运行流程

  1. 用户发送请求到DispatchServlet
  2. DispatchServlet根据请求路径查询具体的Handler
  3. HandlerMapping返回一个HandlerExcutionChain给DispatchServlet HandlerExcutionChain:Handler和Interceptor集合
  4. DispatchServlet调用HandlerAdapter适配器
  5. HandlerAdapter调用具体的Handler处理业务
  6. Handler处理结束返回一个具体的ModelAndView给适配器 ModelAndView:model–>数据模型,view–>视图名称
  7. 适配器将ModelAndView给DispatchServlet
  8. DispatchServlet把视图名称给ViewResolver视图解析器
  9. ViewResolver返回一个具体的视图给DispatchServlet
  10. 渲染视图
  11. 展示给用户

Spring MVC 启动流程

https://blog.csdn.net/ahou2468/article/details/69948990

Spring 的单例实现原理

Spring框架对单例的支持是采用单例注册表的方式进行实现

https://www.cnblogs.com/qianzf/p/6793138.html

Spring 框架中用到了哪些设计模式

简单工厂

spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定

工厂方法(Factory Method)

一般情况下,应用程序有自己的工厂对象来创建bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean

单例模式(Singleton)

保证一个类仅有一个实例,并提供一个访问它的全局访问点。 spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为spring管理的是是任意的java对象。

适配器(Adapter)

包装器(Decorator)

代理(Proxy)

spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。

观察者(Observer)

spring中Observer模式常用的地方是listener的实现。如ApplicationListener。

策略(Strategy)

spring中在实例化对象的时候用到Strategy模式在SimpleInstantiationStrategy中有如下代码说明了策略模式的使用情况

模板方法(Template Method)

spring中的JdbcTemplate

Netty

为什么选择 Netty

  • API使用简单,开发门槛低。
  • 功能强大,预置了多种编解码功能,支持多种协议开发。
  • 定制能力强,可以通过ChannelHadler进行扩展。
  • 性能高,对比其它NIO框架,Netty综合性能最优。
  • 经历了大规模的应用验证。在互联网、大数据、网络游戏、企业应用、电信软件得到成功,很多著名的框架通信底层就用了Netty,比如Dubbo
  • 稳定,修复了NIO出现的所有Bug。
  • 切换IO和NIO,因为IO和NIO的API完全不同,相互切换非常困难。

TCP 粘包/拆包

一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。

TCP粘包/拆包发生的原因

  • 应用程序write写入的字节大小大于套接口发送缓冲区大小
  • 进行MSS大小的TCP分段
  • 以太网帧的payload大于MTU进行IP分片

粘包问题的解决策略

由于底层的TCP无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈设计来解决,根据业界的主流协议的解决方案,可以归纳如下。

  • 消息定长,例如每个报文的大小为固定长度200字节,如果不够,空位补空格;
  • 在包尾增加回车换行符进行分割,例如FTP协议
  • 将消息分为消息头和消息体,消息头中包含表示消息总长度(或者消息体长度)的字段,通常设计思路为消息头的第一个字段使用int32来表示消息的总长度
  • 更复杂的应用层协议

Netty 线程模型

https://blog.csdn.net/cj2580/article/details/78124780

Netty 的零拷贝

https://blog.csdn.net/linsongbin1/article/details/77650105

Netty 内部执行流程

https://blog.csdn.net/Truong/article/details/62231036

Netty 实现心跳机制与断线重连

https://segmentfault.com/a/1190000006931568

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java面试知识点汇总

    版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址:http://blog.csdn.n...

    方志朋
  • java面试知识要点汇总(线程和锁)

    实现Runnable和实现Callable接口的方式基本相同,不过是后者执行call()方法有返回值,后者线程执行体run()方法无返回值,因此可以把这两种方式...

    earthchen
  • java面试知识要点汇总(基础和集合)

    反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许对其内部成员进行操作。反射机制提供的功能主要有:得到一个对象所属的类;获取...

    earthchen
  • java面试知识要点汇总(web和数据库)

    https://my.oschina.net/u/1774673/blog/871912

    earthchen
  • java面试知识要点汇总(分布式和微服务)

    https://www.cnblogs.com/LBSer/p/4853234.html

    earthchen
  • java面试知识要点汇总(缓存和消息队列)

    Redis的string可以包含任何数据,比如jpg图片(生成二进制)或者序列化的对象。

    earthchen
  • 2020Java高频面试题--Java知识点汇总

    Java Virtual Machine(JVM)是一个抽象的计算机,能够执行Java字节码。能针对不同的软件和硬件提供不同的JVM。因此JVM是平台独立的,J...

    宇宙之一粟
  • Java面试高频知识点汇总 JVM专题

    Java虚拟机在执行Java程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK1.8和之前的版本有所不同。

    Steve Wang
  • Java面试通关要点汇总集之框架篇参考答案

    小小明童鞋
  • Java面试知识点总结

    《Think in Java》中说:“关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”。 “==”判断的是两个对象的内存地址是否一样...

    java干货
  • Java面试通关要点 汇总集

    首先,声明下,以下知识点并非阿里的面试题。这里,笔者结合自己过往的面试经验,整理了一些核心的知识清单,帮助读者更好地回顾与复习 Java 服务端核心技术。本文会...

    Java技术江湖
  • thinkPHP5框架路由常用知识点汇总

    本文实例讲述了thinkPHP5框架路由常用知识点。分享给大家供大家参考,具体如下:

    砸漏
  • Java面试——开源框架知识

    【1】模块组成结构:Tomcat 的核心组件就 Connector 和 Container,一个Connector+一个Container(Engine)构成一...

    Java架构师必看
  • Java面试高频知识点汇总 数据库专题

    MySQL的默认存储引擎是InnoDB,并且在5.7版本的所有存储引擎中只有InnoDB是事务性存储引擎,也就是说只有InnoDB支持事务。

    Steve Wang
  • 2018-04-16 Java面试通关要点汇总集2018年最新 Java面试通关要点汇总集

    2018年最新 Java面试通关要点汇总集 基础篇 基本功 面向对象的特征 final, finally, finalize 的区别 int 和 Integ...

    Albert陈凯
  • ES6面试、复习干货知识点汇总

    https://juejin.cn/post/6844903734464495623

    @超人
  • Java面试高频知识点汇总 网络协议专题

    TCP提供面向连接的服务。数据传送之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播或者多播服务。

    Steve Wang
  • Java基础面试知识点总结

    本文主要是我最近复习Java基础原理过程中写的Java基础学习总结。Java的知识点其实非常多,并且有些知识点比较难以理解,有时候我们自以为理解了某些内容,其实...

    黄小斜学Java
  • java面试需要掌握知识点

    重点知识 由于我面试的JAVA开发工程师,针对于JAVA,需要理解的重点内容有: JVM内存管理机制和垃圾回收机制(基本每次面试都会问,一定要搞得透彻) JVM...

    Java高级架构

扫码关注云+社区

领取腾讯云代金券