常用框架

今天总结一下框架方面的面试题,包括SSH,SSM  5个框架的常问面试问题,最核心的也就是Spring框架问题

(讲知识点的时候最好结合项目或者使用场景来描述)

目录:1.Spring面试问题

        2.框架比较问题

        3.MyBatis面试问题

        4.Hibernate面试问题

        5.Struts2面试问题

        6.SpringMVC面试问题

 

首先来说说最核心的spring

1.Spring面试问题

  1.Spring是什么及Spring的优点

①. Spring是一个轻量级的IOC和AOP容器框架  (轻量级的框架侵入性程度较低)

②. Spring是非侵入式的,基于Spring开发的应用一般不依赖于Spring的类

 (非侵入式:不需要继承和实现框架的接口抽象类来注册和实例化组件,简单来说就是 不需要继承或实现就可以用,对比侵入式:  必须继承  ,像struts2 ,需要继承actionsupport ....)

③. Spring是个容器,用来管理对象 ,因为它包含并且管理应用对象的生命周期和配置,比如对象的创建、销毁、回调等

④. Spring提供对事务的管理 (参考ssh整合中spring-hibernate.xml  <!--4.配置事务 -->)

⑤. Spring对主流的框架提供了很好的集成支持,比如和hibernate SpringMVC等框架的集成

 

2.讲一讲你对AOP和IOC的理解

    IOC:Invert of control,控制反转,也称为DI(依赖注入)。依赖对象的创建和维护交给了spring容器来管理,应用程序本身不需要负责依赖对象的创建和维护,简单理解就是把原本应该我们去new对象这个操作转到spring容器中执行

(对比以前使用jdbc servlet,讲ioc的好处    ssh项目中用到过 : spring-book.xml,配置dao,action之类的)

 

    AOP:面向切面编程,本质就是拦截器,比如项目中的事务和日志就是很好的体现了AOP。比如:操作数据库的增删改之前,都需要开启事务,增删改之后,都需要提交事务,这样我们就可以写一个拦截器,底层就是采用动态代理实现前置通知和后置通知,在前置通知中开启事务,在后置通知中提交事务,在spring-hibernate.xml中配置通知即可( <!--4.配置事务  <!-- 4.4 定义切入点--> -->),spring的事务管理底层就用到了AOP 

 

3.Spring的注入方式有哪些

①. setter注入:对于习惯了传统的JavaBean开发的程序员来说,通过setter方法注入属性值是熟悉的、直观的和自然的。如果依赖关系比较复杂,那么构造方法注入方式会导致构造方法相当庞大,此时使用设值方式更为简洁

②. 构造注入:构造方法注入很好的响应了Java设计原则之一,在构造期间即可创建一个完整、合法的对象;避免了繁琐的setter方法的编写,所有的依赖关系均在构造方法中设定,依赖关系集中体现;

③. 接口注入:接口注入因具备侵入性,它要求组件必须与特定的接口相关联,因此这种注入方式基本上已经被遗弃了。

对比以前:

 以前: new 对象 ,  setname="",  |  new 构造方法 ("","","")

spring: 见 ssh整合   spring-book.xml

 

4.如何定义bean的作用域,作用域之间的区别

(定义bean的作用域:即定义对象的作用范围 ) 

如何定义:  在<bean>中与一个scope的属性   

取值有5种:singleton:单例模式,prototype:原型模式,. request,session,Global session

主要回答singleton:单例模式,prototype:原型模式

①. singleton:单例模式(默认),也就是说这种范围不管接收到多少个请求,每个容器中之后一个bean的实例。

②. prototype:原型模式(多例模式),和单例模式相反,为每一个bean请求提供一个实例。 (配置action时,例如 spring-book.xml)

③. request:针对每一次HTTP请求都会产生一个新的bean,并且该bean仅在当前request内有效,请求完成以后,bean会失效并被垃圾回收器回收

④. session:针对每一次HTTP请求都会产生一个新的bean,并且该bean仅在当前session内有效,session过期后,bean也会随之失效

