面试题(框架篇)

1.如何理解SpringIOC?

IOC是Spring中提供一种控制反转机制,目的是将我们项目中对象的依赖管理交给Spring实现,这样可以更好实现对象关系的解耦,提高程序的可扩展性

2.如何理解SpringDI?

DI是Spring中的依赖注入机制,IOC的实现需要借助这种机制,我们通常会这样理解,Spring Bean容器中的IOC思想一种目标,DI是实现这种思想的目标的手段

3.描述Spring MVC处理流程及应用优势

1、客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配前端控制器(或分发器/DispatcherServlet)的请求映射路径, web容器将请求转交给DispatcherServlet.
2、DipatcherServlet接收到这个请求之后将根据请求的信息以及处理器映射 器(HandlerMapping)的配置找到处理请求的处理器(Handler)。
3、由具体的处理器适配器(HandlerAdapter)对Handler进行具体的调用。
4、Handler对数据处理完成以后将返回一个ModelAndView()对象给 DispatcherServlet。
5、DispatcherSevlet通过视图解析器(ViewResolver)将ModelAndView()转 化为真正的视图View。
6、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展 现出完整的view并返回给客户端。

4.MyBatis应用中#与$有什么异同?

相同点:都是通过get来获取值的
不同点:$传进去的字符串在穿不带引号,#号带引号

5.BeanFactory和ApplicationContext有什么区别?

BeanFactory 可以理解为含有bean集合的工厂类。BeanFactory 包含了种bean的定义,以便在接收到客户端请求时将对应的bean实例化。
BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。从表面上看,application context如同bean factory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能。但application context在此基础上还提供了其他的功能。

6.请解释Spring Bean的生命周期?

Spring Bean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。
Spring bean factory 负责管理在spring容器中被创建的bean的生命周期。Bean的生命周期由两组回调(call back)方法组成。
初始化之后调用的回调方法。
销毁之前调用的回调方法。
Spring框架提供了以下四种方式来管理bean的生命周期事件:
InitializingBean和DisposableBean回调接口
针对特殊行为的其他Aware接口
Bean配置文件中的Custom init()方法和destroy()方法
@PostConstruct和@PreDestroy注解方式
使用customInit()和 customDestroy()方法管理bean生命周期的代码样例如下:

<beans>
    <bean id="demoBean" class="com.howtodoinjava.task.DemoBean"
            init-method="customInit" destroy-method="customDestroy"></bean>
</beans>

7.Spring AOP 中,关注点和横切面的区别是什么?

关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能
和切面是一个关注点,次关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能,因此这些都属于横切关注点

8.使用Spring框架的好处是什么?

轻量:Spring是轻量的,基本的版本大约为2MB
控制反转:Spring通过控制反转实现了松耦合,对象们给出它们的依赖,而不是创建或者找依赖们的对象
面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开
容器:Spring包含并管理应用中心对象的生命周期和配置
MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品
事务管理:Spring提供一个持续的事务管理接口,可以拓展到上至本地事务,下至全局事务(JTA)
异常处理:Spring提供方便的API把具体技术相关的异常(比如JDBC、Hibernate or JDO跑出的)转化为一致的unchecked异常

9.Spring中用到了那些设计模式?

代理模式——在AOP和remoting中被用的比较多
单例模式——在Spring配置文件中定义的bean默认为单例模式
模板方法——用来解决代码重复的问题,比如RestTemplate、JmsTemplate|JpaTemplate
工场模式——BeanFactory用来创建对象的实例
适配置——Spring AOP
装饰器——Spring data hashmapper
观察者——Spring时间驱动模型
回调——Spring ResourceLoaderAware回调接口

10.Spring怎么保证Controller并发的安全?

Spring多线程请求过来调用的Controller对象都是一个,而不是一个请求过来就创建一个Controller对象
并发的安全?原因就在于Controller对象是单例的,那么如果不小心在类中定义了类变量,那么这个类变量是被所有请求共享的,这可能会造成多个请求修改该变量的值,出现与预判结果不符合的异常
需要在类上添加注解@Scope(“prototype”)即可,这样每次请求调用的类都是重新生成的(每次生成会影响效率)
第二种方法…
使用ThreadLocal来保存变量,将类变量保存在线程的变量域中,让不同的请求隔离开来

11.在Spring中如何注入一个java集合?

Spring提供了几种集合的配置元素
类型用于注入一列值,允许有相同的值
类型用于注入一组值,不允许有相同的值
类型用于主与一组键值对,键和值都可以为任意类型
类型用于注入一组键值对,键和值都只能为String类型

