Java常用框架面试题整理

Spring是什么

  • Spring是一个轻量级、非侵入式、一站式、模块化的Java EE开发框架,其目的是用于简化企业级应用程序开发。
  • Spring框架的核心功能可以应用在任何Java应用程序中,对Java EE平台上的Web应用程序有更好的扩展性。

Spring的优点

  • 轻量级:Spring在大小和透明性方面绝对属于轻量级的,基础版本的Spring框架大约只有2MB。
  • 控制反转(IOC):Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象。
  • 容器:Spring包含并管理应用程序对象的配置及生命周期。
  • MVC框架:Spring的web框架是一个设计优良的web MVC框架,很好的取代了一些web框架。
  • 面向切面编程(AOP):Spring支持面向切面编程。
  • 事务管理:Spring对下至本地业务上至全局业务(JAT)提供了统一的事务管理接口。
  • 异常处理:Spring提供一个方便的API将特定技术的异常(由JDBC, Hibernate, 或JDO抛出)转化为一致的、Unchecked异常。

依赖注入(DI)和控制反转(IOC)

  • 控制反转(Inversion of Control)是一种是面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度。其基本思想是:借助于“第三方”实现具有依赖关系的对象之间的解耦。
  • 依赖注入就是将实例变量传入到一个对象中去;好处:解耦,方便做单元测试。
  • 两者的关系:依赖注入是一种设计模式,控制反转是一种思想。

Java常用框架面试题整理_第1张图片    Java常用框架面试题整理_第2张图片

Spring重要模块

  • Spirng Core:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
  • Spring Context:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
  • Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
  • Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
  • Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
  • Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

Java常用框架面试题整理_第3张图片  

Spring中的Bean有哪些作用域

  • singleton:在Spring IOC容器中仅存在一个Bean实例,Bean以单例方式存在,默认(为了提高性能,减少内存消耗和垃圾回收)。
  • prototype:每次从容器调用Bean时,都返回一个新实例,相当于执行new XxxBean()。
  • request:每次HTTP请求都会创建一个新的Bean,该作用域仅适合用于WebApplicationContext环境。
  • session:同一个HTTP Session共享一个Bean,不同Session使用不同Bean,仅适用于WebApplicationContext环境。
  • globalSession:一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext环境。

Spring 中的单例 Bean 的线程安全问题了解吗?

  • 单例Bean存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。
  • 解决方案:1.在Bean对象中尽量避免定义可变的成员变量(不太现实)、2.在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在 ThreadLocal 中(推荐)。

Spring中Bean的生命周期

Java常用框架面试题整理_第4张图片

Spring自动装配

  • 默认情况下,default-autowire属性被设置为no,标示所有的Bean都不使用自动装配,需要装配使用ref属性。
  • 开启自动装配:使用autowire属性设置自动装配类型,有byName、byType、constructor、autodetect。

@Resource、@Autowired和@Qualifier的区别

  • @Resource:由JavaEE提供默认按名称进行装配,如果没有指定name属性,当注解写在字段上时默认取字段名进行名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,name属性一旦指定,只按照名称进行配置。
  • @Autowired:由Spring提供默认按照类型装配,允许null值(设置required = false)),如果想使用名称装配可以结合使用@Qualifier注解。
  • @Autowired自动注入底层原理:Spring在创建bean的过程中,最终会调用到doCreateBean()方法,在这个方法中会调用populateBean()方法,来为bean进行属性填充,完成自动装配等工作。在populateBean()方法中一共调用了两次后置处理器,第一次是对属性进行填充,第二次就会调用到AutowiredAnnotationBeanPostProcessor的postProcessPropertyValues()方法,在该方法中就会进行@Autowired注解的解析,然后调用metadata.inject()方法,进行属性填充。

BeanFactory和ApplicationContext有什么区别?

  • BeanFactory是工厂模式的一种实现,Spring 使用 BeanFactory 来实例化、配置和管理 Bean。XmlBeanFactory是BeanFactory的实现类,它根据XML文件中定义的内容加载beans。该容器从XML文件中读取配置元数据,并用它来创建一个完备的系统或应用。
  • BeanFactorty接口提供了配置框架及基本功能,但是无法支持spring的aop功能和web应用。而ApplicationContext接口作为BeanFactory的派生,在功能上做了扩展:如事件传播特性,即支持aop特性、资源访问,如URL和文件、MessageSource, 提供国际化的消息访问等。

Spring IOC及初始化流程

  • IOC(Inverse of Control)是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。
  • IOC 容器实际上就是个Map集合,负责实例化、定位、配置应用程序的对象及建立这些对象的依赖。
  • IOC容器的初始化包括BeanDefinition的Resource定位、载入和注册这三个基本的过程。
  • ClassPathXmlApplicationContext流程图:

 Java常用框架面试题整理_第5张图片

Spring AOP

  • AOP核心概念:1.横切关注点、2.切面(aspect)、3.连接点(joinpoint)、4.切入点(pointcut)、5.通知(dvice)、6.目标对象、7.织入(weave)、8.引入(introduction)。
  • AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
  • Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用Cglib ,这时候Spring AOP会使用 Cglib 生成一个被代理对象的子类来作为代理。
  • 在项目中的应用:事务管理、拦截器、日志处理。

