专栏首页JavaEEJava面试题 - 02前言:一、JavaWeb高级:二、数据库:三、框架篇:

Java面试题 - 02前言:一、JavaWeb高级:二、数据库:三、框架篇:

前言:

接着《Java面试题 - 01》,继续聊聊剩下的内容。

一、JavaWeb高级:

1. 什么叫监听器(listener)? 答:监听器主要是用来监听特定对象的创建或销毁、属性的变化的,是一个实现特定接口的普通java类。具体实现哪个接口,要看你监听什么内容,比如要监听Request对象的创建或销毁,就实现ServletRequestListener 接口。它是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。

2. 什么叫过滤器(filter)? 答:就是对servlet请求起到过滤的作用,它在监听器之后,作用在servlet之前。比如编码过滤器,就是经过了该过滤器的请求都会设置成过滤器中指定的编码。过滤器是随web应用启动而启动,只初始化一次,只有当web应用停止或重新部署的时候才销毁。

3. 什么叫拦截器(interceptor)? 答:拦截器类似于fileter ,也是拦截用户的请求。不同的是,它不需要在web.xml中配置,不随WEB应用的启动而启动,是基于JAVA的反射机制和动态代理实现的。只有调用相应的方法时才会调用,在面向切面编程中应用的。

4. servlet请求的执行过程是怎样的? 答:过程是这样的:context-param(初始化配置) --> listener --> filter --> servlet --> interceptor --> 页面。

5. 谈谈你对Ajax的认识。 答:Asynchronous JavaScript and XML的缩写,是一种创建交互式网页应用的的网页开发技术。通过异步提交的方式,可以实现局部刷新,在不更新整个页面的前提下维护数据,提升用户体验度。

二、数据库:

1. select语句的执行顺序怎样的? 答:SQL语言不同于其他编程语言的最明显特征是处理代码的执行顺序。在大多数据库语言中,代码按顺序执行,但是SQL语言执行顺序如下: from --> where --> group by分组 --> 聚合函数 --> having筛选分组 --> 计算所有的表达式 --> select的字段 --> order by排序。

2. 你知道聚合函数吗? 答:聚合函数是对一组值进行计算并返回单一的值的函数,它经常与select 语句中的 group by 子句一同使用。 比如求平均值的聚合函数是avg()。

3. 你知道连接查询吗? 答:连接查询分为内连接和外连接,内连接显示表之间有连接匹配的所有行。外连接又分为左外连接、右外连接和全连接。左外连接就是以左表作为基准进行查询,左表数据会全部显示出来,右表如果和左表匹配的数据则显示相应字段的数据,如果不匹配则显示为null。 右连接是以右表作为基准进行查询,右表数据会全部显示出来,左表如果和右表匹配的数据则显示相应字段的数据,如果不匹配则显示为null。 全连接是先以左表进行左外连接,再以右表进行右外连接。

4. 事务有几大特性?分别是什么? 答:事务有四大特性,ACID。

  • 原子性(A):整个事务中的所有操作,要么全部完成,要么全部不完成。
  • 一致性(C):在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
  • 隔离性(I):如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。
  • 持久性(D):在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

5. mysql中的四种隔离级别是什么? 答:四种隔离级别如下:

  • 读未提交(READ UNCOMMITTED):未提交读也叫读脏,就是事务可以读取其它事务未提交的数据。
  • 读已提交(READ COMMITTED):读已提交就是在事务未提交之前所做的修改其它事务是不可见的。 在其它数据库系统比如SQL Server默认的隔离级别就是读已提交。
  • 可重复读(REPEATABLE READ):保证同一个事务中的多次相同的查询的结果是一致的,比如一个事务一开始查询了一条记录然后过了几秒钟又执行了相同的查询,保证两次查询的结果是相同的,可重复读也是mysql的默认隔离级别。
  • 可串行化(SERIALIZABLE):可串行化就是保证读取的范围内没有新的数据插入,比如事务第一次查询得到某个范围的数据,第二次查询也同样得到了相同范围的数据,中间没有新的数据插入到该范围中。

6. 对于MySQL性能优化,你知道多少? 答:我知道的有以下几点:

  • 当只要一行数据时使用limit 1 。查询时如果已知会得到一条数据,这种情况下加上 limit 1 会增加性能。因为 mysql 数据库引擎会在找到一条结果停止搜索,而不是继续查询下一条是否符合标准直到所有记录查询完毕。
  • 选择正确的数据库引擎 。Mysql中有两个引擎,MyISAM和InnoDB,每个引擎有利有弊。 MyISAM 适用于一些大量查询的应用,但对于有大量写功能的应用不是很好。InnoDB是一个非常复杂的存储引擎,对于一些小的应用会比MyISAM还慢,但是在写操作比较多的时候会比较优秀。并且,它支持很多的高级应用,例如:事物。
  • 用not exists代替not in 。Not exists可以使用索引,not in不能使用索引。在数据量比较大的操作中不建议使用not in 这种方式。
  • 对操作符的优化。尽量不采用不利于索引的操作符 ,如:in not in is null is not null <> 等 。
  • limit 的基数比较大时使用 between 。 例如:select * from admin order by admin_id limit 100000,10 优化为:select * from admin where admin_id between 100000 and 100010 order by admin_id。
  • 尽量避免在列上做运算,这样导致索引失效 。 例如:select * from admin where year(admin_time)>2014 优化为: select * from admin where admin_time> '2014-01-01′

