目录
10.MyBatis中resultType和resultMap的区别
22.常见的 Starter Project Options (常见启动项有哪些)
23.为什么我们需要 spring-boot-maven-plugin?
25. 如何修改Linux IP 需要编辑哪个配置文件,修改完配置文件后,如何重启服务,使配置生效?
36. 简述Spring中BeanFactory和ApplicationContext作用?
38. 构造器注入和 setter 依赖注入,那种方式更好,为什么?
42. 什么是Spring 的AOP,AOP的工作原理是什么?
47. BeanFactory 接口和 ApplicationContext 接口有什么区别 ?
48. Spring里面applicationContext.xml文件能不能改成其他文件名?
61. 请写出创建XMLHttpRequest对象的javascript函数?
73. 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
第二阶段面试题集
1. 数据库里索引的作用
主要作用为了增开数据的查询速度,它的执行也是有一定条件的,不是加了索引就能够加快查询的效率,由于索引的创建实惠占据内存空间的,mysql中通过Explain Select来查看索引的扫描次数。情况如下:
以下不适合加索引:
1:如果每次都需要取到所有表记录,无论如何都必须进行全表扫描了,那么是否加索引也没有意义了。
2、对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义。
3、对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间,因为索引是需要存储空间的,而且有个致命缺点是对于update/insert/delete的每次执行,字段的索引都必须重新计算更新
2. 什么是数据库的事务
数据库事务(Database Transaction),是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。简单的说:事务就是将一堆的SQL语句(通常是增删改操作)绑定在一起执行,要么都执行成功,要么都执行失败,即都执行成功才算成功,否则就会恢复到这堆SQL执行之前的状态。
事务就是为了保证原有事务的完整性和一致性,通过一定的条件规定该事物的可靠性和安全性(如数据库中的事物)。
A:原子性:一个事物是不可再分的工作单位,该事物要么成功要么失败。
B:一致性:事物必须是使数据库从另外一个一致性状态到另一个一致性状态,与原子性密切相关。
C:持久性:指一个事物一旦提交后对数据库中数据的改变应该是永久不变的。
D:隔离性:一个事物的执行不能够被其他事物所干扰。
3.数据库里的字段约束有哪些,各有什么作用
1. 主键约束:实现实体的完整性(PK:主键),值唯一,不能为空,且可以自动递增
2. 外键约束:用于多表之间的查询该表组建作为另外张表的外键建立标语标志就的关系(FK)
3. 非空约束:(NOT NULL)保证该字段的内容不能为空null
4. 唯一约束:列表的唯一性约束(UNIQUE)
5. 检查约束:检查列的值是否满足一个boolean表达式(CHECK)
6. 默认约束:给指定的字段可以设置默认值,不设置值时使用默认值而不是null
4.数据库优化的方案有哪些
(1)查询时,能不用* 就不用,尽量写全字段名。
(2)索引不是越多越好,每个表控制在6个索引以内。范围where条件的情况下,索引不起作用,比如where value<100
(3)大部分情况连接效率远大于子查询,但是有例外。当你对连接查询的效率都感到不能接受的时候可以试试用子查询,虽然大部分情况下你会更失望,但总有碰到惊喜的时候不是么...
(4)多用explain 和 profile分析查询语句
(5)有时候可以1条大的SQL可以分成几个小SQL顺序执行,分了吧,速度会快很多。
(6)每隔一段时间用alter table table_name engine=innodb;优化表
(7)连接时注意:小表 jion 大表的原则
(8)学会用explain 和 profile判断是什么原因使你的SQL慢
(9)查看慢查询日志,找出执行时间长的SQL进行优化
(10)尽量避免使用order by
(11)因为where子句后面的条件是执行顺序是从右到左,所以尽量把能过滤掉大部分数据的条件放在最后
5.什么是Spring IOC
Spring的控制反转:把一个类放入到spring容器中,对象的创建、初始化、销毁等工作交给spring容器来做。由spring容器控制对象的生命周期。
6.描述Spring AOP的机制及原理
AOP把系统分为两部分,核心关注点和横切关注点。核心主要处理业务逻辑,横切主要是权限验证,日志,事物处理等。
AOP主要由:方面(Aspect)一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的 Advisor或拦截器实现
连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
通知(Advice):Spring中定义了四个advice: BeforeAdvice, AfterAdvice, ThrowAdvice和DynamicIntroductionAdvice
切入点(Pointcut): Spring定义了Pointcut接口,用来组合MethodMatcher和ClassFilter,可以通过名字很清楚的理解, MethodMatcher是用来检查目标类的方法是否可以被应用此通知,而ClassFilter是用来检查Pointcut是否应该应用到目标类上
引入(Introduction)Spring中要使用Introduction, 可有通过DelegatingIntroductionInterceptor来实现通知,通
目标对象(Target Object): 包含连接点的对象。也被称作被通知或被代理对象。
AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
织入(Weaving): 组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。
7.描述Spring MVC处理流程及应用优势
SpringMVC严格上来说是一种设计思想而不是设计模式,其底层采用反射的机制,构建工程,适配器,代理模式构建。
MVC工作原理(流程)
1). 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
2). DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
3). DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
4). 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5). Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
6). 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
7). ViewResolver 结合Model和View,来渲染视图
8). 将渲染结果返回给客户端。
8.MyBatis应用中#与$有什么区别
能够有效防止SQL的注入攻击,并且是预编译的SQL
还能够将传入的数值当成一个字符串,会对自动传入的数据加上一个双引号。
如:where name=#{name} 如果传入的值是jack,那么解析成的SQL是:where name="jack"
$会将传入的值直接显示在sql中,会导致异常 并且不能防止sql的攻击,且相对低效
9.Mybatis的工作原理
mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件(也可以用Java文件配置的方式,需要添加@Configuration)中构建出SqlSessionFactory(SqlSessionFactory是线程安全的);
然后,SqlSessionFactory的实例直接开启一个SqlSession,再通过SqlSession实例获得Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,之后关闭SqlSession。说明:SqlSession是单线程对象,因为它是非线程安全的,是持久化操作的独享对象,类似jdbc中的Connection,底层就封装了jdbc连接。
10.MyBatis中resultType和resultMap的区别
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的(对应着我们的model对象中的实体),而resultMap则是对外部ResultMap的引用(提前定义了db和model之间的隐射key-->value关系),但是resultType跟resultMap不能同时存在。
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
(1)当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
(2)当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。
11.MyBatis中缓存的LRU算法描述及实现分析
LRU也就是“最近最少使用”,LRU缓存就是使用这种原理实现的,就是缓存一定数量的数据,当超过该数据的阈值时就把相关的数据删除掉,例如我们缓存10000条数据,当小于该数据时可以随意的增加,超过时就将过期的数据删除掉。
好比java中实现LRU就有两种方式:一是LinkedHashMap,一种是自己设计的数据结构,使用链表+HashMap。
12.get和post请求的区别?
1. get请求用来从服务器上获得资源,而post是用来向服务器提交数据;
2. get将表单中数据按照name=value的形式,添加到action 所指向的URL 后面,并且两者使用"?"连接,而各个变量之间使用"&"连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL;
3. get传输的数据要受到URL长度限制(1024字节);而post可以传输大量的数据, POST数据是没有限制的,上传文件通常要使用post方式;
4. 使用get时参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get;对于敏感数据还是应用使用post;
5. get使用MIME类型application/x-www-form-urlencoded的URL编码(也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20"。
6. Jsp页面中的FORM标签里的method属性为get时调用doGet(),为post时调用doPost()。
13.什么是SQL攻击?如何解决
SQL注入:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
防止的方法:
1. 永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等。
2. 永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。
3. 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4. 不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。
5. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。
14.什么是盒子模型?
在网页中,一个元素占有空间的大小由几个部分构成,其中包括元素的内容(content),元素的内边距(padding),元素的边框(border),元素的外边距(margin)四个部分。这四个部分占有的空间中,有的部分可以显示相应的内容,而有的部分只用来分隔相邻的区域或区域。4个部分一起构成了css中元素的盒模型。
15.简述一下src与href的区别
1. href 是指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的链接,用于超链接。
2. src是指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求src资源时会将其指向的资源下载并应用到文档内,例如js脚本,img图片和frame等元素。当浏览器解析到该元素时,会暂停其他资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等元素也如此,类似于将所指向资源嵌入当前标签内。这也是为什么将js脚本放在底部而不是头部。
16.CSS选择符有哪些?
1. id选择器( # myid)
2. 类选择器(.myclassname)
3. 标签选择器(div, h1, p)
4. 相邻选择器(h1 + p)
5. 子选择器(ul > li)
6. 后代选择器(li a)
7. 通配符选择器( * )
8. 属性选择器(a[rel = "external"])
9. 伪类选择器(a:hover, li:nth-child)
17.简述MVVM思想
M: Model 模型层
V: View视图层
VM: ViewModel 视图模型控制
vue是实现了双向数据绑定的mvvm框架,当视图改变更新模型层,当模型层改变更新视图层。
在vue中,使用了双向绑定技术,就是View的变化能实时让Model发生变化,而Model的变化也能实时更新到View。
18.vue-router 是什么?它有哪些组件
vue-router是用来定义路由规则的
组件: 1.router-link 2.router-view
19.created和mounted的区别?
答:
created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图。
mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些
20.请详细说下你对vue生命周期的理解?
答:总共分为8个阶段 1.创建前/后,2.载入前/后,3.更新前/后,4.销毁前/后。
1.创建前/后: 在beforeCreated阶段,vue实例的挂载元素$el和**数据对象**data都为undefined,还未初始化。
2.在created阶段,vue实例的数据对象data有了,$el还没有。
载入前/后:
3.在beforeMount阶段,vue实例的$el和data都初始化了,但还是挂载之前为虚拟的dom节点,data.message还未替换。
4.在mounted阶段,vue实例挂载完成,data.message成功渲染。
5.更新前/后:当data变化时,会触发beforeUpdate和updated方法。
6.销毁前/后:在执行destroy方法后,对data的改变不会再触发周期函数,说明此时vue实例已经解除了事件监听以及和dom的绑定,但是dom结构依然存在。
21.什么是 Spring Boot Stater ?
启动器是一套方便的依赖没描述符,它可以放在自己的程序中。你可以一站式的获取你所需要的 Spring 和相关技术,而不需要依赖描述符的通过示例代码搜索和复制黏贴的负载。
真正做到开箱即用
22.常见的 Starter Project Options (常见启动项有哪些)
Spring Boot 也提供了其它的启动器项目包括,包括用于开发特定类型应用程序的典型依赖项。
spring-boot-starter-web-services - SOAP Web Services
spring-boot-starter-web - Web 和 RESTful 应用程序
spring-boot-starter-test - 单元测试和集成测试
spring-boot-starter-jdbc - 传统的 JDBC
spring-boot-starter-hateoas - 为服务添加 HATEOAS 功能
spring-boot-starter-security - 使用 SpringSecurity 进行身份验证和授权
spring-boot-starter-data-jpa - 带有 Hibeernate 的 Spring Data JPA
spring-boot-starter-data-rest - 使用 Spring Data REST 公布简单的 REST 服务
23.为什么我们需要 spring-boot-maven-plugin?
主要回答: spring-boot-maven-plugin 提供了一些像 jar 一样打包或者运行应用程序的命令。
扩展:
spring-boot:run 运行你的 SpringBooty 应用程序。
spring-boot:repackage 重新打包你的 jar 包或者是 war 包使其可执行
spring-boot:start 和 spring-boot:stop 管理 Spring Boot 应用程序的生命周期(也可以说是为了集成测试)。
spring-boot:build-info 生成执行器可以使用的构造信息。
24.如何查看Linux系统都有哪些进程?
ps -aux 或者ps -elf
25. 如何修改Linux IP 需要编辑哪个配置文件,修改完配置文件后,如何重启服务,使配置生效?
路径: 使用vi或者vim编辑器编辑网卡配置文件/etc/sysconfig/network-scripts/ifcft-eth0(网卡文件名称可变)
重启服务: service network restart
26. Linux 中NGINX常用命令
1.启动 ./nginx
2.停止 nginx -s stop 或 nginx -s quit
3.重启 ./nginx -s reload(平滑重启) 或 service nginx reload 。
4.查看nginx版本 nginx -v 。
5.检查配置文件是否正确 nginx -t 。
27. 什么是正向代理
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标原始服务器,然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
特点:
1.客户端可以使用正向代理(正向代理是客户端代理)
2.正向代理 用户非常清楚自己访问服务器的地址, 服务器不知道真实的请求者是谁
3.应用场景: 美团外卖,滴滴打车,路由器机制
28. 什么是反向代理
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
特点:
1. 服务器端使用反向代理( 服务器端代理)
2. 反向代理 用户访问服务器时,用户不清楚真实的服务器到底是谁, 服务器清楚是谁访问的.
3. 使用场景: 一般服务器端都是反向代理
29.Nginx负载均衡机制
1.轮询机制 根据配置文件的顺序,依次访问服务器. 默认的负载均衡策略
2.权重策略 如果需要设定访问服务器的频次(某个访问的多,某个访问的少),可以通过权重的策略实现.
例如: server localhost:8091 weight=9;
3.IPHASH 如果需要用户与服务器进行绑定时,则设定IPHash
30. Nginx 有哪些优点?
1.跨平台、配置简单。
2.非阻塞、高并发连接 2-3 万并发连接数,官方监测能支持 5 万并发。
3.内存消耗小 1个服务不超过2M
4.成本低廉,且开源。
5.稳定性高,宕机的概率非常小。
31. 简述什么是跨域
1. 如果浏览器的网址与Ajax请求网址必须满足同源策略.则浏览器才能解析Ajax,执行正确的请求.
2. 同源策略规定
规定要求:请求协议://域名:端口号
1.如果3者都满足,则符合同源策略.浏览器可以正确解析.
2.反之(有一个不满足)不满足同源策略.称之为跨域请求 则浏览器不能正常解析Ajax请求.
3.跨域解决方案:
1.JSONP(以前使用)
2.CORS(跨域资源共享)
32. 简述什么是CORS
CORS是一个W3C标准,全称跨域资源共享(Cross-origin resource sharing)。
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
如果实现跨域资源共享,则需要单独配置服务端即可. 只需要将允许访问的页面的网址,通过响应头的形式进行设定.则可以实现跨域请求
33.JDBC 跟 Mybatis的区别?
答:1. Mybatis是一种支持SQL的持久层框架,底层仍然是jdbc。
2. Mybatis相对于直接使用JDBC, 代码大大简化,比如能够直接将ResultSet中的数据转换成所需要的Java bean对象等。
3. MyBatis对SQL统一放到配置文件中进行管理,不用将SQL语句分散在各个java类中,方便代码的维护。
4. JDBC代码相对繁琐但访问速度更快,比如使用JDBC批处理等方式效率比Mybatis要高。
34. 简述一下事务以及事务的特性?
答:1. 事务:事务是一系列操作组成的业务单元,该业务单元内的操作是不可分割的,即:要么所有操作都做,要么所有操作都不做。
2. 事务具有4个特性,缺一不可,即:ACID(原子性、一致性、隔离性和持久性)
3. 原子性:事务是不可分割的最小业务单元,事务内的操作要么全部都做,要么全部都不做。
4. 一致性:事务执行时,是从一个一致状态变成另一个一致状态。
5. 隔离性:一个事务的执行,不受其他事务(进程)的干扰。
6. 持久性:事务一旦提交,对数据库的改变是持久的。
35. 简述Spring事务注解配置过程?
答:1. 正确配置数据库数据源
2. 配置事务管理器
3. 配置注解驱动事务
4. 在需要事务支持的方法上使用事务注解@Transactional
36. 简述Spring中BeanFactory和ApplicationContext作用?
答:1. ApplicationContext 是 BeanFactory接口的子接口
2. BeanFactory 采用的是延迟加载,第一次getBean的时候才会初始化Bean
3. ApplicationContext是对BeanFactory的扩展,提供了更多的功能
- 国际化处理
- 事件传递
- Bean自动装配
- 各种不同应用层的Context实现
4. 结论:开发中尽量使用ApplicationContext 就可以了
37. Spring框架的优点都有什么?
答:1. 简化编程:Spring对JavaEE中的一些比较繁琐的API做了简化和封装,使用封装之后的API不仅代码更简洁,而且质量更高。
2. 解耦:对象之间的依赖关系由容器来统一管理、降低了对象之间的耦合度、方便代码的维护,同时也实现了资源的统一调度和管理。
3. 支持面向切面编程AOP:可以方便对程序添加通用的服务,比如事务、权限管理等。
4. 集成其它框架:不发明重复的轮子,集成其它一些优秀框架、使开发者用统一的并且更加简洁的方式来使用这些框架。
5. 轻量:可以依赖项目的实际要求,有选择的使用Spring框架的全部或者一部分。
38. 构造器注入和 setter 依赖注入,那种方式更好,为什么?
答:1. 每种方式都有它的缺点和优点。
2. 构造器注入保证所有的注入都被初始化,但是 setter 注入提供更好的灵活性来设置可选依赖。
3. 如果使用 XML 来描述依赖,Setter 注入的可读写会更强。
4. 经验法则是强制依赖使用构造器注入,可选依赖使用setter注入。
5. 一般情况下尽量使用setter就可以了。
39.依赖注入和工厂模式之间有什么不同?
答:1. 虽然两种模式都是将对象的创建从应用的逻辑中分离,但是依赖注入比工厂模式更清晰。
2. 通过依赖注入,你的类就是 POJO,它只知道依赖而不关心它们怎么获取。
3. 使用工厂模式,你的类需要通过工厂来获取
40. 列出IOC的3种主要注入方式?
答:1. 构造方法注入;
2. setter属性注入;
3. 接口注入。
41. 简述Spring中常用的几种Advice注解?
答:1. @Before:在方法执行前处理
2. @AfterReturning:在方法正常执行后处理
3. @AfterThrowing:在方法执行期间抛出异常时处理
4. @After:在方法执行前后无论是否有异常也处理
5. @Around:在方法前后进行处理
42. 什么是Spring 的AOP,AOP的工作原理是什么?
答:1. 面向切面编程简称AOP
2. Spring AOP 是使用动态代理在运行期间植入增强的功能代码。
3. Spring的一个关键的组件就是AOP,其中最重要的服务是声明性事务管理,这个服务建立在Spring的抽象事物管理之上。
4. 允许用户实现自定义切面,用AOP来完善OOP的使用,可以把Spring AOP看作是对Spring的一种增强
43. 什么是IOC/DI,实现原理是什么?
答:1. IOC Inverse of Control 反转控制的概念,指的是对象之间的依赖关系交由容器(第三方)来管理。
2. DI:Dependency Injection 依赖注入,指容器通过调用构造器或者set方法来建立对象之间的依赖关系。
44. 简述Spring中常用注解?
答:1. @Component :标准一个普通的spring Bean类。
2. @Repository:标注一个DAO组件类。
3. @Service:标注一个业务逻辑组件类。
4. @Controller:标注一个控制器组件类。
5. @Resource:注入组件
45. 简述什么是MVC?
答:1. MVC是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码。
2. 将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
3. Model(模型)是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
4. View(视图)是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
5. Controller(控制器)是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
46. 简单的说一下spring的生命周期?
答:1. 实例化BeanFactoryPostProcessor实现类
2. 执行BeanFactoryPostProcessor的postProcessBeanFactory方法
3. 实例化BeanPostProcessor实现类
4. 实例化InstantiationAwareBeanPostProcessBeforeInstantiantion方法
5. 执行Bean的构造器
6. 执行InstantiationAwareBeanPostProcessor的postProcessPropertyValues方法
7. 为Bean注入属性
8. 调用BeanNameAware的setBeanName方法
9. 调用BeanFactoryAware的setBeanFactory方法
10. 执行BeanPostProcessor的postProcessBeforeInitialization方法
11. 调用InitializingBean的afterPropertiesSet方法
12. 调用<bean>的init-method属性指定的初始化方法
13. 执行BeanPostProcessor的postProcessAfterInitialization方法
14. 执行InstantiationAwareBeanPostProcessor的postProcessAfterInitialization方法
15. 容器初始化成功,执行正常调用后,下面销毁容器
16. 调用DiposibleBean的destory方法
17. 调用<bean>的destroy-method属性指定的初始化方法
47. BeanFactory 接口和 ApplicationContext 接口有什么区别 ?
答:1. ApplicationContext 接口继承BeanFactory接口,Spring核心工厂是BeanFactory ,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean, ApplicationContext是会在加载配置文件时初始化Bean。
2. ApplicationContext是对BeanFactory扩展,它可以进行国际化处理、事件传递和bean自动装配以及各种不同应用层的Context实现
3. 开发中基本都在使用ApplicationContext, web项目使用WebApplicationContext ,很少用到BeanFactory
48. Spring里面applicationContext.xml文件能不能改成其他文件名?
答:1. ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。
2. 缺省情况下, 它会在WEB-INF/applicationContext.xml文件找Spring的配置。
3. 你可以通过定义一个<context-param>元素名字为”contextConfigLocation”来改变Spring配置文件的位置。
49. SpringMVC如何解决线程安全性问题?
答:1. SpringMVC中的Controller默认是单例的,因此有可能有多个请求访问同一个Controller实例,从而有可能产生线程安全问题。
2. 因此尽量避免在Controller中使用实例变量
3. 使用ThreadLocal变量。
50. 什么是事务传播?
答: 事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。
51. 介绍一下Spring的事物管理
答:1. 事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。
2. 开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。
3. spring提供了几个关于事务处理的类:
1. TransactionDefinition //事务属性定义
2. TranscationStatus //代表了当前的事务,可以提交,回滚。
3. PlatformTransactionManager这个是spring提供的用于管理事务的基础接口。
52. 解释一下Spring AOP里面的几个名词
答:1. 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。
2. 连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点 总是 代表一个方法的执行。 通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。
3. 通知(Advice):在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。 通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。
4. 切入点(Pointcut):匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。 切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
5. 引入(Introduction):(也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。
6. 目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。
7. AOP代理(AOP Proxy): AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。
8. 织入(Weaving):把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。 这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其他纯Java AOP框架一样,在运行时完成织入。
53. SpringMVC如何实现文件上载步骤?
1. RFC1867 规定了HTTP文件上载协议
2. 客户端
- form标签中使用属性 ENCTYPE="multipart/form-data" METHOD=POST
- 使用 input type=file 标签选择文件
3. 服务器端
- 导入commons-fileupload 组件
- 配置文件上载处理器
- 在控制器方法声明MultipartFile 类型变量接收上载文件。
54. SpringMVC如何实现Excel文件下载?
1. 利用 Apache POI API生成Excel
2. 在控制器中设置 ContentType 为Excel文件类型
3. 在控制器中设置 Content-Disposition 设定下载文件名
55. 什么是Ajax?
答:1. Ajax的全称是Asychronous JavaScript And XML(异步JavaScript和XML);
2. 是一种用来改善用户体验的技术,其实质是利用浏览器内置的一种特殊对象(即ajax对象)异步地向服务器发送请求,服务器返回部分数据,浏览器利用这些数据修改当前页面,整个过程页面无刷新,不打断用户的请求。
56. 请谈一下Ajax的优点?
答:1. 通过异步模式,提升了用户体验
2. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
3. Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。
4. Ajax可以实现动态不刷新(局部刷新)
57. 简要描述Ajax应用的工作流程。
答:1. 在基于Ajax的Web程序中,在用户行为和服务器端多了一层Ajax引擎,它负责处理用户的行为,并转化为对服务器的请求。
2. 同时它接收服务器端的返回信息,经过处理后显示给用户。
3. 由于Ajax在后台以异步的方式的工作,用户无需等待服务器的处理,可以进行并发工作,这就在用户界面层次中更为接近了CS架构的客户端平台。
58. Ajax包括哪些关键技术?
答:1. JavaScript脚本语言;
2. 可扩展标记语言(XML);
3. 文档对象模型(DOM);
4. 级联样式表(CSS);
5. XMLHttpRequest对象。
59. 常用的Ajax框架有哪些?
答:1. WebORB for Java,Echo 2
2. DWR,SWATO
3. The AJAX JSP Tag Library
4. The Ajax-JSF
60. Ajax的核心对象是什么?
答: Ajax的核心对象是XMLHttpRequest对象。
61. 请写出创建XMLHttpRequest对象的javascript函数?
答:
function createXmlHttpRequest(){
if(window.ActiveXObject){
return new ActiveXObject(“Microsoft.XMLHTTP”);
}else if(window.XMLHttpRequest){
return new XMLHttpRequest();
}
}
62. Spring Boot有哪些优点?
答:1. 快速创建独立运行的spring项目与主流框架集成
2. 使用嵌入式的servlet容器,应用无需打包成war包
3. starters自动依赖与版本控制
4. 大量的自动配置,简化开发,也可修改默认值
5. 准生产环境的运行应用监控
6. 与云计算的天然集成
63. 如何实现Spring Boot应用程序的安全性?
答:1. 为了实现Spring Boot的安全性,我们使用 spring-boot-starter-security依赖项,
2. 并且必须添加安全配置。它只需要很少的代码。
3. 配置类将必须扩展WebSecurityConfigurerAdapter并覆盖其方法。
64. 如何集成Spring Boot和ActiveMQ?
答:1. 对于集成Spring Boot和ActiveMQ,我们使用spring-boot-starter-activemq依赖关系。
2. 它只需要很少的配置,并且不需要样板代码。
65. 如何使用Spring Boot实现分页和排序?
答:1. 使用Spring Boot实现分页非常简单。使用Spring Data-JPA可以实现将可分页
2. org.springframework.data.domain.Pageable传递给存储库方法。
66. Springboot常用的starter有哪些 ?
答:1. spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持
2. spring-boot-starter-data-jpa 数据库支持
3. spring-boot-starter-data-redis redis数据库支持
4. spring-boot-starter-data-solr solr支持
5. mybatis-spring-boot-starter 第三方的mybatis集成starter
67. 常用的设计模式有哪些,简单描述下其应用场景?
答: 单例模式。
1. 单例模式是一种常用的软件设计模式。
2. 在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
3. 应用场景:如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
工厂模式。
1. 工厂模式主要是为创建对象提供了接口。
2. 应用场景如下:
1. 在编码时不能预见需要创建哪种类的实例。
2. 系统不应依赖于产品类实例如何被创建、组合和表达的细节。
策略模式。
1. 策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换。此模式让算法的变化独立于使用算法的客户。
2. 应用场景如下。
1. 一件事情,有很多方案可以实现。
2. 我可以在任何时候,决定采用哪一种实现。
3. 未来可能增加更多的方案。
4. 策略模式让方案的变化不会影响到使用方案的客户。
4. 观察者模式。
1. 观察者模式又被称作发布/订阅模式,定义了对象间一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
2. 应用场景如下:
1. 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2. 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
5. 迭代器模式。
1. 迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
2. 应用场景如下:
1. 当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍 历的时候,就应该考虑用迭代器模式。其实stl容器就是很好的迭代器模式的例子。
6. 模板方法模式。
1. 模板方法模式定义一个操作中的算法的骨架,将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。
2. 应用场景如下:
1. 对于一些功能,在不同的对象身上展示不同的作用,但是功能的框架是一样的。
68.产生死锁的条件?
答:1. 互斥条件:一个资源每次只能被一个进程使用。
2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3. 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
69. 为什么要使用线程池?
答:频繁地创建和销毁线程,达到线程对象的重用。另外,使用线程池还可以根据项目灵活地控制并发的数目。
70.简述JVM内存分配?
答:1. 基本数据类型比变量和对象的引用都是在栈分配的。
2. 堆内存用来存放由new创建的对象和数组。
3. 类变量(static修饰的变量),程序在一加载的时候就在堆中为类变量分配内存,堆中的内存地址存放在栈中。
4. 实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量,是根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的”物理位置”,实例变量的生命周期–当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存。
5. 局部变量: 由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放。
71. mysql存储引擎有哪些?
答:1. MyISAM存储引擎:
1). 默认的存储引擎,提供高速存储和检索,以及全文搜索能力。不支持事务。
2). 表级锁。不能在表损坏后恢复数据。
3). 适合在以下几种情况下使用:
(1). 做很多count的计算
(2). 查询非常频繁
2. InnoDB存储引擎:
1. 具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。支持事务和外键。行级锁。
2. 一般来说,如果需要事务支持,并且有较高的并发读取频率,InnoDB是不错的选择。
72. java中常见的排序算法有哪些?
答:1. 直接插入排序
2. 希尔排序
3. 简单选择排序
4. 堆排序
5. 冒泡排序
6. 快速排序
7. 归并排序
8. 基数排序
73. 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
答:Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
面试题看似都很简单,但是想要能正确回答上来,必定是研究过源码且深入的人,而不是仅会使用的人或者用的很熟的人,以上所有面试题及其答案所涉及的内容,在我的Mybatis系列博客中都有详细讲解和原理分析。
74.SSM优缺点、使用场景?
1. Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。
2. Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
3. Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。
4. 总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。