• java框架常见的面试题


    java框架常见的面试题

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    什么是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是线程安全的吗

    如果Bean是无状态的,那么是线程安全的
    如果Bean是有状态的,那么就需要开发人员自己来保证线程安全,最简单的办法就是改变bean的作用域把singleton改成prototype,这样每次请求bean对象就相当于是创建新的对象来保证线程的安全
    如果在bean中声明任何有状态的实例变量或者类变量,推荐大家使用ThreadLocal把变量变成线程私有,如果bean的实例变量或者类变量需要在多个线程之间共享,那么就只能使用synchronized,lock,cas等这些实现线程同步的方法了。

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

    1. 通过反射的方式进行对象的创建
    2. 设置对象属性
    3. 如果对象中需要引用容器内部的对象,那么需要调用aware接口的子类方法来进行统一的设置
    4. 对生成的bean对象进行BeanPostProcessor的前置的处理工作
    5. 判断当前bean对象是否设置了InitializingBean接口,然后进行属性的设置等基本工作
    6. 如果当前bean对象定义了初始化方法,那么在此处调用初始化方法
    7. 对生成的bean对象进行BeanPostProcessor后置处理的处理工作
    8. 注册必要的Destruction相关回调接口
    9. 通过容器来获取对象并进行使用
    10. 判断是否实现了DisposableBean接口,并调用具体的方法来进行对象的销毁工作
    11. 如果当前bean对象定义了销毁方法,那么在此处调用销毁方法

    依赖注入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底层实现原理

    动态代理

    JDK动态代理和CGLIB动态代理
    JDK代理使用的是反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
    CGLIB代理使用字节码处理框架asm,对代理对象类的class文件加载进来,通过修改字节码生成子类。

    JDK代理
    1.实现InvocationHandler接口,重写invoke()
    2.使用Proxy.newProxyInstance()产生代理对象
    3.被代理的对象必须要实现接口

    CGLib 必须依赖于CGLib的类库,需要满足以下要求:
    1.实现MethodInterceptor接口,重写intercept()
    2.使用Enhancer对象.create()产生代理对象

    如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP,可以强制使用CGLIB实现AOP
    如果目标对象没有实现了接口,必须采用CGLIB库

    spring事务的实现方式原理是什么?

    在使用Spring框架的时候,可以有两种事务的实现方式,一种是编程式事务,有用户自己通过代码来控制事务的处理逻辑,还有一种是声明式事务,通过@Transactional注解来实现。

    其实事务的操作本来应该是由数据库来进行控制,但是为了方便用户进行业务逻辑的操作,spring对事务功能进行了扩展实现,一般我们很少会用编程式事务,更多的是通过添加@Transactional注解来进行实现,当添加此注解之后事务的自动功能就会关闭,有spring框架来帮助进行控制。

    其实事务操作是AOP的一个核心体现,当一个方法添加@Transactional注解之后,spring会基于这个类生成一个代理对象,会将这个代理对象作为bean,当使用这个代理对象的方法的时候,如果有事务处理,那么会先把事务的自动提交给关闭,然后去执行具体的业务逻辑,如果执行逻辑没有出现异常,那么代理逻辑就会直接提交,如果出现任何异常情况,那么直接进行回滚操作,当然用户可以控制对哪些异常进行回滚操作。

    TransactionInterceptor

    spring事务的隔离级别有哪些?

    spring中的事务隔离级别就是数据库的隔离级别,有以下几种:

    read uncommitted

    read committed

    repeatable read

    serializable

    在进行配置的时候,如果数据库和spring代码中的隔离级别不同,那么以spring的配置为主。

    spring的事务传播机制是什么?

    多个事务方法相互调用时,事务如何在这些方法之间进行传播,spring中提供了7中不同的传播特性,来保证事务的正常执行:

    REQUIRED:默认的传播特性,如果当前没有事务,则新建一个事务,如果当前存在事务,则加入这个事务

    SUPPORTS:当前存在事务,则加入当前事务,如果当前没有事务,则以非事务的方式执行

    MANDATORY:当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常

    REQUIRED_NEW:创建一个新事务,如果存在当前事务,则挂起该事务

    NOT_SUPPORTED:以非事务方式执行,如果存在当前事务,则挂起当前事务

    NEVER:不使用事务,如果当前事务存在,则抛出异常

    NESTED:如果当前事务存在,则在嵌套事务中执行,否则REQUIRED的操作一样

    NESTED和REQUIRED_NEW的区别:

    REQUIRED_NEW是新建一个事务并且新开始的这个事务与原有事务无关,而NESTED则是当前存在事务时会开启一个嵌套事务,在NESTED情况下,父事务回滚时,子事务也会回滚,而REQUIRED_NEW情况下,原有事务回滚,不会影响新开启的事务

    NESTED和REQUIRED的区别:

    REQUIRED情况下,调用方存在事务时,则被调用方和调用方使用同一个事务,那么被调用方出现异常时,由于共用一个事务,所以无论是否catch异常,事务都会回滚,而在NESTED情况下,被调用方发生异常时,调用方可以catch其异常,这样只有子事务回滚,父事务不会回滚。

    spring事务什么时候会失效?

    1、bean对象没有被spring容器管理

    2、方法的访问修饰符不是public

    3、自身调用问题

    4、数据源没有配置事务管理器

    5、数据库不支持事务

    6、异常被捕获

    7、异常类型错误或者配置错误

    什么的是bean的自动装配,它有哪些方式?

    bean的自动装配指的是bean的属性值在进行注入的时候通过某种特定的规则和方式去容器中查找,并设置到具体的对象属性中,主要有五种方式:

    no – 缺省情况下,自动配置是通过“ref”属性手动设定,在项目中最常用
    byName – 根据属性名称自动装配。如果一个bean的名称和其他bean属性的名称是一样的,将会自装配它。
    byType – 按数据类型自动装配,如果bean的数据类型是用其它bean属性的数据类型,兼容并自动装配它。
    constructor – 在构造函数参数的byType方式。
    autodetect – 如果找到默认的构造函数,使用“自动装配用构造”; 否则,使用“按类型自动装配”。

    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的架构

    在这里插入图片描述节点角色说明:
    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()
    
    • 1

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

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

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

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

    最佳实践中,通常一个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中,每一个