Spring AOP 和 AspectJ AOP 有什么区别?

  • Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。
  • Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单,
  • 如果切面比较少那么两者性能差异不大,但是当切面比较多的时候最好选择 AspectJ ,它比Spring AOP 快很多。

Spring事务

  • 编程式事务,在代码中硬编码。(不推荐使用)
  • 声明式事务(基于XML的声明式事务、基于注解的声明式事务),在配置文件中配置(推荐使用)

Spring事务管理有哪些优点

  • 它为不同的事务API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了统一的编程模型。
  • 它为编程式事务管理提供了一个简单的API而非一系列复杂的事务API(如JTA).
  • 它支持声明式事务管理。
  • 它可以和Spring 的多种数据访问技术很好的融合。

Spring事务的隔离级别

  • ISOLATION_DEFAULT:这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
  • ISOLATION_READ_UNCOMMITTED:它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
  • ISOLATION_READ_COMMITTED:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。
  • ISOLATION_REPEATABLE_READ:这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
  • ISOLATION_SERIALIZABLE:这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。

Spring事务传播行为

  • PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认)
  • PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务
  • PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常
  • PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务
  • PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
  • PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
  • PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行

Spring通知类型

  • before:前置通知,在一个方法执行前被调用。
  • after: 在方法执行之后调用的通知,无论方法执行是否成功。
  • after-returning: 仅当方法成功完成后执行的通知。
  • after-throwing: 在方法抛出异常退出时执行的通知。
  • around: 在方法执行之前和之后调用的通知。

Spring框架用到了那些设计模式?请举例说明

  • 代理模式 — 在 AOP 和 remoting 中被用的比较多 。
  • 单例模式 — 在 spring 配置文件中定义的 bean 默认为单例模式 。
  • 模板方法 — 用来解决代码重复的问题 。 比如 RestTemplate,   JmsTemplate,   JpaTemplate。
  • 前端控制器 —Spring 提供了 DispatcherServlet 来对请求进行分发 。
  • 视图帮助 (View Helper   )—Spring 提供了一系列的 JSP 标签,高效宏来辅助将分散的代码整合在视图里 。
  • 依赖注入 — 贯穿于 BeanFactory   /   ApplicationContext 接口的核心理念 。
  • 工厂模式 —BeanFactory 用来创建对象的实例 。

Spring MCV是什么

  • Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。

Spring MCV优点

  • 它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是 组件.并且和 Spring 提供的其他基础结构紧密集成.
  • 不依赖于 Servlet API(目标虽是如此,但是在实现的时候确实是依赖于 Servlet 的)3)可以任意使用各种视图技术,而不仅仅局限于 JSP4)支持各种请求资源的映射策略5)它应是易于扩展的

Spring MCV工作原理

  • 客户端发送请求到 DispatcherServlet
  • DispatcherServlet 查询 handlerMapping 找到处理请求的 Controller
  • Controller 调用业务逻辑后,返回 ModelAndView
  • DispatcherServlet 查询 ModelAndView,找到指定视图
  • 视图将结果返回到客户端

Spring MCV处理流程

    Java常用框架面试题整理_第6张图片

Spring MCV主要组件

  • 前端控制器 DispatcherServlet(不需要程序员开发)作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
  • 处理器映射器HandlerMapping(不需要程序员开发)作用:根据请求的URL来查找Handler
  • 处理器适配器HandlerAdapter 注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。
  • 处理器Handler(需要程序员开发)
  • 视图解析器 ViewResolver(不需要程序员开发)作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)
  • 视图View(需要程序员开发jsp)View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)

SpringMVC常用的注解有哪些?

  • @Controller:使用它标记的类就是一个SpringMVC Controller 对象。
  • @RequestMapping:是一个用来处理请求地址映射的注解,可用于类或方法上。
  • @PathVariable:处理request url中的参数。
  • @RequestParam:处理request body中的参数。
  • @ResponseBody处理request body中的参数,并自动封装成一个对象。
  • @Service、@Repositry:服务层和dao层注解。
  • @ModelAttribute:该注解的方法会在Controller每个方法执行前被执行。

Spring MVC的异常处理 ?

  • @Controller + @ExceptionHandler:配置对当前所在Controller的异常进行处理。
  • @ControllerAdvice + @ExceptionHandler:配置对全局异常进行处理。

什么是MyBatis

  • Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。
  • MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
  • 通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。

MyBatis的优点

  • 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
  • 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
  • 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。
  • 能够与Spring很好的集成;
  • 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

MyBatis框架的缺点

  • SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
  • SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

MyBatis框架适用场合

  • MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。
  • 对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。

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

  • #{}是预编译处理,${}是字符串替换。
  • Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
  • Mybatis在处理${}时,就是把${}替换成变量的值。
  • 使用#{}可以有效的防止SQL注入,提高系统安全性。

当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

  • 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致
  • 通过来映射字段名和实体类属性名的一一对应的关系

模糊查询like语句该怎么写

  • 在Java代码中添加sql通配符。
  • 在sql语句中拼接通配符,会引起sql注入

Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

  • Dao接口即Mapper接口。接口的全限名,就是映射文件中的namespace的值;接口的方法名,就是映射文件中Mapper的Statement的id值;接口方法内的参数,就是传递给sql的参数。
  • Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MapperStatement。在Mybatis中,每一个