12.Spring支持的事务管理类型

Spring支持如下两种方式的事务管理:
编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护
声明式事务管理:这种方式意味着你可以将事务和业务代码分离,你只需要通过注解或者XML配置管理事务

13.Spring框架的事务管理那些优点?

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

14.Spring MVC的主要组件?

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

15.Spring MVC怎么和AJAX相互调用的?

通过Jackson框架就可以把Java里面的对象直接转化为JS可以识别的JSON对象
具体步骤:
1.加入Jackson.jar
2.在配置文件中配置json的映射
3.在接受Ajax方法里面可以直接返回Object,list等等,但方法前面要加上@RequestBody

16.Mybatis中的#和$的区别?

1.#{}是预编译处理,KaTeX parse error: Expected 'EOF', got '#' at position 22: …替换 2.Mybatis在处理#̲{}时,会将sql中的#{}替…{}时,就是把${}替换成变量的值,相当于字符串拼接
4,使用#{}可以有效防止SQL注入,提高系统安全性

17.Mybatis的缓存机制,一级、二级

一级缓存
默认开启,SqlSession级别的缓存,实现在同一个会话中的数据的共享
一级缓存的生命周期和SqlSession一致
当有多个SqlSession或者分布式环境下,数据库写操作会引起脏数据
二级缓存
默认不开启,需要手动开启
SqlSessionFactory级别的缓存,实现不同会话中数据的共享,是一个全局变量
自定义存储源,如Ehcache,当开启缓存后,数据查询的执行的流程是:二级缓存 -> 以及缓存 -> 数据库
不同于一级缓存,二级缓存可设置是否运行刷新和刷新频率实现,实现类实现序列化
在mapper文件中开启,在配置文件中设置cacheEnabled为true

18.Mybatis的基本工作流程

1.读取配置文件,配置文件包含数据库连接信息和Mapper映射文件或者Mapper包路径
2.有了这些信息就能创建SqlSessionFactory,SqlSessionFactory的生命周期,程序运行的时候建立起来,程序结束的时候消亡
3.SqlSessionFactory建立SqlSession,目的执行sql语句,SqlSession是过程级,一个方法中建立,方法结束应该关闭
4.当用户使用maooer.xml文件中配置的方法时,mybatis首先会解析sql动态标签为对应数据库sql语句的形式,并将其封装进MapperStatement对象,然后通过executor将sql注入数据库执行,并返回结果
5.将返回的结果通过映射,包装成java对象

19.JDBC编程有哪些不足之处?Mybatis是如何解决这些问题的

JDBC编程的不足之处
数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池也可以解决此问题
SQL语句在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码
向sql语句语句传参数麻烦,因为sql语句的where条件不一样,可能多也可能少,占位符需要和参数一一对应
对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析起来比较方便
Mybatis的解决方案
在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库连接,在sql语句配置在mapper.xml文件中与java代码分离
Mybatis自动将java对象映射至sql语句,mybatis自动将sql执行结果映射至java对象

20.Mybatis的优缺点?

优点:易于上手和掌握、Sql卸载xml里面,便于统一管理和优化、减少Sql与程序代码的耦合、提供xml标签,支持动态Sql编写
缺点:Sql工作量大,尤其是字段多,关联表多时,更是如此、Sql依赖与数据库,导致数据库一致性差、由于xml里面标签id必须唯一,倒是Mapper层中方法不支持方法重载,且Mapper层必须是接口

21.什么是Spring MVC?

1.是一个基于MVC的web框架
2.Spring MVC是Spring的一个模块,是Spring的子容器,子容器可以拿父容器的东西,但是父容器不能拿子容器的东西
3.SpringMVC的前段控制DispatcherServlet,用于分发请求,使开发变得简单
4.SpringMVC流程,Spring三大组件
HandlerMapping:处理器映射器,用户请求路径到Controller方法的映射
HandlerAdapter:处理器适配器,根据handler的开发方式的不同去寻找不同的处理器适配器
ViewResolver:视图解析器,可以解析JSP、Freemarkerr、pdf

22.介绍一下Spring的事务管理

事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或者回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。这可以防止出现脏数据,防止数据库出现问题
开发中为了避免这样中情况一般都会进行事务管理,Spring中也有自己的事务管理机制,一般使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能
Spring支持两种方式的事务管理:
编程式事务管理:这意味着可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护
声明式事务管理:这种方式意味着可以将事务和业务代码分离,只需要通过注解或者xml配置管理事务

