java框架常见的面试题

java框架常见的面试题

    • spring
      • 什么是Spring?
      • 使用Spring框架的好处是什么?
      • Spring由哪些模块组成?
      • 什么是Spring beans?
      • 解释Spring支持的几种bean的作用域
      • Spring框架中的单例bean是线程安全的吗?
      • 解释Spring框架中bean的生命周期
      • 依赖注入DI
      • 控制反转IOC
      • AOP
        • AOP中的概念
        • Spring中的AOP底层实现原理
    • spring mvc
      • Spring mvc 的执行流程
    • spring boot
      • 什么是Spring boot,Spring boot 有什么特性?
      • Spring boot AOP 设计模式
      • Spring boot 缓存
      • 什么是YAML?
      • 5. Springboot 中application.yml和bootStrap.yml
      • springboot常用的starter有哪些
      • springboot自动配置的原理
    • spring cloud
      • 什么是Spring cloud,Spring cloud有什么特性
      • Spring boot 和Spring cloud 的区别
    • dubbo
      • Dubbo是什么?
      • Dubbo能做什么?
      • dubbo的架构
      • dubbo使用方法
    • mybatis
      • #{}和${}的区别是什么?
      • Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?`
      • 最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
      • Mybatis是如何进行分页的?分页插件的原理是什么?
      • 简述Mybatis的插件运行原理,以及如何编写一个插件。
      • Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?
      • Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
      • Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
      • JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
      • MyBatis编程步骤是什么样的?
      • 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
      • MyBatis实现一对一有几种方式?具体怎么操作的?
      • MyBatis实现一对多有几种方式,怎么操作的?
      • Mybatis比IBatis比较大的几个改进是什么?
      • IBatis和MyBatis在核心处理类分别叫什么?
      • mybatis一级缓存二级缓存
        • 一级缓存
          • 一级缓存的生命周期有多长?
          • 怎么判断某两次查询是完全相同的查询?
        • 二级缓存

spring

什么是Spring?

spring 是个Java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。

使用Spring框架的好处是什么?

轻量:Spring 是轻量的,基本的版本大约2MB。
控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
容器:Spring 包含并管理应用中对象的生命周期和配置。

Spring由哪些模块组成?

Core module
Bean module
Context module
Expression Language module
JDBC module
ORM module
OXM module
Java Messaging Service(JMS) module
Transaction module
Web module
Web-Servlet module
Web-Struts module
Web-Portlet module

什么是Spring beans?

Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中 的形式定义。
Spring 框架定义的beans都是单件beans。在bean tag中有个属性”singleton”,如果它被赋为TRUE,bean 就是单件,否则就是一个 prototype bean。默认是TRUE,所以所有在Spring框架中的beans 缺省都是单件。

解释Spring支持的几种bean的作用域

Spring框架支持以下五种bean的作用域:
singleton : bean在每个Spring ioc 容器中只有一个实例。
prototype:一个bean的定义可以有多个实例。
request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。

缺省的Spring bean 的作用域是Singleton.

Spring框架中的单例bean是线程安全的吗?

不,Spring框架中的单例bean不是线程安全的

解释Spring框架中bean的生命周期

1、实例化一个Bean--也就是我们常说的new;

2、按照Spring上下文对实例化的Bean进行配置--也就是IOC注入;

3、如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值

4、如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);

5、如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);

6、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;

7、如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。

8、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法、;

注:以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。

9、当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;

10、最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

依赖注入DI

在运行期,由外部容器动态的将依赖对象注入到组件中。
spring 依赖注入方式
1.Set注入
2.构造器注入
3.静态工厂的方法注入
4.实例工厂的方法注入

控制反转IOC

就是应用本身不负责依赖对象的创建和维护,依赖对象的创建和维护都是由外部容器负责的。
IOC创建对象的几种方式

1)调用无参数构造器

2)带参数构造器

3)工厂创建对象

工厂类:静态方法创建对象
  工厂类:非静态方法创建对象

AOP

AOP中的概念

面向切面:在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程

常用注解
• @aspect 定义切面
• @pointcut 定义切点
• @before 标注Before Advice定义所在的方法
• @afterreturning 标注After Returning Advice定义所在的方法
• @afterthrowing 标注After Throwing Advice定义所在的方法
• @after 标注 After(Finally) Advice定义所在的方法
• @around 标注Around Advice定义所在的方法

Aspect(切面): 是通知和切入点的结合,通知和切入点共同定义了关于切面的全
部内容—它的功能、在何时和何地完成其功能
joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的
是方法,因为spring只支持方法类型的连接点.
Pointcut(切入点):所谓切入点是指我们要对哪些joinpoint进行拦截的定义.
通知定义了切面的”什么”和”何时”,切入点就定义了”何地”.
Advice(通知):所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分
为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
Target(目标对象):代理的目标对象
Weaving(织入):是指把切面应用到目标对象来创建新的代理对象的过程.切面在
指定的连接点织入到目标对象
Introduction(引入):在不修改类代码的前提下, Introduction可以在运行期为类
动态地添加一些方法或Field.

Spring中的AOP底层实现原理

动态代理,照我的理解就是,在不修改原有类对象方法的源代码基础上,通过代理对象实现原有类对象方法的增强,也就是拓展原有类对象的功能。

spring mvc

Spring mvc 的执行流程

  1. 客户端发http请求,服务器接收到请求,如果匹配DispatchServlet的请求映射路径(在web.xml中指定),web容器将请求转发交给DispatchServlet处理。
  2. DispatchServlet根据请求的信息(包括URL,http方法,请求报文头,请求参数,cookie等)及HandlerMapping的配置找到处理请求的的处理器(Handler)。
  3. 得到请求的Handler后,通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler。HandlerAdapter是一个适配器,它用统一的接口对各种Handler方法进行调用
  4. ,处理器完成业务逻辑处理后将返回一个ModelAndView给DispatchServlet, ModelAndView包含了视图逻辑名和模型数据信息。
  5. 当得到真实的视图队形view后,DispatchServlet就使用这个view对象,对ModelAndView中的模型数据进行视图渲染。
  6. 客户端得到响应消息,可能是HTML、xml、json等不同的媒体格式。

spring boot

什么是Spring boot,Spring boot 有什么特性?

Spring boot 不是对Spring功能上的增强,而是提供了一种快速使用Sping的方式
用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件)
创建独立的spring引用程序 main方法运行
嵌入的Tomcat 无需部署war文件
简化maven配置
自动配置spring添加对应功能starter自动化配置

Spring boot AOP 设计模式

动态代理模式
Spring boot AOP 设计模式

Spring boot 缓存

Spring boot 缓存

什么是YAML?

AML是一种人类可读的数据序列化语言。它通常用于配置文件。
与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML文件就更加结构化,而且更少混淆。可以看出YAML具有分层配置数据。

5. Springboot 中application.yml和bootStrap.yml

加载顺序
bootstrap.yml(bootstrap.properties)先加载
application.yml(application.properties)后加载
bootstrap.yml 用于应用程序上下文的引导阶段。
bootstrap.yml 由父Spring ApplicationContext加载。
父ApplicationContext 被加载到使用 application.yml 的之前。
配置区别
bootstrap.yml 和application.yml 都可以用来配置参数。
bootstrap.yml 可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。
application.yml 可以用来定义应用级别的,如果搭配 spring-cloud-config 使用 application.yml 里面定义的文件可以实现动态替换。
使用Spring Cloud Config Server时,应在 bootstrap.yml 中指定:
1.spring.application.name
2.spring.cloud.config.server.git.uri
3.一些加密/解密信息

springboot常用的starter有哪些

spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持
spring-boot-starter-data-jpa 数据库支持
spring-boot-starter-data-redis redis数据库支持
spring-boot-starter-data-solr solr支持
mybatis-spring-boot-starter 第三方的mybatis集成starter

springboot自动配置的原理

在spring程序main方法中 添加@SpringBootApplication或者@EnableAutoConfiguration
会自动去maven中读取每个starter中的spring.factories文件 该文件里配置了所有需要被创建spring容器中的bean

spring cloud

什么是Spring cloud,Spring cloud有什么特性

Spring cloud 就是一套分布式服务治理的框架,它不会提供具体功能的操作,更专注于服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等等。

Spring boot 和Spring cloud 的区别

1、Spring boot 是 Spring 的一套快速配置脚手架,可以基于spring boot 快速开发单个微服务;Spring Cloud是一个基于Spring Boot实现的云应用开发工具;
2、Spring boot专注于快速、方便集成的单个个体,Spring Cloud是关注全局的服务治理框架;
3、spring boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring boot来实现。
4、Spring boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring boot,属于依赖的关系。

dubbo

dubbo面试题

Dubbo是什么?

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架
其核心部分包含:

  1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
  2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
  3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

Dubbo能做什么?

1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

dubbo的架构

java框架常见的面试题_第1张图片节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。

调用关系说明:
0 服务容器负责启动,加载,运行服务提供者。

  1. 服务提供者在启动时,向注册中心注册自己提供的服务。
  2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

dubbo使用方法

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。如果不想使用Spring配置,而希望通过API的方式进行调用(不推荐)
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。

mybatis

#{}和${}的区别是什么?

知识储备:

${} 是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc.Driver。#{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的?号占位符设置参数值,比如ps.setInt(0, parameterValue),#{item.name}的取值方式为使用反射从参数对象中获取item对象的name属性值,相当于param.getItem().getName()

#{}是预编译处理,${}是字符串替换。

Mybatis在处理 时 , 就 是 把 {}时,就是把 {}替换成变量的值。
#{}解析传递进来的参数数据
${}对传递进来的参数原样拼接在SQL中
使用#{}可以有效的防止SQL注入,提高系统安全性。

Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?`

,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,
其中为sql片段标签,通过标签引入sql片段,
为不支持自增的主键生成策略标签。

最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement,举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个