- 何为Spring Bean容器?Spring Bean容器与Spring IOC 容器有什么不同吗?
- Spring IOC 如何理解?
- Spring DI 如何理解?
- Spring 中基于注解如何配置对象作用域?以及如何配置延迟加载机制?
- Spring 工厂底层构建Bean对象借助什么机制?当对象不使用了要释放资源,目的是什么?何为内存泄漏?
- 描述Spring MVC处理流程及应用优势
- Spring中的事务处理方式及优缺点
- MyBatis应用中#与$有什么异同点
- MyBatis应用动态SQL解决了什么问题
- Shiro框架权限管理时的认证和授权流程描述.
- BeanFactory和ApplicationContext有什么区别?
- 请解释Spring Bean的生命周期?
- Spring Bean的作用域之间有什么区别?
- 在Spring AOP 中,关注点和横切关注的区别是什么?
- 使用Spring框架的好处是什么?
- Spring 中用到了那些设计模式?
- Spring 如何保证 Controller 并发的安全?
- 使用Spring框架的好处是什么?
- 在 Spring中如何注入一个java集合?
- Spring支持的事务管理类型
- Spring框架的事务管理有哪些优点?
- Spring MVC的主要组件?
- SpringMvc怎么和AJAX相互调用的?
- Mybatis 中#和$的区别?
- mybatis的缓存机制,一级,二级介绍一下
- pringMVC与Struts2的区别
- mybatis的基本工作流程
- 什么是MyBatis的接口绑定,有什么好处
- MyBatis的编程步骤
- JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
- MyBatis的优缺点
- 使用MyBatis的mapper接口调用时有哪些要求?
- 谈谈你对SpringMVC的理解
- 简述Mybatis的插件运行原理,以及如何编写一个插件?
- Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?
- Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
- Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?
- Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
- Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?
- MyBatis里面的动态Sql是怎么设定的?用什么语法?
- 答:MyBatis里面的动态Sql一般是通过if节点来实现,通过OGNL语法来实现,但是如果要写的完整,必须配合where、trim节点,where节点是判断包含节点有内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以and 或or开始,那么会自动把这个and或者or取掉 。
- Mybatis都有哪些Executor执行器?它们之间的区别是什么?
- 答:Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。
- 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
- 简单介绍下你对mybatis的理解?
- 介绍一下Spring的事物管理
- SSM优缺点、使用场景?
- SpringMVC的工作流程?
- 如果你也用过struts2.简单介绍下springMVC和struts2的区别有哪些?
- 怎么样把数据放入Session里面 可以声明一个request,或者session先拿到session,然后就可以放入数据,或者可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key
- 讲下SpringMvc的执行流程
- 系统启动的时候根据配置文件创建spring的容器, 首先是发送http请求到核心控制器DispatcherServlet,spring容器通过映射器去寻找业务控制器,
使用适配器找到相应的业务类,在进业务类时进行数据封装,在封装前可能会涉及到类型转换,执行完业务类后使用ModelAndView进行视图转发,
数据放在model中,用map传递数据进行页面显示。 - MyBatis(IBatis)的好处是什么
- ibatis把sql语句从Java源程序中独立出来,放在单独的XML文件中编写,给程序的
维护带来了很大便利。
ibatis封装了底层JDBC API的调用细节,并能自动将结果集转换成JavaBean对象,大大简化了Java数据库编程的重复工作。
因为Ibatis需要程序员自己去编写sql语句,程序员可以结合数据库自身的特点灵活控制sql语句,
因此能够实现比hibernate等全自动orm框架更高的查询效率,能够完成复杂查询。 - Bean 工厂和 Application contexts 有什么区别?
- 解释Spring支持的几种bean的作用域
- 什么是bean的自动装配?
- 什么是基于Java的Spring注解配置? 给一些注解的例子。
- 使用Spring通过什么方式访问Hibernate?
- 如何通过HibernateDaoSupport将Spring和Hibernate结合起来?
- Spring框架的事务管理有哪些优点?
- 在Spring AOP 中,关注点和横切关注的区别是什么?
- AOP作用是什么,底层如何实现在哪些地方会用到,分别简述切面,切入点和通知。
- Spring中AutoWired和,Resource之间区别是什么
何为Spring Bean容器?Spring Bean容器与Spring IOC 容器有什么不同吗?
答:用于创建bean对象,管理bean对象的那个容器
Spring IOC 容器本质上指的的就是Spring Bean容器,
Spring Bean容器中最核心一个机制是IOC机制(
控制反转),所以有时候又将springbean容器称之为
Spring IOC 容器.
Spring IOC 如何理解?
答:IOC 是Spring中提供一种控制反转机制,目的是将我们
项目中对象的依赖管理交给Spring实现,这样可以更好
实现对象关系的解耦,提高程序的可扩展性.
Spring DI 如何理解?
答:DI 是Spring中的依赖注入机制,IOC的实现需要借助
这种机制.我们通常会这样理解,Spring Bean容器中的
IOC思想一种目标,DI是实现这种思想的目标的手段.
Spring 中基于注解如何配置对象作用域?以及如何配置延迟加载机制?
答:@Scope(“singleton”)
@Scope(“prototype”)
@Lazy(value=true)
Spring 工厂底层构建Bean对象借助什么机制?当对象不使用了要释放资源,目的是什么?何为内存泄漏?
答:借助反射机制,防止内存泄漏,对象已经不使用了但占用着内存,这种现 象称之为内存泄漏,内存泄漏不是内存溢出,但是它是内存溢出的一个导火索. 内存溢出直接就导致系统崩溃了.
描述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并返回给客户端。
Spring中的事务处理方式及优缺点
答:优点在于:
1:能够实现全局事务的控制,通过EJB CMT进行事物的管理。
2:能够保证项目模块在系统中完成的功能是可可控制的的操作(AOP)
缺点在于:
1:Spring中的事物声明有编程式事物和申明是事物
MyBatis应用中#与$有什么异同点
答:
相同点:都是通过get来获取值的
不同点:$传进去的字符串不带引号 #号带引号
MyBatis应用动态SQL解决了什么问题
答:有时候,固定的sql语句不能够满足我们的应用需求。这个时候需要在 标准的基础上建立动态的查询语句。
Mybatis提供了多种注解,可以提供动态查询语言。
比如说在开发的时候,遇到这样的场景,界面提供了多种查询,但是都是非 必填写,在选择查询条件时可以选中任意几种组合作为查询条件,如果在使 用jdbc的时候,需要判断参数为空,自己组装sql,
但是mybatis提供动态sql机制,依靠标签。
Shiro框架权限管理时的认证和授权流程描述.
答:Shiro权限控制流程的原理:
应用代码 —- 调用Subject (shiro的Subject 就代表当前登陆用户) 控制权限 —- Subject 在shiro框架内部 调用 Shiro SecurityManager 安全管理器 —– 安全管理器调用 Realm (程序和安全数据连接器 )。
Subject要进行任何操作,都必须要调用安全管理器(对我们来说是自动的)。
而安全管理器会调用指定的Realms对象,来连接安全数据。
Realms用来编写安全代码逻辑和访问安全数据,是连接程序和安全数据的桥梁。
BeanFactory和ApplicationContext有什么区别?
BeanFactory 可以理解为含有bean集合的工厂类。BeanFactory 包含了种bean的定义,以便在接收到客户端请求时将对应的bean实例化。<br /> BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。<br />从表面上看,application context如同bean factory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能。但application context在此基础上还提供了其他的功能。
请解释Spring Bean的生命周期?
Spring Bean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。<br /> Spring bean factory 负责管理在spring容器中被创建的bean的生命周期。Bean的生命周期由两组回调(call back)方法组成。<br /> 初始化之后调用的回调方法。<br /> 销毁之前调用的回调方法。<br /> Spring框架提供了以下四种方式来管理bean的生命周期事件:<br /> InitializingBean和DisposableBean回调接口<br /> 针对特殊行为的其他Aware接口<br /> Bean配置文件中的Custom init()方法和destroy()方法<br /> @PostConstruct和@PreDestroy注解方式<br /> 使用customInit()和 customDestroy()方法管理bean生命周期的代码样例如下:<br />
Spring Bean的作用域之间有什么区别?
Spring容器中的bean可以分为5个范围。所有范围的名称都是自说明的,但是为了避免混淆,还是让我们来解释一下:<br />singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。<br />prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。<br />request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。<br />Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。<br />global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。<br />全局作用域与Servlet中的session作用域效果相同。
在Spring AOP 中,关注点和横切关注的区别是什么?
关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。
使用Spring框架的好处是什么?
- 轻量:Spring 是轻量的,基本的版本大约2MB。
- 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
- 面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
- 容器:Spring 包含并管理应用中对象的生命周期和配置。
- MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
- 事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。、
Spring 中用到了那些设计模式?
Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的:
- 代理模式—在AOP和remoting中被用的比较多。
- 单例模式—在spring配置文件中定义的bean默认为单例模式。
- 模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
- 工厂模式—BeanFactory用来创建对象的实例。
- 适配器–spring aop
- 装饰器–spring data hashmapper
- 观察者– spring 时间驱动模型
- 回调–Spring ResourceLoaderAware回调接口
Spring 如何保证 Controller 并发的安全?
Spring 多线程请求过来调用的Controller对象都是一个,而不是一个请求过来就创建一个Controller对象。
并发的安全? 原因就在于Controller对象是单例的,那么如果不小心在类中定义了类变量,那么这个类变量是被所有请求共享的,这可能会造成多个请求修改该变量的值,出现与预期结果不符合的异常
那有没有办法让Controller不以单例而以每次请求都重新创建的形式存在呢?
答案是当然可以,只需要在类上添加注解@Scope(“prototype”)即可,这样每次请求调用的类都是重新生成的(每次生成会影响效率)
虽然这样可以解决问题,但增加了时间成本,总让人不爽,还有其他方法么?答案是肯定的!
使用ThreadLocal来保存类变量,将类变量保存在线程的变量域中,让不同的请求隔离开来。
使用Spring框架的好处是什么?
轻量:Spring 是轻量的,基本的版本大约2MB。
控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
容器:Spring 包含并管理应用中对象的生命周期和配置。
MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。
在 Spring中如何注入一个java集合?
Spring提供以下几种集合的配置元素:
- 类型用于注入一列值,允许有相同的值。
类型用于注入一组值,不允许有相同的值。 类型用于注入一组键值对,键和值都只能为String类型 Spring支持的事务管理类型
Spring支持如下两种方式的事务管理:
编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。
声明式事务管理:这种方式意味着你可以将事务管理和业务代码分离。你只需要通过注解或者XML配置管理事务。Spring框架的事务管理有哪些优点?
它为不同的事务API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了统一的编程模型。
它为编程式事务管理提供了一个简单的API而非一系列复杂的事务API(如JTA).
它支持声明式事务管理。
它可以和Spring 的多种数据访问技术很好的融合。Spring MVC的主要组件?
(1)前端控制器 DispatcherServlet(不需要程序员开发)
作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
(2)处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的URL来查找Handler
(3)处理器适配器HandlerAdapter
注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。
(4)处理器Handler(需要程序员开发)
(5)视图解析器 ViewResolver(不需要程序员开发)
作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)
(6)视图View(需要程序员开发jsp)
View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)
SpringMvc怎么和AJAX相互调用的?
通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 :
(1)加入Jackson.jar
(2)在配置文件中配置json的映射
(3)在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上
Mybatis 中#和$的区别?
1. #{}是预编译处理,${}是字符串替换。<br /> 2. Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;<br /> 3. Mybatis在处理${}时,就是把${}替换成变量的值,相当于字符串拼接<br /> 4. 使用#{}可以有效的防止SQL注入,提高系统安全性。
mybatis的缓存机制,一级,二级介绍一下
一级缓存
默认开启
SqlSession级别的缓存,实现在同一个会话中数据的共享
一级缓存的生命周期和SqlSession一致
当有多个SqlSession或者分布式环境下,数据库写操作会引起脏数据。
二级缓存
默认不开启,需手动开启
SqlSessionFactory级别的缓存,实现不同会话中数据的共享,是一个全局变量
可自定义存储源,如Ehcache
当开启缓存后,数据查询的执行的流程是:二级缓存>一级缓存>数据库
不同于一级缓存,二级缓存可设置是否允许刷新和刷新频率实现
实体类实现序列化,在mapper文件中开启
在配置文件中设置cacheEnabled为true
pringMVC与Struts2的区别
pringmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
pringmvc是基于方法开发,传递参数是通过方法形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
mybatis的基本工作流程
1.读取配置文件,配置文件包含数据库连接信息和Mapper映射文件或者Mapper包路径。
2.有了这些信息就能创建SqlSessionFactory,SqlSessionFactory的生命周期是程序级,程序运行的时候建立起来,程序结束的时候消亡
3.SqlSessionFactory建立SqlSession,目的执行sql语句,SqlSession是过程级,一个方法中建立,方法结束应该关闭
4.当用户使用mapper.xml文件中配置的的方法时,mybatis首先会解析sql动态标签为对应数据库sql语句的形式,并将其封装进MapperStatement对象,然后通过executor将sql注入数据库执行,并返回结果。
5.将返回的结果通过映射,包装成java对象。
什么是MyBatis的接口绑定,有什么好处
接口映射就是在IBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们通过直接调用接口方法 例如:
UserMapper userMapper=sqlSession.getMapper (UserMapper.class) 就可以,这样比起原来了SqlSession提供的方法,例如List
注意:(1)Mapper .xml文件的namespace属性必须配置为接口的全限定名称,接口方法名与Mapper.xml中的
