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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二周每周例行报告

1.本周PSP 类型任务开始时间结束时间间隔时间净时间准备工作复习C#,看书2018.9.19 17:032018.9.19 18:17 0min74min编程编写功能一2018.9.20 18:072018.9.20 22:4323min253min编程完善修改功能一2018.9.21…

[css] 使用css3画一个扇形

[css] 使用css3画一个扇形 四个半圆叠加,过半调整 z-index .container { width: 200px; height: 200px; position: relative; border-radius: 100%; } div { width: 50%; height: 100%; position: absolute; left: 0; top: 0; } .fan-1, .fan-3 { background: #C…

ES6 Promise 并行执行和顺序执行

1.Promise.all 并行执行promise getA和getB并行执行,然后输出结果。如果有一个错误,就抛出错误 /*** 每一个promise都必须返回resolve结果才正确* 每一个promise都不处理错误*/const getA new Promise((resolve, reject) > {//模拟异步任务setTime…

poj 1083 Moving Tables

题目 两种做法&#xff0c;开始用贪心做的&#xff0c;有种情况没考虑到&#xff0c;结果排序错了。 这个例子&#xff0c;感觉上有三个交点&#xff0c;以为是30&#xff0c;其实是20. 贪心代码&#xff1a; #include <iostream> #include <cstdio> #include <…

[css] 请使用css3来模拟中/英文打字的效果

[css] 请使用css3来模拟中/英文打字的效果 :after 加个竖条闪啊闪&#xff0c;至于文字一个个出现嘛&#xff0c;text-indent 需要知道字数&#xff0c;clip-path 需要知道宽高&#xff0c;好像也没有特别好的办法。当然如果是单行文本的话用 width overflow 也是阔以的。个人…

[css] 使用css将图片转换成黑白的效果

[css] 使用css将图片转换成黑白的效果 filter: saturate(0);个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

使用router-view时组件之间的通信

情况一&#xff1a;router-view 子组件发生变化导致父组件发生改变 父组件中&#xff1a; <router-view getMessage"showMsg"></router-view> showMsg (val) { // methods方法 val即为子组件传过来的值console.log(val) }子组件中&#xff1a; th…

oracle parallel_index hint在非分区表的生效

之前没特别注意&#xff0c;在有些场景下希望使用并行索引扫描的时候&#xff0c;发现parallel_index hint并没有生效&#xff0c;于是抽空看了下文档&#xff1a;The PARALLEL_INDEX hint instructs the optimizer to use the specified number of concurrent servers to para…

[css] 一个页面引用多个文件,如何防止样式冲突?

[css] 一个页面引用多个文件&#xff0c;如何防止样式冲突&#xff1f; 编码层面&#xff1a; 1、定制规则&#xff1a;不同的样式文件表&#xff0c;增加不同的前缀。 2、按照功能区分文件&#xff1a;不同的文件样式表&#xff0c;针对页面不同的部分写样式&#xff0c;通过…

调试错误,请回到请求来源地,重新发起请求。 错误代码 insufficient-isv-permissions 错误原因: ISV权限不足,建议在开发者中心检查对应功能是否已经添加

接人H5手机网站支付宝支付时&#xff0c;已经将表单发给页面了&#xff0c;支付宝响应调试错误&#xff0c;请回到请求来源地&#xff0c;重新发起请求。 错误代码 insufficient-isv-permissions 错误原因: ISV权限不足&#xff0c;建议在开发者中心检查对应功能是否已经添加。…

eclipse 界面设置与字体更改

目录 eclipse 界面设置与字体更改更改界面颜色&#xff08;Windows&#xff09;windows下全设置窗口颜色eclipse下设置Console窗口颜色设置字体与字号安装Courier New字体设置字体eclipse 界面设置与字体更改 每天换一个新的环境总是要重新设置eclipse的各种配置&#xff0c;最…

[css] 如何清除在项目中无用的css代码呢?

[css] 如何清除在项目中无用的css代码呢&#xff1f; 1、IDE中&#xff0c;会对没有使用到的样式&#xff0c;自己进行检测&#xff0c;删除时候&#xff0c;还需要手动删除。 2、webpack中&#xff0c;有基于消除无用css的插件&#xff08;purifycss-webpack purify-css&…

MySQL 常用需求写法 记录一下

1、MySQL 分组查询文章表各个分类的前N条数据 时间复杂度均为分组中条目数的二次方。而且&#xff0c;很多优化器都不能优化这种查询&#xff0c;使得它的耗时最好为全表行数的二次方(尤其在没有设置正确的索引时)&#xff0c;而且数据量大时&#xff0c;可能将服务器会停止响…

[css] css图片缩放失真出现锯齿的如何解决呢?

[css] css图片缩放失真出现锯齿的如何解决呢&#xff1f; 1、-ms-interpolation-mode&#xff0c;这是针对IE的解决方案。其值设置为bicubic。 2、image-rendering&#xff0c;这是提供了一个速度VS质量之间做权衡的图像缩放关系。 额外的思考&#xff1a; 1、微信上传图片时&…

使用vue 刷新页面后state数据被清空的问题(刷新总是跳转到登陆页面)

在实际的vue项目中&#xff0c;当我们的应用遇到多个组件之间的共享问题时&#xff0c;通常会用到Vuex&#xff08;一个状态管理的插件&#xff0c;可以解决不同组件之间的数据共享和数据持久化&#xff09;&#xff0c;解决组件之间同一状态的共享问题。 因子&#xff1a; V…

解决$router.go(-1)返回上一层页面不刷新页面问题

原因&#xff1a;页面没有跳转过去&#xff0c;但网址已经跳转过去了&#xff0c;这个原因是因为他没有进行缓存&#xff0c;所以页面没有进行及时的渲染。 方案一 //先在router/index.js中添加路由元信息&#xff0c;设置需要缓存的页面 routes: [{path: /,name: index,com…

[css] css如何消除字体的锯齿?

[css] css如何消除字体的锯齿&#xff1f; -webkit-font-smoothing&#xff1a;antialiased;个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

HTTP和HTTPS协议及工作原理分析

HTTP协议概念 HTTP协议&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff0c;属于应用层&#xff09;是用于从服务器传输超内容到本地浏览器的传送协议。是一个无状态的协议 想了解http&#xff0c;就需要了解TCP&#xff0c;IP协议。因为http是基…

[css] 请使用CSS画一个带锯齿形边框圆圈

[css] 请使用CSS画一个带锯齿形边框圆圈 import个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

gif tools

gif & tools https://www.cockos.com/licecap/ https://www.cockos.com/licecap/licecap128-install.exe https://www.cockos.com/licecap/licecap128.dmg 转载于:https://www.cnblogs.com/xgqfrms/p/9706680.html