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:认证授权组件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/266305.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

优先级队列与仿函数

优先级队列 优先级队列 priority_queue 是一种容器适配器&#xff0c;听起来是队列&#xff0c;其实它的底层数据结构是堆&#xff0c;所谓的优先级为默认越大的数优先级越高&#xff0c;即默认为大堆。 使用方式如下面的代码&#xff1a; #include<iostream> #includ…

做抖店需要保证金吗?总共需要多少资金?具体资金投入如下!

我是电商珠珠 做抖店需要保证金吗&#xff1f;这是很多想要入驻的新手常问的问题。我的回答是&#xff0c;需要&#xff01; 抖店平台之所以设立保证金&#xff0c;就是为了约束商家的行为&#xff0c;避免交易市场出现混乱&#xff0c;给用户一个良好的购物体验。 今天呢&a…

【性能优化】MySql数据库查询优化方案

阅读本文你的收获 了解系统运行效率提升的整体解决思路和方向学会MySQl中进行数据库查询优化的步骤学会看慢查询、执行计划、进行性能分析、调优 一、问题&#xff1a;如果你的系统运行很慢&#xff0c;你有什么解决方案&#xff1f; ​关于这个问题&#xff0c;我们通常首先…

Unity中Shader观察空间推导

文章目录 前言一、本地空间怎么转化到观察空间二、怎么得到观察空间的基向量1、Z轴向量2、假设 观察空间的 Y~假设~ (0,1,0)3、X Y 与 Z 的叉积4、Y X 与 Z 的叉积 三、求 [V~world~]^T^1、求V~world~2、求[V~world~]^T^ 四、求出最后在Unity中使用的公式1、偏移坐标轴2、把…

[每周一更]-(第31期):Mysql安装汇总

写自&#xff1a;20230204 23:25 一. mysql rpm二进制包 rpm -Uvh http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm yum install mysql-community-server service mysqld start set password password(“123456”)二. mysql yum安装 1、安装查看有没有安装…

企业级“RAS”的数据平台如何炼成?

从“看报表”到“数据分析结果直接投入运营”&#xff0c;数字化正在深入企业经营&#xff0c;数据系统正在成为核心生产系统。相应的&#xff0c;企业对“作业挂了”、“系统崩了”、“算不出来”的容忍度越来越低——只有足够稳定、可靠、专业的数据系统&#xff0c;才能及时…

智能优化算法应用:基于社交网络算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于社交网络算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于社交网络算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.社交网络算法4.实验参数设定5.算法结果6.…

el-select 全选

<template><div class"container"><el-selectv-model"choosedList"clearablemultiplecollapse-tagsplaceholder"请选择"change"select_Change"><div style"padding: 0 20px; line-height: 34px">&l…

机器学习算法(11)——集成技术(Boosting——梯度提升)

一、说明 在在这篇文章中&#xff0c;我们学习了另一种称为梯度增强的集成技术。这是我在机器学习算法集成技术文章系列中与bagging一起介绍的一种增强技术。我还讨论了随机森林和 AdaBoost 算法。但在这里我们讨论的是梯度提升&#xff0c;在我们深入研究梯度提升之前&#xf…

Python实现AR协方差结构线性回归模型(GLSAR算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 GLSAR是具有AR协方差结构的广义最小二乘法线性回归模型。 本项目通过GLSAR回归算法来构建AR协方差结构…

RocketMQ实践:确保消息不丢失与顺序性的高效策略

一、使用RocketMQ如何保证消息不丢失&#xff1f; 这个是在面试时&#xff0c;关于MQ&#xff0c;面试官最喜欢问的问题。这个问题是所有MQ都需要面对的一个共性问 题。大致的解决思路都是一致的&#xff0c;但是针对不同的MQ产品又有不同的解决方案。分析这个问题要从以 下几…

02|用LangChain快速构建基于“易速鲜花”本地知识库的智能问答系统

02&#xff5c;用LangChain快速构建基于“易速鲜花”本地知识库的智能问答系统 项目及实现框架 我们先来整体了解一下这个项目。 项目名称&#xff1a;“易速鲜花”内部员工知识库问答系统。 项目介绍&#xff1a;“易速鲜花”作为一个大型在线鲜花销售平台&#xff0c;有自…

基于java的病房管理系统论文

摘 要 当下&#xff0c;如果还依然使用纸质文档来记录并且管理相关信息&#xff0c;可能会出现很多问题&#xff0c;比如原始文件的丢失&#xff0c;因为采用纸质文档&#xff0c;很容易受潮或者怕火&#xff0c;不容易备份&#xff0c;需要花费大量的人员和资金来管理用纸质文…

Linux多线程

目录 一、Linux线程概念1.1 什么是线程&#xff1f;1.2 线程的优点1.3 线程的缺点1.4 线程异常1.5 线程用途1.6 进程VS线程1.7 关于进程和线程的问题 二、Linux线程控制2.1 POSIX线程库2.2 创建线程2.3 线程ID及进程地址空间布局 三、Linux线程终止四、线程等待4.1 为什么需要线…

MySQL——复合查询

目录 一.基本查询回顾 二. 多表查询 三.自连接 四.子查询 1.单行子查询 2.多行子查询 3.多列子查询 4.在from子句中使用子查询 5.合并查询 一.基本查询回顾 准备数据库&#xff1a; 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为…

stm32项目(14)——基于stm32f103zet6的循迹避障小车

1.功能设计 stm32循迹避障小车&#xff0c;使用超声波测距&#xff0c;使用红外循迹模块追踪黑线&#xff0c;实现循迹功能。此外&#xff0c;还可以检测烟雾、火焰、人体、温湿度。温湿度显示在LCD屏幕上。检测到有人、有火焰、有烟雾时&#xff0c;蜂鸣器报警&#xff01; 功…

ESP32运行MicroPython——环境搭建

1、准备工作 硬件&#xff1a;ESP32-DevKitC V4 开发板、USB串口线 软件&#xff1a; flash_download_tool_3.9.5&#xff08;乐鑫烧录工具&#xff09;、官方下载地址 CP210x&#xff08;USB驱动程序&#xff09;、官方下载地址 ESP32_GENERIC-20231005-v1.21.0.bin&#xff…

串口通信(7)-C#串口通信通信帮助类实例

本文讲解C#串口通信通信帮助类实例 首先创建winform项目添加界面和控件 UI界面 namespace SerialPortDemo {partial class MainForm{/// <summary>/// 必需的设计器变量。/// </summary>private System.ComponentModel.IContainer components = null;/// <sum…

2024年个人目标制定清单~有没有适合你的那一款

在2024年&#xff0c;个人的生活目标可以有多种多样&#xff0c;这主要取决于个人的价值观、兴趣和生活情况。 个人生活目标&#xff1a; 健康和健身&#xff1a;保持身体健康和良好的心理状态是许多人重要的生活目标。这可能包括定期运动&#xff0c;均衡饮食&#xff0c;以…

MySQL报错:1366 - Incorrect integer value: ‘xx‘ for column ‘xx‘ at row 1的解决方法

我在插入表数据时遇到了1366报错&#xff0c;报错内容&#xff1a;1366 - Incorrect integer value: Cindy for column name at row 1&#xff0c;下面我演示解决方法。 根据上图&#xff0c;原因是Cindy’对应的name字段数据类型不正确。我们在左侧找到该字段所在的grade_6表&…