Java常见笔试和面试题(四)
1.面向对象的基本特征
三大基本特征:
- 封装:封装就是隐藏对象的属性和方法,仅对外公开接口,只让可信的类和对象访问自己的数据和方法,对不可信的进行信息隐藏。
- 继承:子类可以从它的父类那里继承方法和变量,并且子类可以修改或增加新的方法使它适应子类的需求。
- 多态:同一个行为具有多个不同表现形式或形态的能力。是指一个类实例(对象)的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
简单来说,首先我们知道多态的存在的三个必要条件是:继承,重写,父类引用指向子类对象。满足这三个条件下,我们可以通过父类对象调用不同的子类中的方法,也就是父类调用那些被子类重写的方法时在父类引用指向不同的子类对象的情况下,有不同的表现形式,这就是多态。
- 抽象(具有一定的争议):抽象就是忽略一个主题中与当前目标无关的那些方面。抽象并不打算了解全部问题,而只是考虑其中的一部分。抽象包括两个方面,一是过程抽象,二是数据抽象。
2.什么是Redis?
Redis是基于内存结构的NoSql数据库:
1.内存结构,作为数据库缓存使用,以减轻数据库压力。
2.支持持久化,可以作为数据库独立使用。
3.Reids持久化配置方式有哪些?并简述策略
AOF:
策略:每秒执行一次持久化
优点:数据丢失风险较小
缺点:持久化频率较高,性能较低
RDB:例(”900 1 300 10 60 10000“)
策略:
- 满足特定的条件就触发持久化
- 60秒10000次Redis操作触发持久化
- 300秒10次Redis操作触发持久化
- 900秒1次Redis操作触发持久化
优点:持久化频率低,性能高
缺点:数据丢失风险较大
4.什么是Redis缓存击穿、缓存穿透、缓存雪崩?阐述解决方案
-
缓存击穿:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
解决方案:双重检测锁机制 -
缓存穿透:是指查询一个数据库不存在的数据。首先查询缓存,缓存中不存在则查询数据库,数据库中查询到的数据依然为空,设置到缓存中也为空;因此后续所有对此数据的查询都会先查询缓存,缓存不存在继而又查询数据库。
解决方案:在缓存中查询为空,且在数据库中查询也为空时,可以将key-value对写为key-null放入缓存,缓存有效时间可以设置较短。 -
缓存雪崩: 是指在某一个时间段,缓存集中过期失效,则大量的并发访问查询都落到了数据库上,加大了数据库的压力。
解决方案:缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
5.Shiro的核心组件有哪些?阐述其作用
三个核心组件:Subject, SecurityManager 和 Realms。
- Subject:
即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。 - SecurityManager:
它是Shiro框架的核心,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。 - Realms
1.Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
2.从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
3.Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
6.简述Shiro的认证流程
Shiro认证流程:
- 首先调用 Subject.login(token) 进行登录,其会自动委托给 Security Manager,调用之前必须通过
SecurityUtils.setSecurityManager() 设置; - SecurityManager 负责真正的身份验证逻辑;它会委托给 Authenticator 进行身份验证;
Authenticator 才是真正的身份验证者,Shiro API 中核心的身份认证入口点,此处可以自定义插入自己的实现; - Authenticator 可能会委托给相应的 AuthenticationStrategy 进行多 Realm 身份验证,默认ModularRealmAuthenticator 会调用 AuthenticationStrategy 进行多 Realm 身份验证;
- Authenticator 会把相应的 token 传入 Realm,从 Realm 获取身份验证信息,如果没有返回 /抛出异常表示身份验证失败了。此处可以配置多个 Realm,将按照相应的顺序及策略进行访问。
7.简述Shiro的授权流程
shiro授权流程:
- 构造SecurityManager环境后,对subject进行授权,调用方法isPermitted(”permission串”)
- SecurityManager执行授权,通过ModularRealmAuthorizer执行授权
- ModularRealmAuthorizer执行realm(自定义的CustomRealm)从数据库查询权限数据
调用realm的授权方法:doGetAuthorizationInfo - realm从数据库查询权限数据,返回ModularRealmAuthorizer
- ModularRealmAuthorizer调用PermissionResolver进行权限串比对
- 如果比对后,isPermitted中”permission串”在realm查询到权限数据中,说明用户访问permission串有权限,否则没有权限,抛出异常。
8.简述你对Spring Boot的理解
Spring Boot 可以称之为 新一代 JavaEE 开发标准;随着动态语言的流行 (Ruby、Groovy、Scala、Node.js),Java 的开发显得格外的笨重:繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度大。
在上述环境下,Spring Boot 应运而生。它使用 “习惯优于配置” (项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速的运行起来。使用 Spring Boot 很容易创建一个独立运行(运行 Jar,内嵌 Servlet 容器)准生产级别的基于 Spring 框架的项目,使用 Spring Boot 你可以不用或者只需很少的 Spring 配置。
转载:https://blog.csdn.net/qq_40409472/article/details/102545663