前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java面试题 - 02前言:一、JavaWeb高级:二、数据库:三、框架篇:

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

作者头像
贪挽懒月
发布2018-12-13 16:05:17
6840
发布2018-12-13 16:05:17
举报
文章被收录于专栏:JavaEEJavaEE

前言:

接着《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域传输到页面。
未完待续……
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.11.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • 一、JavaWeb高级:
  • 二、数据库:
  • 三、框架篇:
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档