⑤. Global session:global session和portlet应用相关,当你的应用部署在Portlet容器中工作时,如果你想让所有的portlet共用全局存储变量的话,就需要存储到global session中

5. 什么是spring的自动装配?并解释一下自动装配的各种模式

Spring的自动装配:无须在Spring配置文件中描述javabean之间的依赖关系,IOC容器会自动建立JavaBean之间的关联关系。

①. 根据属性名称自动装配autowire=”byName”

②. 根据数据类型自动装配autowire=”byType”

③. 根据构造方法自动装配autowire=”constructor”

 

6.可以在spring中注入null或者空字符串吗

可以

注入null值

<property name=”email”><null/></property>

注入空字符串:

<property name=”email” value=””></property>

7.介绍一下spring的事务管理

https://www.cnblogs.com/longshiyVip/p/5061637.html

首先要搞明白为什么需要事务?举个例子:比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱;然后ATM出1000元钱。这两个步骤必须是要么都执行要么都不执行。如果银行卡扣除了1000块但是ATM出钱失败的话,你将会损失1000元;如果银行卡扣钱失败但是ATM却出了1000块,那么银行将损失1000元。所以,如果一个步骤成功另一个步骤失败对双方都不是好事,如果不管哪一个步骤失败了以后,整个取钱过程都能回滚,也就是完全取消所有操作的话,这对双方都是极好的。事务就是用来解决类似问题的。

事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性

事务就是一系列的动作,它们被当作一个单独的工作单元。这些动作要么全部完成,要么全部不起作用

 

事务最重要的两个特性是事务的传播级别和数据隔离级别

传播级别:定义的是事务的控制范围,常用的就是PROPAGATION_REQUIRED

事务的隔离级别:定义的是事务在数据库读写方面的控制范围

事务的配置有两种方式:注解式事务和声明式事务

8.Spring如何配置数据库驱动

①. 可以使用c3p0数据库连接池技术

②. 使用DriverManagerDataSource数据源来配置数据库驱动

 

  2.框架比较问题

1.Springmvc与struts2区别

①.核心入口: SpringMVC的核心入口是Servlet,而Struts2是Filter

②.性能方面: SpringMVC会稍微比Struts2快些,SpringMVC是基于方法设计,而Struts2是基于类,每次发一次请求都会实例一个Action

③. 开发效率:SpringMVC使用更加简洁,开发效率SpringMVC比Struts2高,支持JSR303,处理ajax请求更加方便

④. Struts2的OGNL表达式使页面的开发效率相比SpringMVC更高些 ,

(s标签与c标签的对比:c标签可移植性高,s标签可移植性不高,依赖于struts基础 ,但功能更好,)

 

2.Hibernate与mybatis区别

开发效率方面

①. hibernate开发中,sql语句已经被封装,属于重量级框架,直接可以使用,加快系统开发(但是对于庞大复杂系统项目来说,负责语句较多,hibernate就不是一个很好的方案)

②. Mybatis属于半自动化轻量级框架 ,sql需要手工完成,稍微繁琐

SQL优化方面

①. Hibernate自动生成SQL,有些语句较为繁琐,会多消耗一些性能

②. MyBatis手动编写SQL,可以避免不需要的查询,提高系统性能

对象管理方面

①. hibernate是完整的ORM框架,开发过程中,无需过多关注底层实现,只需要管理对象即可

(不用交给数据库管理,完全交给对象管理)

②. MyBatis需要自行管理映射关系

无缝移植方面

   hibernate优于mybatis

3.SSH与SSM有什么区别

SSH指的是:Struts+Spring+hibernate

SSM指的是:Spring+SpringMVC+MyBatis

所以只需要回答面试官Struts和SpringMVC的区别以及Hibernate和MyBatis的区别

 

3.MyBatis面试问题

1#{}和${}区别是什么

#{}:参数占位符,Mybatis会将sql中的#{}替换为?,自动加 '   '.在很大程度上能防止sql注入

