Java开发框架和中间件面试题(4)

   27.如何自定义Spring Boot Starter?

     1.实现功能

      2.添加Properties

    Java开发框架和中间件面试题(4)_第1张图片

3.添加AutoConfiguration

   Java开发框架和中间件面试题(4)_第2张图片

4.添加spring.factory

在META  INF下创建spring.factory文件

6.install

Java开发框架和中间件面试题(4)_第3张图片

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。

    Java开发框架和中间件面试题(4)_第4张图片

2.认证模块的实现?

  SecurityContextHolder(用于存储授权信息)

Java开发框架和中间件面试题(4)_第5张图片

手动授权的例子:

   (SecurityContextHolder.getContext().setAuthentication(authentication)这种授权方式多线程不安全):

Java开发框架和中间件面试题(4)_第6张图片   除了手动授权外,SpringSecurity通过

AuthenticationManager和ProviderManager进行授权。其中AuthenticationProvider代表不同的认证机制(最常用的账号/密码)。

    ProviderManager

        Java开发框架和中间件面试题(4)_第7张图片

    AuthenticationManager

Java开发框架和中间件面试题(4)_第8张图片

3.授权模块的实现?

   认证完成之后,Spring Security通过AccessDecisionManager完成授权操作。除了全局的授权配置以外,也可以通过@PreAuthorize,@PreFilter,@PostAuthorize,@PostFilter注解实现方法级别的权限控制。

Java开发框架和中间件面试题(4)_第9张图片

36.SpringSecurity基于用户名和密码的认证模式流程?

     请求的用户名密码可以通过表单登陆,基础认证,数字认证三种方式从HttpServletRequest中获取,用于认证的数据源策略有内存,数据库,ldap,自定义灯。

  拦截未授权的请求,重定向到登陆页面。

    Java开发框架和中间件面试题(4)_第10张图片表单登陆的过程,进行账号密码认证。

Java开发框架和中间件面试题(4)_第11张图片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桥接策略图:

Java开发框架和中间件面试题(4)_第12张图片从图中应该可以看出,无论你的老项目中使用的是common logging或者直接使用log4j,java.util.logging,都可以使用对应的桥接jar包来解决兼容问题。

1.slf4j兼容common logging

Java开发框架和中间件面试题(4)_第13张图片2.slf4j兼容log4j

Java开发框架和中间件面试题(4)_第14张图片

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),如下图:

Java开发框架和中间件面试题(4)_第15张图片

这样子做不需要任何代码级的改造,就可以解决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 整体架构的设计?

从组件的角度看:

Java开发框架和中间件面试题(4)_第16张图片

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,中间件,开发语言)