三、框架篇:

(一)、Spring

1. 谈谈你对spring的理解。 答:Spring是一个轻量的开源框架,为简化企业级应用开发而生,它的核心如下:

  • 控制反转(IOC):传统的java开发模式中,当需要一个对象时,我们会自己使用new或者getInstance等直接或者间接调用构造方法创建一个对象。而在spring开发模式中,spring容器使用了工厂模式为我们创建了所需要的对象,不需要我们自己创建了,直接调用spring提供的对象就可以了,这就是控制反转的思想。 控制反转是一种思想,而不是一种技术。
  • 依赖注入(DI):,spring 使用 javaBean 对象的 set 方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值,这就是依赖注入的思想。依赖注入就是使用了控制反转这种思想的一种技术。
  • 面向切面编程(AOP):在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象。而在面向切面编程中,我们将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等公用操作处理,这就是面向切面编程的思想。AOP底层是动态代理,如果是接口采用的是JDK动态代理,如果是类采用的是CGLIB方式实现动态代理。

2. 你知道spring框架中使用了哪些设计模式吗? 答:spring中使用到的部分设计模式如下:

  • 单例模式:在spring的配置文件中设置bean默认为单例模式。
  • 模板方法模式:用来解决重复代码,JpaTemplate 、RedisTemplate等。
  • 前端控制器模式:spring提供了前端控制器DispatherServlet来对请求进行分发。
  • 工厂模式:Spring中使用beanFactory来创建对象的实例,就是用的工厂模式。

3. 介绍一下spring bean的生命周期。 答:bean的生命周期为 创建 --> 初始化 --> 调用 --> 销毁。

4. 说一说spring有哪些核心模块? 答:主要有以下七大核心模块:

七大核心模块

  • Core模块:封装了框架依赖的最底层部分,包括资源访问、类型转换及一些常用工具类。
  • Context模块:以Core和Beans为基础,集成Beans模块功能并添加资源绑定、数据验证、国际化、Java EE支持、容器生命周期、事件传播等,核心接口是ApplicationContext。
  • AOP模块:面向切面编程,通过配置管理特性,spring AOP直接将面向切面的编程集中到了框架中,所以可以很容易使spring管理的对象支持AOP。
  • ORM模块:Spring的ORM模块提供了对常用ORM框架如Hibernate,Mybaties等的辅助和支持,他本身更并不实现ORM,仅仅对常见的ORM框架进行封装并对其进行管理。
  • DAO模块:通常编写数据库代码时总要写一些样板似的内容,如获取连接,创建语句,释放连接等 ,Dao模块将这些模板抽象出来,使得数据库代码变得简单明了,也可以避免因为释放数据库资源失败而导致的问题。
  • WEB模块:提供了基本的面向web的集成功能,例如多个文件的上传功能、使用servlet监听器、面向web应用程序的上下文来初始化IOC容器,还实现了springMVC。
  • WEB MVC模块:该模块为spring提供了一套轻量级的mvc实现,他还可以支持和管理其他的mvc框架,如struts。相对于struts,spring自己的mvc框架更加简洁和方便。

5. 请描述一下spring的事务。 答:Spring既支持编程式事务管理(也称编码式事务),也支持声明式的事务管理。编程式事务就是把事务写在业务逻辑代码中,声明式事务是将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。大多数情况下比编程式事务管理更好用。声明式事务可以在配置文件中用<tx >标签来实现,也可以在需要使用事务的方法上加@Transaction注解。

6. 如何理解spring的 IOC容器? 答:IOC就是控制反转,这是一种思想而不是一种技术。通常创建对象是由程序员来new的,而"控制反转"是指new实例的工作不由程序员来做,而是交给Spring容器来做。在Spring中BeanFactory是IOC容器的实际代表者。

7. ApplicationContext是干嘛的?有哪些实现类? 答:ApplicationContext是“应用容器”,继承自BeanFactory。Spring把Bean放在这个容器中,在需要的时候,用getBean方法取出。它的实现有以下三个:

  • FileSystemXmlApplicationContext :从指定的文件系统路径中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。
  • ClassPathXmlApplicationContext:从类路径ClassPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。
  • XmlWebApplicationContext:从Web应用中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。

8. BeanFactory与AppliacationContext有什么区别? 答:BeanFactory 是基础类型的IOC容器,提供完整的IOC服务支持。ApplicationContext 是在 BeanFactory 的基础上构建,是相对比较高级的容器,除了 BeanFactory 的所有支持外,ApplicationContext还提供了事件发布、国际化支持等功能。

