JAVA面试题第三阶段总结
JAVA面试题第三阶段总结
1、何为Spring Bean容器?Spring Bean容器与Spring IOC容器有什么不同?(重)
答:用于创建Bean对象,管理Bean对象的容器,Spring IOC容器本质上指的就是Spring Bean容器,
Spring Bean容器中最核心一个机制是IOC机制(控制反转),所以有时候又将Spring Bean容器称之为Spring Ioc容器。
2、Spring IOC如何理解?(重)
答:IOC是Spring中提供的一种控制反转机制,目的是将我们的项目中对象的依赖管理交给Spring管理,这样就能更好的实现对象关系的解耦,提高程序的可扩展性。
3、Spring DI如何理解?(重)
答:DI是Spring中的依赖注入机制,IOC的实现需要借助这种机制。我们通常会这样理解,Spring Bean容器中的IOC思想是一种目标,DI是实现这种思想的目标的手段。
4、Spring中基于注解如何配置对象的作用域?以及如何配置延迟加载机制(重)
答:@Scope(“singleton”) 单例模式 默认的,在整个Spring容器的生命周期,这个bean值创建一次
@Scope(“prototype”) 原型模式,每次从Spring容器中获取此bean都要创建新bean
@Lazy(value=true) 延迟加载
5、Spring工厂底层构建Bean对象借助什么机制?当对象不适用了要释放资源,目的是什么?何为内存泄漏?
答:借助反射机制,防止内存泄漏,对象已经不使用但是还占着内存,这种现象就是内存泄漏,内存泄漏不是内存溢出,但是是内存溢出的导火索,内存溢出直接导致系统崩溃了。
6、描述SpringMvc处理流程及应用优势(重)
答:1.客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配前端控制器的请求映射路径,web容器将请求转交给DispatcherServlet。
2.DispatcherServlet接收到这个请求之后将根据请求之后将根据请求的信息以及处理器映射器HandlerMapping的配置找到处理请求的处理器Handler。
3.由具体的处理器适配器HandlerAdapter对Handler进行具体的调用。
4.Handler对数据处理完成以后将返回一个ModelAndView对象给DispatcherServlet。
5.DispatcherServlet通过视图解析器ViewResolver将ModelAndView转化为真正的视图View
6.Dispatcher通过model解析出ModelAndView中的参数进行解析最终展现出完整的view并返回给客户端。
7、Spring中的事务处理方式及优缺点
答:优点在于:
能够实现全局事务的控制,通过EJB CMT进行事务的管理
能够保证项目模块在系统中完成的功能是可控制的操作AOP
缺点在于:
Spring中的事务声明有编程时事务的申明是事务
8、Mybatis应用中#和$有什么异同点?(重)
答:相同点:都是通过get来获取值的
不同点:$传进去的字符串不带引号,#号带引号
9、Mybatis应用动态SQL解决了什么问题?(重)
答:有时候,固定的sql语句不能够满足我们的应用需求,这个时候需要在标准的基础上建立动态的查询。
Mybatis提供了多种注解,可以提供动态查询语句。比如说在开发时候,遇到这样的场景:界面提供了多种查询,但都是非必填写,在选择查询条件时可以选中任意几种组合作为查询条件,如果在使用jdbc的时候,需要判断参数为空,自己组装sql。但是Mybatis提供动态sql机制,依靠标签。
10、Shiro框架权限管理时的认证和授权流程描述(重)
答:Shiro权限控制流程原理:
应用代码 --调用Subject(Shiro的Subject就代表当前登录用户)控制权限–Subject在shiro框架内部调用Shiro SecurityManager安全管理器,安全管理器调用Realm(程序和安全数据连接器)。
Subject要进行任何操作都必须调用安全管理器,而安全管理器会调用指定的Realms对象,来连接安全数据。
Realms用来编写安全框架代码逻辑和访问安全数据,是连接程序和安全数据的桥梁。
11、BeanFactory和ApplicationContext有什么区别?
答:BeanFactory可以理解为含有Bean集合的工厂类。BeanFactory包含了bean的定义,以便在接收到客户端请求时将对应的bean实例化。BeanFactory还能在实例化对象的时候生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法和销毁方法。
从表面上看,application context如同BeanFactory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能,但applicationContext在此基础上还提供了其他的功能。
12、请解释SpringBean的生命周期(重)
答:SpringBean的生命周期在一个Bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样当一个Bean不再被调用时需要进行相关的析构操作,并从Bean容器中移除。
SpringBeanFactory负责管理在Spring容器中创建Bean的生命周期。Bean的生命周期由两组回调函数组成。
四个阶段:1实例化Instantiation
2属性赋值Populate
3初始化Initialization
4销毁Destruction
13、SpringBean的作用域之间有什么区别?
14、在Spring AOP中,关注点和横切关注的区别是什么?
答:关注点是应用中一个模块的行为,一个关注点可能会被定义一个我们想实现的功能。横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。
15、使用Spring框架的好处是什么?
答:1.轻量:Spring是轻量的
2.控制反转:Spring通过控制反转实现了松散耦合,对象们给出他们的依赖,而不是创建或查找依赖的对象们。
3.面向切面的编程:Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
4.容器:Spring包含并管理应用中对象的生命周期和配置。
5.MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
6.事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务。
7.异常处理:Spring提供方便的API把具体技术相关操作转换为一致的unchecked异常。
16、Spring中用到了哪些设计模式?(重)
答:Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的:
代理模式-在AOP和remoting中杯用的比较多
单例模式-在Spring配置文件中定义的Bean默认为单例模式
模板方法-用来解决代码重复的问题
工厂模式-BeanFactory用来创建对象的实例
适配器:Spring aop
装饰器-spring data hashmapper
观察者-spring时间驱动
回调-spring resourceLoaderAware回调接口
17、Spring如何保证Controller并发的安全?
答:Spring多线程请求过来调用的Controller对象都是一个,而不是一个请求过来就创建一个Controller对象。不要在Controller中定义成员变量。添加注解@Scope(“prototype”)将其设置为多例模式。在Controller中使用ThreadLocal变量。
18、在Spring中如何注入一个Java集合?
答:Spring提供一下集中集合的配置元素:
类型用于注入一列值,允许有相同的值
类型用于注入一组值,不允许有相同的值
19、Spring支持的事务管理类型(重)
答:Spring支持如下两种方式的事务管理:
编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。
声明式事务管理:这种方式意味着你可以将事务管理和业务代码分离,你只需要通过注解或者xml配置管理事务。
20、Spring框架的事务管理有哪些优点?
答:它为不同的事务API提供了统一的编程模型。他为编程式事务管理提供了一个简单的API而非一系列复杂的事务API。它支持声明式事务管理。它可以和Spring的多种数据访问技术很好的融合。
21、SpringMvc的主要组件(重)
答:1.前端控制器DispatcherServlet 作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet就减少了其他组件之间的耦合度。
2.处理器映射器HandlerMapping 作用:根据请求的URL来查找Handler
3.处理器适配器HandlerAdapter
4.处理器Handler
5.视图解析器ViewResolver 作用:进行视图的解析,根据视图逻辑名解析成真正的视图view
6.视图View View是一个接口,它的实现类支持不同的视图类型
22、SpringMvc怎么和Ajax相互调用的?
答:通过Jackson框架就可以把Java里面的对象直接转化成JS可以识别的Json对象,具体步骤如下:
1.加入Jackson.jar
2.在配置文件中配置json的映射
3.在接收Ajax方法里面可以直接返回Object,List等,但方法前面要加上
23、Mybatis中#和$的区别(重)
答:1.#{}是预编译处理,${}是字符串替换
2.Mybatis在处理#{}时,会将sql语句中的#{}替换为?,再调用PreparedStatement的set方法来赋值
3.Mybatis在处理${}时,就是把${}替换成等量的值,相当于字符串拼接
4.使用#{}可以有效防止SQL注入,提高系统安全性。
24、Mybatis的缓存机制,一级,二级介绍一下(重)
答:一级缓存:
默认开启
SQLSession缓存的级别,实现在哟红一个会话中数据的共享
一级缓存的生命周期和SQLSession一致
当有多个SQLSession或者分布式环境下, 数据库写操作会引起脏数据
二级缓存:
默认不开启,需手动开启
SQLSessionFactory级别的缓存,实现不同会话中数据的共享,是一个全局变量
可自定义存储源
当开启缓存后,数据查询的执行的流程是:二级缓存>以及缓存>数据库
不用于一级缓存,二级缓存可设置是否允许刷新和刷新频率实现
实体类实现序列化,在mapper文件中开启
在配置文件中设置cacheEnabled为true
25、SpringMvc与Struts2的区别
答:SpringMvc的入口是一个servlet即前端控制器,而Struts2入口是一个filter过滤器。
SpringMvc是基于方法开发,传递参数时通过方法形参,可以设计为单例或多例
Struts2是基于类开发,传递参数时通过类的属性,只能设计为多例。
26、Mybatis的基本工作流程(重)
答:1.读取配置文件,配置文件包含数据库连接信息和Mapper映射文件或者Mapper包路径。
2.有了这些信息就能创建SQLSessionFactory,SQLSessionFactory的生命周期是程序级,程序运行的时候建立起来,程序结束的时候消亡。
3.SQLSessionFactory建立SQLSession,目的执行sql语句,Sqlsession是过程级,一个方法中建立,方法结束应该关闭。
4.当用户使用mapper.xml文件中配置的方法时,Mybatis首先会解析sql动态标签为对应数据库sql语句的形式,并将其封装进MapperStatement对象,然后通过executor将sql注入数据库执行,并返回结果。
5.将返回的结果通过映射,包装成Java对象。
27、什么是Mybatis的接口绑定,有什么好处?
答:接口映射就是在IBatista中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们通过直接调用接口方法例如:UserMapper userMapper=sqlSession.getMapper (UserMapper.class);就可以,这样比起原来的SqlSession提供的方法,例如:List countryList=sqlSession.selectList(“selectAll”);我们可以有更加灵活的选择和配置。
注意:1.Mapper.xml文件的namespace属性必须配置为接口的全限定名称,接口方法名与Mapper.xml中的select标签的id值相同,且接口方法的返回值类型必须与Mapper.xml配置的resultType一直,这里后者起到决定作用。
2.select查询同通过在Mapper.xml中配置ResultMap标签,将查询结果的列名与字段名对应。
insert语句通过#{属性名}从接口参数获取值放到sql语句中
3.Mapper.xml接口板顶的本质是动态代理。
28、Mybatis的编程步骤
答:
- 创建SqlSessionFactory
- 通过SqlSessionFactory创建SqlSession
- 通过SqlSession执行数据库操作
- 调用session.commit()提交事务
- 调用session.close()关闭事务
29、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对象
30、Mybatis的优缺点
答:优点:
- 易于上手和掌握
- sql写在xml里,便于统一管理和优化
- 减少sql 与程序代码的耦合
- 提供xml标签,支持动态sql编写
缺点: - sql工作量大,尤其是字段多,关联表多时,更是如此
- sql依赖于数据库,导致数据库移植性差
- 由于xml里面标签id必须唯一,导致Dao中方法不支持方法重载,所以Dao层必须是接口
31、使用Mybatis的Mapper接口调用时有哪些要求?
答:
- Mapper接口方法名和Mapper.xml中定义的每个sql的id相同。
- Mapper接口方法的输入参数类型和Mapper.xml中定义的每个sql的parameterType的类型相同
- Mapper接口方法的输出参数类型和Mapper.xml中定义的每个sql的resultType的类型相同
- Mapper.xml文件中的namespace即是Mapper接口的类路径
32、谈谈你对SpringMvc的理解
答:
- 是一个基于Mvc的web框架
- SpringMvc是Spring的一个模块,是Spring的子容器,子容器可以拿父容器的东西,但是父容器不能拿子容器的。
- SpringMvc的前端控制器DispatcherServlet,用于分发请求,使开发变得简单。
- SpringMvc中三大组件:HandlerMapping,处理器映射器,用户请求路径到Controller方法的映射。HandlerAdapter,处理器适配器,根据handler的开发方式的不同区寻找不同的处理器适配器。ViewResolver,视图解析器,可以解析JSP pdf等
33、简述Mybatis的插件运行原理,以及如何编写一个插件?
答:
- Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这四种接口的插件,Mybatis通过动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这四种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。
- 实现Mybatis的Interceptor接口并复写Intercept()方法,然后再给插件编写注解,指定要拦截哪一个接口的哪些方法接口,记住别忘了在配置文件中配置你编写的插件。
34、Mybatis动态sql是做什么的?都有哪些动态sql?能简单描述一下动态sql的执行原理不?
答:
- Mybatis动态sql可以让我们再xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。
- Mybatis提供了9中动态sql标签:trim | where | set | foreach | if | choose | when | otherwise | bind
- 其执行原理为:使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql 的功能。
35、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
答:
- Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true | false。
- 它的原理是,使用CBLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现 a.getB()是null值,name就会单独发送实现保存好的查询对象管理B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用,这就是延迟加载的基本原理。
本文地址:https://blog.csdn.net/weixin_44204662/article/details/108845972
上一篇: 在一个千万级的数据库查寻中,如何提高查询效率????
下一篇: redis相关知识