Java开发框架和中间件面试题(4)
27.如何自定义Spring Boot Starter?
1.实现功能
2.添加Properties
3.添加AutoConfiguration
4.添加spring.factory
在META INF下创建spring.factory文件
6.install
28.为什么需要spring boot maven plugin?
spring boot maven plugin 提供了一些像jar一样打包或者运行应用程序的命令。
1.spring boot:run 运行Spring Boot应用程序。
2.spring boot:repackage 重新打包你的jar包或者war包使其可执行。
3.spring boot:start和spring boot :stop 管理SpringBoot应用程序的生命周期。
4.spring boot :build info 生成执行器可以使用的构造信息。
29.Spring Boot打成的jar和普通的jar有什么区别?
SpringBoot项目最终打包成的jar是可执行jar,这种jar可以直接通过java jar XXX.jar命令来运行,这种jar不可以作为普通的jar被项目依赖,即使依赖了也无法使用其中的类。
SpringBoot的jar无法被其他项目依赖,主要还是他和普通jar的结构不同。普通的jar包,解压后直接就是包名,包里面就是我们的代码,而SpringBoot打包成的可执行jar解压后,在\BOOT\classes目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在pom.xml文件中增加配置,将SpringBoot项目打包成两个jar,一个可执行,一个可引用。
30.如何使用SpringBoot实现异常处理?
Spring提供了一种使用ControllerAdvice处理异常的非常有用的方法, 通过实现一个Controller Advice类,来处理控制类抛出的所有异常。
31.Spring Boot实现热部署有哪几种方式?
主要有两种方式:
Spring Loaded
Spring boot devtools
32.Spring boot中的监视器是什么?
SpringBoot acuator是Spring启动框架中重要功能之一。Spring Boot监视器可以帮助您访问生产环境中正在运行的应用程序的当前状态。
有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为HTTP URL访问的REST端点来检查状态。
33.SpringBoot可以兼容老Spring项目吗?
可以兼容,使用@ImportResource注解导入老Spring项目配置文件。
34.什么是Spring Security?核心功能?
Spring Security是基于Spring的安全框架。他提供全面的安全性解决方案,同时在Web请求级别和调用级别确认和授权。在Spring Framework基础上,Spring Security 充分利用了依赖注入(DI)和面向切面编程(AOP)功能,为应用系统提供声明式的安全访问控制功能,是一个轻量级的安全框架,并且很好集成Spring MVC。
Spring Security的核心功能主要包括:
认证:指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。
授权:指的是验证某个用户是否有权限执行某个操作。
攻击防护:指的是防止伪造身份。
35.Spring Security的原理?
1.基于Filter技术实现?
首先Spring Security是基于Filter技术实现的。Spring通过DelegatingFilterProxy建立Web容器和Spring ApplicationContext的联系,而SpringSecurity使用FilterChainProxy注册SecurityFilterChain。
2.认证模块的实现?
SecurityContextHolder(用于存储授权信息)
手动授权的例子:
(SecurityContextHolder.getContext().setAuthentication(authentication)这种授权方式多线程不安全):
除了手动授权外,SpringSecurity通过
AuthenticationManager和ProviderManager进行授权。其中AuthenticationProvider代表不同的认证机制(最常用的账号/密码)。
ProviderManager
AuthenticationManager
3.授权模块的实现?
认证完成之后,Spring Security通过AccessDecisionManager完成授权操作。除了全局的授权配置以外,也可以通过@PreAuthorize,@PreFilter,@PostAuthorize,@PostFilter注解实现方法级别的权限控制。
36.SpringSecurity基于用户名和密码的认证模式流程?
请求的用户名密码可以通过表单登陆,基础认证,数字认证三种方式从HttpServletRequest中获取,用于认证的数据源策略有内存,数据库,ldap,自定义灯。
拦截未授权的请求,重定向到登陆页面。
表单登陆的过程,进行账号密码认证。
37.什么是日志系统和日志门面?分别有哪些框架?
日志系统是具体的日志框架,日志门面是不提供日志的具体实现,而是在运行时动态绑定日志实现组件来工作,是一种外观模式。
日志系统
1.java.util.logging(JUL),JDK1.4开始,通过java.util.logging提供日志功能。虽然是官方自带的loglib,JUL的使用的确不广泛。
2.log4j,log4j是apache的一个开源项目,创始人Ceki Gulcu。log4j应该是java领域资格最老,应用最广的日志工具。log4j是高度可配置的,并可通过在运行时的外部文件配置。他根据记录的有限级别,并提供机制,以指示记录信息到许多的目的地,诸如:数据库,文件,控制台,UNIX系统日志等。Log4j的短板在于性能,在Log back和Log4j2出来之后,Log4j的使用也减少了。
3.Log back,Log back是由Log4j创始人设计的又一个开源的日志组件,是作为Log4j的继承者来开发的,提供了性能更好的实现,异步logger,Filter等更多的特性。
4.Log4j2,维护Log4j的人为了性能又搞出了Log4j2。Log4j2和Log4j1.X并不兼容,设计上很大程度上模仿了SLF4J/Logback,性能上也获得了很大的提升。Log4j也做了Facade/implementation分离的设计,分成了log4j api和log4j core。
日志门面
1.common logging,common logging是apache的一个开源项目。也成Jakarta Commons Logging,缩写JCL。
2.slf4j,全称为Simple Logging Facade for Java,即Java简单日志门面。作者又是Ceki Gulcu!这位大神写了Log4j,Log back和slf4j.类似于Common Logging,slf4j是对不同日志框架提供的一个API封装,可以在部署的时候怒修改任何配置即可接入一种日志实现方案。但是,slf4j在编译时静态绑定真正的Log库。使用SLF4j时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合(各种桥接包)。
38.什么是桥接呢?
假如你正在开发应用程序所调用的组件当中已经使用了common logging,这时你需要jcl over slf4j.jar把日志信息输出重定向到slf4j api ,slf4j api再去调用slf4j实际依赖的日志组件。这个过程称为桥接。下面是官方的slf4j桥接策略图:
从图中应该可以看出,无论你的老项目中使用的是common logging或者直接使用log4j,java.util.logging,都可以使用对应的桥接jar包来解决兼容问题。
1.slf4j兼容common logging
2.slf4j兼容log4j
39.在日志配置时会考虑哪些点?
1.支持日志路径,日志level等配置;
2.日志控制配置通过application.yml下发;
3.按天生成日志,当天的日志>50MB回滚;
4.最多保存10天日志;
5.生成的日志中Pattern自定义;
6.Pattern中添加用户自定义的MDC字段,比如用户信息(当前日志是由哪个用户的请求产生),request信息。此种方式可以通过AOP切面控制,在MDC中添加requestID,在Spring logback.xml中配置Pattern。
7.根据不同的运行环境设置Profile dev,test,product;
8.对控制台,Err和全量日志分别配置;
9.对第三方包路径日志控制。
40.对Java日志组件选型的建议?
slf4j已经成为了Java日志组件的明星选手,可以完美替代JCL,使用JCL桥接库也能完美兼容一切使用JCL作为日志门面的类库,现在的新系统已经没有不使用slf4j作为日志API的理由了。
日志记录服务方面,log4j在功能上输于log back和log4j,在性能方面log4j则全面超越logback和log4j。所以新系统应该在logback和log4j中作出选择,对于性能有很高要求的系统,应优先考虑log4j。
41.对日志框架使用比较好的实践?
说几个点:
1.总是使用Log Facade,而不是具体的Log implementation
2.只添加一个Log implementation依赖
3.具体的日志实现依赖应该设置为optional和使用runtime scope
4.如果有必要,排除依赖的第三方库中的Log implementation依赖
5.避免为不会输出的log付出代价
6.日志格式中最好不要使用行号,函数名等字段。
42.对现有系统日志架构的改造建议?
如果现有系统使用JCL作为日志门面,又确实面临着JCL的ClassLoader机制带来的问题,完全可以引入slf4j并通过桥接库将JCL api输出的日志桥接至slf4j,再通过适配库配置至现有的日志输出服务(log4j),如下图:
这样子做不需要任何代码级的改造,就可以解决JCL的ClassLoader带来的问题,但没有办法享受日志模板等slf4j的api带来的有点。不过之后在现系统上开发的新功能就可以使用slf4j的api了,来代码也可以分批进行改造。
如果现有系统使用JCL作为日志门面,又头疼JCL不支持log back和log4j2等新的日志服务,也可以通过桥接库以slf4j替代JCL,但是同样无法直接享受slf4j API的优点。
如果想要使用slf4j的API,那么就不得不进行代码改造了,当然改造也可以参考1中提到的方式逐步进行。
如果现系统面临着log4j的性能问题,可以使用Apache Logging提供的log4j到log4j2的桥接库log4j 1.2 api,把通过log通过log4j api输出的日志桥接至log4j2.这样子可以最快地使用上log4j2的先进性能,但是组件中缺失了slf4j,对后续进行日志框架改造的灵活性有影响。另一种办法是先把log4j桥接至slf4j,再使用slf4j到log4j2的适配库。这样子做稍微麻烦了点,但可以逐步将系统中的日志输出标准化为使用slf4j的API,为后面的工作打好基础。
43.Tomcat 整体架构的设计?
从组件的角度看:
1.Server:表示服务器,他提供了一种优雅的方式来启动和停止整个系统,不必单独启停连接器和容器;他是Tomcat构成的顶级构成元素,所有一切均包含在Server中;
2.Service:表示服务,Server可以运行多个服务。比如一个Tomcat里面可以运行订单服务,支付服务,用户服务等等;Server的实现累StandardServer可以包含一个到多个Services,Service的实现类为StandardService调用了容器(Container)接口,其实是调用了Servlet Engine(引擎),而且StandardService类中也指明了该Service归属Service;
3.Container:表示容器,可以看作Servlet容器;引擎(Engine),主机(Host),上下文(Context)和Wraper均即继承子Container接口,所以他们都是容器。
Engine:引擎
Host:主机
Context:上下文
Wrapper:包装器
4.Connector:表示连接器,他将Service和Container连接起来,首先他需要注册到一个Service,他的作用就是把来自客户端的请求转发到Container(容器),这就是他为什么乘坐连接器,他支持的协议如下:
支持AJP协议
支持Http协议
支持Https协议
5.Service内部还有各种支撑组件,下面简单罗列一下这些组件。
Manager:管理器,用于管理会话Session
Logger:日志器,用于管理日志
Loader:加载器,和类加载有关,只会开放给Context所使用
Pipeline:管道组件,配合Value实现过滤器功能
Valve:阀门组件,配合Pipeline实现过滤功能
Realm:认证授权组件
相关文章:
Java开发框架和中间件面试题(4)
27.如何自定义Spring Boot Starter? 1.实现功能 2.添加Properties 3.添加AutoConfiguration 4.添加spring.factory 在META INF下创建spring.factory文件 6.install 28.为什么需要spring boot maven plugin? spring boot maven plugin 提供了一些像jar一样打包…...
【腾讯云中间件】2023年热门文章集锦
各位读者,大家好! 光阴似箭,日月如梭,仿佛冬奥会的盛况还在眼前,新的一年却即将到来。在过去的一年里,我们见证了腾讯云中间件在产品升级与创新方面的显著进步,包括消息队列TDMQ品牌全新升级和…...
SpringBoot 实现订单30分钟自动取消的策略
简介 在电商和其他涉及到在线支付的应用中,通常需要实现一个功能:如果用户在生成订单后的一定时间内未完成支付,系统将自动取消该订单。 本文将详细介绍基于Spring Boot框架实现订单30分钟内未支付自动取消的几种方案,并提供实例…...
Qt篇——QwtPainter::drawPie绘制扇形
QwtPainter::drawPie(QPainter *painter, const QRectF &rect, int startAngle, int angle); 一、参数含义: painter: 重绘函数中的painter对象 rect: 要绘制扇形的圆的外切矩形。 startAngle: 要绘制的扇形的起始角 …...
Mybatis Java API - SqlSession
正如前面提到的,SqlSession实例是MyBatis中最重要、最强大的类。它是您将找到执行语句、提交或回滚事务以及获取映射器实例的所有方法的地方。 SqlSession 类上有超过二十个方法,让我们将它们分成更易理解的组别。 Statement Execution Methods-语…...
java freemarker 动态生成excel文件
好久木有更新啦 抓住2023的小尾巴 浅浅更新一下吧~ 最近做了一个动态生成excel的功能,这里记录下部分功能,主要用到的是freemarker框架,spring就有带,我起的demo载入了一下freemarker的jar包 一、创建模板 首先可以创建一个e…...
第38节: Vue3 鼠标按钮修改器
在UniApp中使用Vue3框架时,你可以使用按键修饰符来更精确地处理键盘事件。以下是一个示例,演示了如何在UniApp中使用Vue3框架使用.left、.right和.middle按键修饰符: <template> <view> <input keydown"handleKeyDown&…...
redis cluster判断key属于那个分片。
一、判断阿里云 redis cluster,的key属于那个分片。 阿里云特有的命令info key 可以查看key属于那个slot,那个分片 命令行查看: xxxx:6379> info key xxxx_compressed_xxx slot:4941 node_index:9 xxxx:6379> cluster keyslot xxxx_…...
Centos7:Jenkins+gitlab+node项目启动(3)
Centos7:Jenkinsgitlabnode项目启动(1) Centos7:Jenkinsgitlabnode项目启动(1)-CSDN博客 Centos7:Jenkinsgitlabnode项目启动(2) Centos7:Jenkinsgitlabnode项目启动(2)-CSDN博客 Centos7:Jenkinsgitlabnode项目启…...
Linux安装GitLab教程
Linux安装GitLab教程 1、配置yum源 相当于新建一个文件,通过这个文件来安装gitlab vim /etc/yum.repos.d/gitlab-ce.repo 把这些配置粘进去 [gitlab-ce] nameGitlab CE Repository baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/ gp…...
react 之 美团案例
1.案例展示 2.环境搭建 克隆项目到本地(内置了基础静态组件和模版) git clone http://git.itcast.cn/heimaqianduan/redux-meituan.git 安装所有依赖 npm i 启动mock服务(内置了json-server) npm run serve 启动前端服务 npm…...
C基础使用
return 0; 语句用于表示退出程序。 一个程序有且只能有一个main函数的存在 安装编译环境: 安装vim: ubuntu里vim编辑器使用方法_ubuntu vim-CSDN博客 编译与运行: gcc hello.c //编译源文件 ./a.out //运行…...
Linux网络编程——Socket编程步骤及常用API
Sockt服务器和客户端的开发步骤 TCP connect()最好建立在listen()后,一旦监听到就建立连接。 UDP 常用API 包含头文件 #include<sys/types.h> #include<sys/socket.h>创建套接字(连接协议) 作用 用于根据指定的地址族、数据…...
数据挖掘 K-Means聚类
未格式化之前的代码: import pandas as pd#数据处理 from matplotlib import pyplot as plt#绘图 from sklearn.preprocessing import MinMaxScaler#归一化 from sklearn.cluster import KMeans#聚类 import os#处理文件os.environ["OMP_NUM_THREADS"] …...
医疗卫生行业网络安全需求发展
文章目录 一、行业安全建设需求分析1、等级保护2.0合规建设云计算技术大数据技术物联网技术移动互联网技术2、加强医疗数据安全保护加密存储与传输数据加强数据备份与恢复注重数据脱敏与分级保护3、强化网络安全制度管理完善应急预案与响应机制加强网络安全人员管理二、行业新技…...
【Unity热更新】学会AssetsBundle打包、加载、卸载
本教程详细讲解什么是AssetBundle压缩包机制!然后构建 AssetBundle、加载 AssetBundle 以及卸载 AssetBundle 的简要教程。这一个流程就是热更新! AssetBundles 简介 1.什么是AssetBundles? AssetBundles是Unity中一种用于打包和存储资源(如模型、纹理、声音等)的文件格…...
智能优化算法应用:基于指数分布算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于指数分布算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于指数分布算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.指数分布算法4.实验参数设定5.算法结果6.…...
vue 监听浏览器关闭或刷新事件
vue 监听浏览器关闭或刷新事件 需求 web项目中使用socket时,涉及到关闭刷新浏览器多次连接问题,其中一个解决方法是在关闭或刷新浏览器时,将连接断开。 代码 <script> export default {// 可以在created、beforeMount或mounted生命…...
VuePress-theme-hope 搭建个人博客 2【快速上手】 —— 安装、部署 防止踩坑篇
续👆VuePress、VuePress-theme-hope 搭建个人博客 1【快速上手】 项目常用命令 vuepress dev [dir] 会启动一个开发服务器,以便让你在本地开发你的 VuePress 站点。vuepress build [dir] 会将你的 VuePress 站点构建成静态文件,以便你进行后…...
ClickHouse基础知识(四):ClickHouse 引擎详解
1. 表引擎的使用 表引擎是 ClickHouse 的一大特色。可以说, 表引擎决定了如何存储表的数据。包括: ➢ 数据的存储方式和位置,写到哪里以及从哪里读取数据。 默认存放在/var/lib/clickhouse/data ➢ 支持哪些查询以及如何支持。 ➢ 并发数…...
关于设计模式、Java基础面试题
前言 之前为了准备面试,收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文:https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv 设计模式 单例共有几种写法? 细分起来就有9种:懒汉&#x…...
Python爱心光波完整代码
文章目录 环境需求完整代码详细分析环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.blog.csdn.net/arti…...
PowerShell Instal 一键部署gitea
gitea 前言 Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。 Gitea 最初是从 Gogs 分支而来…...
C语言——指针题目“指针探测器“
如果你觉得你指针学的自我感觉良好,甚至已经到达了炉火纯青的地步,不妨来试试这道题目? #include<stdio.h> int main() {char* c[] { "ENTER","NEW","POINT","FIRST" };char** cp[] { c 3…...
Hive讲课笔记:内部表与外部表
文章目录 一、导言二、内部表1.1 什么是内部表1.1.1 内部表的定义1.1.2 内部表的关键特性 1.2 创建与操作内部表1.2.1 创建并查看数据库1.2.2 在park数据库里创建student表1.2.3 在student表插入一条记录1.2.4 通过HDFS WebUI查看数据库与表 三、外部表2.1 什么是外部表2.2 创建…...
Docker本地部署开源浏览器Firefox并远程访问进行测试
文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器,由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…...
PHP:服务器端脚本语言的瑰宝
PHP(Hypertext Preprocessor)是一种广泛应用于服务器端编程的开源脚本语言,它以其简单易学、灵活性和强大的功能而成为Web开发的瑰宝。本文将深入介绍PHP的历史、特性、用途以及与生态系统的关系,为读者提供对这门语言全面的了解。…...
【MySQL】数据库并发控制:悲观锁与乐观锁的深入解析
🍎个人博客:个人主页 🏆个人专栏: 数 据 库 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 悲观锁(Pessimistic Locking): 乐观锁(Optimistic Locking): 总结&#x…...
作业--day38
1.定义一个Person类,包含私有成员,int *age,string &name,一个Stu类,包含私有成员double *score,Person p1,写出Person类和Stu类的特殊成员函数,并写一个Stu的show函数ÿ…...
pytest 的 fixture 固件机制
一、前置说明 固件(fixture)是一些函数,pytest 会在执行测试函数之前(或之后)加载运行它们。pytest 使用 fixture 固件机制来实现测试的前置和后置操作,可以方便地设置和共享测试环境。 二、操作步骤 1. 编写测试代码 atme/demos/demo_pytest_tutorials/test_pytest_…...
开发一个商城网站多少钱/淘宝运营培训
/******************************************************************** linux 读取input输入设备demo* 说明:* 本文主要是解读以前同事写的input设备的一个demo程序。** 2016-3-24 深圳 南山平山村 曾剑锋…...
网站设计工资待遇/长沙网站建设
1.0 2.0 3.0 uncomplex未压缩版本很多空格 换行 利于阅读 complex压缩版本 下载jqurey库 http://code.jqurey.com/引入下载的jqurey库编写代码 jq入口函数有三种写法 jq冲突问题...
安全联盟这种网站建设/列举五种网络营销模式
1、申请方式 (1)栈(stack):由系统自动分配。 (2)堆(heap):需程序员自己申请(C:调用malloc,realloc,calloc申请…...
网站建设工作讲话/百度风云榜官网
在使用Maven的过程中,经常会遇到几个核心的概念,准确的理解这些概念将会有莫大的帮助。 1. POM(Project Object Model)项目对象模型 POM 与 Java 代码实现了解耦,当需要升级版本时,只需要修改POM,而不需要更改Java代码…...
网站在建设中模板下载/搜索引擎推广实训
人脸识别学生考勤系统的登录界面设计如上图所示,关键部分为圈红色的位置。 用户名,密码—登录 登录成功目前没有写跳转页面,只是在终端输出“success”,登录失败会在忘记密码按钮的下方显示“用户名密码输入错误”,然后…...