Java经典面试题整理及答案详解(四)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Java经典面试题第四弹来啦!本节小编整理了关于Java开发框架常见的面试题,希望大家多多怜惜,一起进步~

上一篇:Java经典面试题整理及答案详解(三)
Java经典面试题第四弹来啦!本节小编整理了关于Java开发框架常见的几道面试题,希望大家多多练习,一起进步~

1.SpringMVC返回值,使用SpringMVC的时候我看到两种风格的开发,一种是控制层的方法返回值类型主要是ModelAndView(就如我们的BSM项目),另外一种风格是返回值Spring类型,在开发中要怎么取舍?

从简单来讲就是ModelAndView,如果只是做一个过渡,符合MVC标准设计,可能有人就会认为返回ModelAndView需要实例化新对象太麻烦了,就直接返回String。
MVC的设计角度在于你需要通过控制层传输相应的对象信息给显示层来进行显示,而且业务层也会返回Map数据,这个时候就希望可以把Map的数据直接传递到JSP里面,这样的话使用ModelAndView就很简单。最关键的是ModelAndView整体的处理来讲是很容易的,只是一个跳转的页面路径,以及相关的属性设置,可以帮助一些基础不牢固的人员不使用错误的属性范围,例如:request。(如果要想更好的理解细节,那么就必须在项目之中感受。)

2.Hibernate是不是只能与Struts2组合才好?我怎么没看到SpringMVC+Hibernate的组合?

Hibernate实现的是一个数据层的开发框架,数据层是不会与MVC层产生任何直接联系,必须通过控制层与业务层来进行操作的处理后才可以使用。
最初的时候(2005)开始流行这个框架开发,使用最多的就是Struts1.X、Hibernate、Spring,而后就形成SSH的开发框架。现在的环境出现了改变,因为MyBatis出现之后会有人觉得Hibernate操作过于频繁,而MyBatis的开发更加简单。正因为如此,对于整体新项目设计而言就不会再过多的去考虑Hibernate了,基本上都是使用MyBatis开发框架。同时,在这个时期之后SpringMVC开始流行了,因为Struts毕竟需要与Spring整合,有人认为麻烦,现在对于开发就可能有如下几种结构:
Struts 2.X+Hibernate+Spring;
Struts 2.X+MyBatis+Spring;
SpringMVC+Hibernate;
SpringMVC+MyBatis。

3.SSH整合

SSH整合实际上需要考虑到一个核心的问题:Struts之所以要整合到Spring之中主要是希望可以利用里面的IOC&DI机制实现业务层接口对象的注入处理,如果不使用Spring去管理Struts,那么无法直接利用容器注入的模式来实现业务层接口对象的配置,这样整个的整合效果就会出现严重的问题。
从另外一个角度来讲,虽然Struts支持Spring管理,但毕竟Spring属于两个开发框架,所以从2016年开始许多互联网公司的开发都不再选择使用Struts 2.x,但这并不表示Struts 2.x没有人使用,许多传统公司还在使用着。

4.ShiroRealm机制

Realm是几乎所有的认证授权框架都具备的一个概念,Realm本身有两层含义:
(1)进行用户的认证处理:主要是进行用户名或密码的判断,同时还可以判断出该用户是否被锁定;
(2)用户的授权处理:进行角色或权限认证,而且这里的认证所需要的就是根据用户名查询角色或权限标记。对于授权处理需要一些特殊处理方式:授权的操作在实际检测之中有两类:
——实时授权检测:修改了一个用户的角色或权限之后该配置立即生效,而且立即影响到已登陆的用户,这样的操作需要频繁进行数据库的查询处理,所以一般不建议使用;
——非实时授权检测:因为用户的角色和权限几乎很少会被改动,所以这样频繁的进行数据库的查询,性能会比较差。在实际开发之中,会考虑在用户第一次使用角色和权限的时候将数据信息查询出来。如果是单节点,会将授权信息保存在内存里(EhCache),如果是分布式集群,会将这些信息保存在Redis里面,总之就一个原则,不要在用户授权检测的时候重复查询数据库即可。
总结:ShiroRealm有一套自己的Session,在WEB中该Session会在HttpSession里面保存数据,但用户看不见这些。所有的授权处理一定要使用缓存,否则会影响程序性能。

5.Shiro中的Session与HttpSession的关系是什么?
如果说你现在使用的不是WEB程序,而是一个Java程序,那么Shiro中的认证与授权依然有效。可以得出一个结论:Shiro有一套自己维护的“Session”机制(不等同于HttpSession),如果要在WEB中应用,实际上就表示该Shiro Session要结合HttpSession一起使用,也就是说在Shiro Session中保存的内容在WEB容器里面实质上是保存在了HttpSession里面。
理解为:HttpSession中存在一个指定的Shiro属性,Shiro在设计的时候考虑到了用户的使用习惯,所以对于一些用户的身份信息,会将这些身份信息保存在Session里面,用户也可以直接利用Session属性取得相关的身份信息。

6.Shiro与Redis整合操作

前提是你的系统之中有多个WEB容器,并且使用了负载均衡,例如:Nginx。
image.png
如果要想实现Session数据的共享,那么需要继承一个默认的企业SsessionDAO管理器:
image.png
里面就是针对Redis数据的CRUD操作。

如果要想实现缓存数据的共享(角色或者权限),那么就去继承一个默认的缓存管理器:

image.png
CacheManager、同时还需要去实现一个Cache的接口的子类才可以实现这样的共享操作。
在整个流程之中你还需要考虑Tomcat的Session缓存。
image.png
如果想要实现缓存:需要知道Nginx、Shiro的具体操作类的方法、Jedis工具类、Redis使用,这样才能去做集群的Session的缓存处理过程。

更多专业知识,面试技巧就在面试一点通,持续更新中……
感谢浏览~
本内容来源于阿里云大学-Java面试技巧

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
77 2
|
28天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
67 14
|
1月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
1月前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
36 6
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
72 4
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
135 4
|
2月前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
125 1
Java面试题之Java集合面试题 50道(带答案)
|
2月前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
73 5