当前位置:首页 > 2018最新Java面试题整理
2.3 消息队列
2.3.1 消息队列的使用场景
主要解决应用耦合,异步消息,流量削锋等问题 消息队列使用的四种场景介绍
2.3.2 消息的重发补偿解决思路
参考:
JMS消息传送机制
2.3.3 消息的幂等性解决思路
参考:
MQ之如何做到消息幂等
2.3.4 消息的堆积解决思路
参考:
Sun Java System Message Queue 3.7 UR1 管理指南
2.3.5 自己如何实现消息队列
参考:
自己动手实现消息队列之JMS
2.3.6 如何保证消息的有序性
参考:
消息队列的exclusive consumer功能是如何保证消息有序和防止脑裂的
3 框架篇
3.1 Spring
3.1.1 BeanFactory 和 ApplicationContext 有什么区别
beanfactory顾名思义,它的核心概念就是bean工厂,用作于bean生命周期的管理,而applicationcontext这个概念就比较丰富了,单看名字(应用上下文)就能看出它包含的范围更广,它继承自bean factory但不仅仅是继承自这一个接口,还有继承了其他的接口,所以它不仅仅有bean factory相关概念,更是一个应用系统的上下文,其设计初衷应该是一个包罗万象的对外暴露的一个综合的API。
3.1.2 Spring Bean 的生命周期
参考:
Spring Bean生命周期详解
3.1.3 Spring IOC 如何实现
参考:
Spring:源码解读Spring IOC原理
3.1.4 说说 Spring AOP
参考:
Spring AOP详解
3.1.5 Spring AOP 实现原理
参考:
Spring AOP 实现原理
3.1.6 动态代理(cglib 与 JDK)
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
如何强制使用CGLIB实现AOP?
(1)添加CGLIB库,SPRING_HOME/cglib/*.jar (2)在spring配置文件中加入
JDK动态代理和CGLIB字节码生成的区别?
(1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类
(2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 因为是继承,所以该类或方法最好不要声明成final 参考:
Spring的两种代理JDK和CGLIB的区别浅谈
3.1.7 Spring 事务实现方式
参考:
Spring事务管理实现方式之编程式事务与声明式事务详解
3.1.8 Spring 事务底层原理
参考:
深入理解 Spring 事务原理
3.1.9 如何自定义注解实现功能
可以结合spring的AOP,对注解进行拦截,提取注解。
大致流程为:
1. 新建一个注解@MyLog,加在需要注解申明的方法上面
2. 新建一个类MyLogAspect,通过@Aspect注解使该类成为切面类。
3. 通过@Pointcut 指定切入点 ,这里指定的切入点为MyLog注解类型,也就是被@MyLog注解修饰的方法,进入该切入点。
4. MyLogAspect中的方法通过加通知注解(@Before、@Around、@AfterReturning、@AfterThrowing、@After等各种通知)指定要做的业务操作。
3.1.10 Spring MVC 运行流程
一、先用文字描述
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.展示给用户 二、画图解析
SpringMvc的配置
3.1.11 Spring MVC 启动流程
参考:
SpringMVC启动过程详解(li)
3.1.12 Spring 的单例实现原理
参考:
Spring的单例模式底层实现
3.1.13 Spring 框架中用到了哪些设计模式
Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式—在AOP和remoting中被用的比较多。
单例模式—在spring配置文件中定义的bean默认为单例模式。
模板方法—用来解决代码重复的问题RestTemplate, JmsTemplate, JpaTemplate。
比如.
。工厂模式—BeanFactory用来创建对象的实例。 适配器–spring aop
装饰器–spring data hashmapper 观察者– spring 时间驱动模型
回调–Spring ResourceLoaderAware回调接口
前端控制器–spring用前端控制器DispatcherServlet对请求进行分发
3.1.14 Spring 其他产品(Srping Boot、Spring Cloud、Spring
Secuirity、Spring Data、Spring AMQP 等)
参考:
说一说Spring家族
3.2 Netty
3.2.1 为什么选择 Netty
Netty 是业界最流行的 NIO 框架之一,它的健壮性、功能、性能、可定制性和可扩展性在同类框架中都是首屈一指的,它已经得到成百上千的商用项目验证,例如 Hadoop 的 RPC 框架 Avro 使用 Netty 作为通信框架。很多其它业界主流的 RPC 和分布式服务框架,也使用 Netty 来构建高性能的异步通信能力。 Netty 的优点总结如下: API 使用简单,开发门槛低;
功能强大,预置了多种编解码功能,支持多种主流协议;
定制能力强,可以通过 ChannelHandler 对通信框架进行灵活的扩展; 性能高,通过与其它业界主流的 NIO 框架对比,Netty 的综合性能最优;
社区活跃,版本迭代周期短,发现的 BUG 可以被及时修复,同时,更多的新功能会被加入; 经历了大规模的商业应用考验,质量得到验证。在互联网、大数据、网络游戏、企业应用、电信软件等众多行业得到成功商用,证明了它完全满足不同行业的商用标准。 正是因为这些优点,Netty 逐渐成为 Java NIO 编程的首选框架。
3.2.2 说说业务中,Netty 的使用场景
有关“为何选择Netty”的11个疑问及解答
3.2.3 原生的 NIO 在 JDK 1.7 版本存在 epoll bug
它会导致Selector空轮询,最终导致CPU 100%。官方声称在JDK1.6版本的update18修复了该问题,但是直到JDK1.7版本该问题仍旧存在,只不过该BUG发生概率降低了一些而已,它并没有被根本解决。该BUG以及与该BUG相关的问题单可以参见以下链接内容。 http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6403933 http://bugs.java.com/bugdatabase/view_bug.do?bug_id=2147719 异常堆栈如下:
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:21
共分享92篇相关文档