23.SSM的优缺点、使用场景?

1.Mybatis和hibernate不同,它不完全是一个OPM框架,因为Mybatis需要程序员自己编写sql语句,不过mybatis可以通过xml或者注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最好将sql执行的结果再映射生成java对象
2.Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
3.Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。
4. 总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

24.SpringMVC的工作流程

用户发送请求至前端控制器 → 前端控制器收到请求调用处理器映射器 → 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给前端控制器 → 前端控制器通过处理器适配器调用处理器执行处理器,也叫后端控制器 → Controller执行完成返回ModelAndview → 处理器适配器将controller执行结果 ModelAndView返回给前端控制器 → 前端控制器将 ModelAndView传给视图解析器 → 视图解析器解析后返回具体View → 前端控制器对象Biew进行渲染视图(即将模型数据填充至视图中)→ 前端控制器响应用户

25.简述SpringMVC的执行流程

系统启动的时候根据配置文件创建spring的容器,首先是发送http请求到核心控制器DispatcherServlet → spring容器通过映射器去寻找业务控制器 → 使用适配器找到相应的业务类 → 在业务类时进行数据封装 → 在封装前可能会涉及到类型转换 → 执行完业务类后使用ModelAndView进行视图转发 → 数据放在model中,用map传递数据进行页面显示

26.Mybatis的好处是什么?

Mybatis把sql语句从从Java源程序中独立出来,放在单独的xml文件中编写,给程序的维护带来了很大的便利
Mybatis封装了底层JDBC API的调用细节,并能自动将结果集转换成JavaBean对象,大大简化了数据库编程的重复工作
因为Mybatis需要程序员自己去编写sql语句,程序员可以结合数据库自身的特点灵活控制sql语句
因此Mybatis能够实现比hibernate等全自动orm框架更高的查询效率,能够完成复杂查询

27.Bean工场和Application contexts有什么区别?

Application contexts提供一种方法处理文本消息,一个通常的做法是加载文件资源(比如镜像),它们可以向注册为监听器的bean发布事件,另外,在容器或者容器内的对象上执行的那些不得不由bean工厂以程序化处理的操作,可以在Application context中以声明的方式处理,Application context实现了MessageSource接口,该接口的实现以可插拔的方式提供获取本地化消息的方法

28.什么是bean的自动装配?

Spring容器能够自动装配相互合作的bean,这意味着容器不需要和配置,能通过Bean工场自动处理bean之间的写作

29.什么是基于Java的Spring注解配置?

基于Java的配置,允许在少量的Java注解的帮助下,进行大部分Spring配置而非通过XML文件
以@Configuration注解为例,它用来标记类可以当做一个bean的定义,被Spring IOC容器使用,另一个例子是@Bean注解,它表示此方法要返回一个对象,作为一个bean注册进Spring应用上下文

30.Spring框架的事务管理有哪些优点?

它为不同的事务API如JTA,JDBC,Hibernate,JPA和JDO,提供一个不变的编程模式
它为编程事务管理提供了一套简单的API而不是一些复杂的事务API
它支持声明式事务管理
它和Spring各种数据访问抽象层很好的继承

31.AOP作用是什么,底层如何实现在那些地方会用到,分别简述切面,切入点和通知

AOP:面向切面编程,将一个系统中共同的业务逻辑提取出来,进行单独的封装成一个组件(切面),然后以配置的方式作用于系统中,实现程序的插拔性,提高代码的复用性,提升系统的灵活性和性能
底层代码实现:JDK动态代理,只支持接口注入CGLIB:可以支持普类的注入,哪些地方会用到,事务开启,日志记录,安全验证,权限认证
切面:系统中共同的业务提取出来,在某个时刻或者某个阶段共同调用
切入点:找到目标方法,给它追加共同的业务逻辑,在spring中提供了切入点表达式版主我们找到目标方法execution
通知:什么时候调用这个共同的业务逻辑,用于指定切面方法作用到系统中的时机,前置、后置、环绕、异常、最终通知

32.Spring中AutoWried和Resource之间区别是什么?

AutoWried:按照类型进行匹配,spring框架自带的,查看当前Spring容器中那个bean类型和引用类型一致,就进行注入,如果有多个匹配类型就会报错
Resource:默认按照名称进行注入,如果找不到对应的名称按照bean类型进行注入

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值