(int类型也加' ',为什么不报错?  ----  因为我们还定义了parameterType="java.lang.Integer",告诉它是int型的)

(sql注入是什么? ----参考博客https://blog.csdn.net/ideality_hunter/article/details/80623526)

(怎么防止sql注入----用拦截器)

${}:变量占位符,也可以理解为取值符,将传入的值直接显示生成在sql中,无法防止sql注入

2.讲一下mybatis的缓存机制 

(可以说没用过,交给redis了)

MyBatis提供了查询缓存来缓存数据,以提高查询的性能,MyBatis的缓存分为一级缓存和二级缓存。

一级缓存:SqlSession级别的缓存,基于HashMap本地缓存,当同一个sqlSession执行两次相同的SQL语句时,第一次执行完后会将数据库中查询到的结果写到缓存,第二次查询时直接从缓冲中读取不经过数据库了。一级缓存默认时开启的

二级缓存:mapper级别的缓存,也是基于hashmap本地缓存,不同的sqlSession两次执行相同的namespace下的sql语句,第二次查询就不会进行数据库了。

 

4.Hibernate面试问题

1 .Hibernate的工作原理

①. 通过Configuration读取并解析hibernate.cfg.xml配置文件

②. 由hibernate.cfg.xml中的<mapping resource>读取并解析映射文件

③. 通过config.buildSessionFactory创建sessionFactory

④. 通过sessionFactory.openSession获取session

⑤. 通过session.beginTransaction开启事务

⑥. 操作数据

⑦. 提交事务

⑧. 关闭session和sessionFactory

2.Hibernate的优缺点

优点:

①. 对JDBC访问数据库的代码进行了封装,简化了数据库访问层繁琐的重复性代码

②. 映射的灵活性,它支持各种关系数据库,从一对一到多对多的各种复杂关系

③. 非侵入性、跨数据库的无缝移植

④. 缓存机制:提供一级缓存和二级缓存

缺点:

①. 无法对SQL进行优化

②. 框架中使用ORM原则,导致配置过于复杂

③. 执行效率和原生的JDBC相比偏差:特别是在批量数据处理的时候

④. 不支持批量修改、删除

3.在Hibernate应用中Java对象的状态有那些 (状态 之间的 转换)  

(https://blog.csdn.net/Soul717/article/details/83279073)

①. 临时状态(新建状态):不处于session缓存中 (new,delete)

②. 持久化状态:,数据库中,session缓冲中都有  (get save update)

③. 游离状态:已经被持久化,数据库中有,但不在session的缓存中  (close)

 

4.Hibernate中getCurrentSession()和openSession()的区别?

①. getCurrentSession()会先查看当前线程中是否绑定了session,如果有则直接返回,如果没有再创建。而openSession()则直接new一个新的session并返回

②. getCurrentSession在事务提交时会自动关闭session,而openSession()需要手动关闭

5.Hibernate进行大批量更新的经验

直接通过JDBC API执行相关的SQL语句或者调用相关的存储过程是最佳的方式

6.Hibernate的缓存机制

Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存,当hibernate根据ID访问数据对象时,首先会从session一级缓存中查;查不到,如果配置了二级缓存,则从二级缓存中查;如果都查不到,再查询数据库。

①. 一级缓存:又称为”Session级别缓存”,只存在于session的生命周期中,当session关闭时,该session所管理的一级缓存也会被立即清除。该缓存由Hibernate管理,应用程序无须干预

②. 二级缓存:又称为”SessionFactory级别缓存”,存在于整个应用程序中,一个应用程序对应一个SessionFactory。该缓存可以进行配置和更改,并且可以动态加载和卸载,hibernate为查询结果提供了一个查询缓存,它依赖于二级缓存

7..Hibernate如何延迟加载

当调用session的load()方法加载实体类时,就会延迟加载

8.Hibernate查询方式有哪些

①. QBC标准查询

②. HQL查询(Hibernate query language hibernate查询语言)

③. 本地SQL查询(原生态查询)

9.Hibernate中Load()和get()区别

 get是立即加载,load是懒加载

什么是懒加载?
将查询的oid(object id(用来标识唯一的对象))保存到session的代理proxy 中,当要真正的用到查询的对象的时候,再去执行查询的sql语句

①. 从返回结果上对比:get方法检索不到结果的话,返回结果为null;但是load()方法检索不到结果的话,则会出现ObjectNotFoundException异常

②. 从检索机制上对比:load支持延迟加载(懒加载),get不支持延迟加载

 

Struts2面试问题

1.Struts2的工作流程

①. 请求发送给StrutsPrepareAndExecuteFilter

②. StrutsPrepareAndExecuteFilter判定该请求是否是一个Struts2请求

③. 若该请求是一个Struts2请求,则StrutsPrepareAndExecuteFilter把请求的处理交给ActionProxy

④. ActionProxy创建一个ActionInvocation的实例,并进行初始化

⑤. ActionInvocation实例在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用

⑥. Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到相对应的返回结果,调用结果的execute方法。

⑦. 执行各个拦截器invocation.invoke()之后的代码

⑧. 把结果发送到客户端

2.Struts2优点

①. 基于MVC架构,框架结构清晰

②. 使用OGNL:OGNL可以快速的访问值栈中的数据、调用值栈中对象的方法

③. 拦截器:struts2中的很多特性都是通过拦截器实现的,例如异常处理、文件上传、验证等。拦截器时可配置与重用的

④. 多种表现层技术,如:JSP、FreeMarker、Velocity等

3.Struts2拦截器和过滤器的区别

①. 过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器

②. Struts2拦截器只能对Action请求起作用,而过滤器则可以对几乎所有的请求起作用

③. 拦截器可以访问Action上下文(ActionContext),而过滤器不行

④. 在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次

4.谈谈ValueStack

①. ValueStack贯穿整个Action的生命周期,保存在request域中,所以ValueStack和request的生命周期时一样的.

②. ValueStack是多实例的,因为Action是多实例的(Servlet是单例的),每个Action都有一个对应的值栈,Action对象默认保存在栈顶

③. ValueStack本质上就是一个ArrayList

④. 使用OGNL访问值栈内容是,不需要#号,而访问作用域中的值时,需要#号

⑤. Struts2重写了request的getAttribute方法,所以可以用EL直接访问值栈中的内容

 

SpringMVC面试问题

1.SpringMVC的工作流程

 

①. SpringMVC将所有的请求都提交给DispatcherServlet

②. DispatcherServlet收到请求调用HandlerMapping处理映射器

③. 处理映射器找到具体的处理器,生成处理器对象返回给DispatcherServlet

④. DispatcherServlet调用HandlerAdapter处理器适配器

⑤. HandlerAdapter经过适配调用具体的处理器Controller

⑥. Controller进行业务逻辑处理后,会返回一个ModelAndView

⑦. HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet

⑧. DispatcherServlet将ModelAndView传给ViewResolver视图解析器

⑨. ViewResolver解析后返回具体的View

⑩. DispatcherServlet根据View进行渲染视图并响应用户

2.springmvc怎么防止SQL注入

使用SpringMVC的拦截器实现防止SQL注入

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的常用框架有很多,其中一些常见的包括Django、Flask、Pyramid、Tornado和Web2py等。这些框架提供了不同的功能和特点,适用于不同类型的应用开发。例如,Django是一个全功能的Web框架,提供了许多内置的功能和工具,适用于构建复杂的Web应用程序。Flask是一个轻量级的Web框架,更加灵活和简单,适用于小型项目或原型开发。Pyramid是一个通用的Web框架,可以用于构建各种类型的应用程序。Tornado是一个异步的Web框架,适用于处理高并发的应用。而Web2py是一个全栈式的Web框架,提供了一体化的解决方案,适用于快速开发和部署应用。这些框架都有自己的优势和适用场景,开发者可以根据项目需求选择合适的框架进行开发。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [15 个常用的python 开源框架](https://blog.csdn.net/qq_23183809/article/details/120485560)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [undefined](undefined)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值