9. 依赖注入有哪些实现方式? 答:spring提供了以下四种依赖注入的方式:

  • 使用Set方法注入
  • 使用构造方法注入
  • 使用静态工厂注入
  • 使用实例工厂注入

10. 什么是spring beans? 答:spring beans 就是被spring容器初始化、配置和管理的对象。

11. 一个spring beans 的定义需要包含什么? 答:一个 Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个 bean,它的生命周期详情及它的依赖。

12. spring支持几种类的作用域? 答:spring在配置bean的时候,可以通过scope属性来定义作用域,scope属性有以下5个值:

  • singleton : bean在每个Spring ioc 容器中只有一个实例。 默认就是singleton,它是线程不安全的。
  • prototype:每一次请求都会产生一个新的bean实例。
  • request:request表示针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效。
  • session:作用域表示针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效。
  • global session:作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。

13. 怎么开启spring的注解装配? 答:spring默认是没有开启注解的,要使用注解,我们必须在 Spring 配置文件中配置 <context:annotation-config/>元素。

14. 简单的说一下AOP编程中的相关概念。 答:主要有如下概念:

  • Joinpoint(连接点) : 类里面可以被增强的方法,这些方法称为连接点 。
  • Pointcut(切入点):在哪些类的哪些方法上切入(where)。
  • Advice(通知/增强) :拦截到Joinpoint之后所要做的事情就是通知。通知分为前置通知、后置通知、异常通知、最终通知、环绕通知。
  • Aspect(切面) : 切面 = 切入点 + 通知,通俗点就是:在什么时机,什么地方,做什么增强。
  • Weaving(织入) :把切面加入到对象,并创建出代理对象的过程。(由 Spring 来完成)。
  • Target(目标对象) :需要增强的类就是目标对象。
  • Proxy(代理) :一个类被AOP织入增强后,就产生一个代理类。

(二)、SpringMVC

1. 什么是springMVC? 答:Spring MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架。使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型。框架的目的就是帮助我们简化开发。

2. 简单描述一下SpringMVC的工作原理。 答:工作原理如下:

  • 用户向服务器发送请求,请求被springMVC前端控制器DispatcherServlet捕获;
  • 由DispatcherServlet控制器找到处理请求的Controller;
  • DispatcherServlet将请求提交到Controller;
  • Controller调用业务逻辑处理后,返回ModelAndView给DispatcherServlet;
  • DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图;
  • ViewResoler 解析出 ModelAndView()中的参数,将视图返回给客户端; 。

3. springMVC有什么优点? 答:它是基于组件技术的,全部的应用对象,无论控制器和视图,还是业务对象之类的都是 java组件;可以任意使用各种视图技术,而不仅仅局限于JSP;支持各种请求资源的映射策略;它应是易于扩展的。

4. springMVC和struts2有什么区别? 答:区别如下:

  • springmvc的入口是一个servlet即前端控制器(DispatcherServlet),而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。
  • springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
  • Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。

未完待续……

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • springboot监控&springboot配置https

    springboot自带actuator监控,开启配置后,访问相关链接就可以返回服务运行相关信息,使用方法如下: 1、pom.xml:

    贪挽懒月
  • springboot快速入门前言:一、springboot简介:二、springboot常用知识点:总结:

    正所谓,天下武功,唯快不破,在当今生活节奏越来越快的时代,我们也要讲求效率,也要追求一个快字(不过有些方面还是不能快的,不要当快男哦)。springboot就是...

    贪挽懒月
  • ActiveMQ --- 整合篇

    之前说到了activeMQ的一些基本用法,本文将介绍activeMQ如何与spring以及spring boot整合。

    贪挽懒月
  • 【spring源码解析】一个坑的问题解决方案

    本文转载自:http://blog.csdn.net/m0_37798534/article/details/79584031

    用户5640963
  • Spring 核心框架体系结构

      很多人都在用spring开发java项目,但是配置maven依赖的时候并不能明确要配置哪些spring的jar,经常是胡乱添加一堆,编译或运行报错就继续配置...

    Java团长
  • Spring框架结构

    spring的jar包只有20个左右,每个都有相应的功能,一个jar还可能依赖了若干其他jar,所以,搞清楚它们之间的关系,配置maven依赖就可...

    聚沙成塔
  • spring boot 配置属性大全(2)

    gemron的空间
  • spring boot 配置属性大全(1)

    gemron的空间
  • Spring系列第1篇:请问各位大佬为何要学spring?

    整个spring系列使用官方最新版本5.2.3.RELEASE,会有大量案例,都是通过maven来管理的,所以maven是必备技能,对这块不熟悉的可以去看一下:...

    路人甲Java
  • Spring Boot 之Application.properties配置大全

    前几期,我们讲到了Spring Boot的框架,动手操作过的人,应该都还记得,并且觉得确实简化了很多,那么对于其中application.properties的...

    码神联盟

扫码关注云+社区

领取腾讯云代金券