Spring相关面试题(1)

1、Spring 是如何管理事务的?事务机制?以及隔离级别?

事务的概念:事务必须服从ACID原则,ACID指的是原子性,一致性,隔离性,持久性;通俗理解事务就是一系列指令的集合;
事务特性:

原子性:操作指令时,要么全部成功,要么全部不执行,只要其中一个指令执行失败,所有的指令执行失败,数据进行回滚,回到指令前状态;
一致性:事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性报保持稳定;
  隔离性:在该事务执行的过程中,无论发生的任何数据的改变都应该只存在于事务之中,对外界不存在任何影响,只有在事务确定正确提交之后,才会示该事务对数据的改变
  持久性:当事务正确完成之后,它只对于数据的改变是永久性的;

编程式和声明式事务的区别:

   Spring提供了编程式和声明式事务的支持,编程式事务允许用户在代码中精确定义事务的边界,而声明式事务(基于AOP)有助于用户将操作与事务规则进行解耦;

事务管理机制:

  Spring并不直接管理事务,而是提供了多种事务管理器,他们讲事务管理职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架事务来实现。

事务的隔离级别

ISOLATION_DEFAULT:使用后端数据库默认的隔离级别
ISOLATION_READ_UNCOMMITTED:最低隔离级别,允许读取商未提交的数据变更,可能会导致脏读,幻读和不可重复读;
ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读和不可重复读仍有可能发生;
ISOLATION_REPRATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生;
ISOLATION_SERIALIZABLE:最高的隔离级别,完全服从ACID的隔离级别,确保阻止脏读,不可重复读,以及幻读,也是最慢的事务隔离级别,因为通常是通过完全锁定事务相关的数据库来实现的。

2、SpringAOP的实现原理:

  AOP的概念:面向切面编程;
  OOP的概念:面向对象编程;
Spring框架中的AOP体现了设计模式中的代理模式;

3、动态代理区别:

  动态代理分为:JDK反射机制和CGLIB;

  JDK:目标类和代理类实现了共同的接口;
            拦截器必须实现InvocationHandler接口,这个接口中invoke方法体的内容就是代理对象方法体的内容;
  CGLIB:目标类 是代理类的父类;
                拦截器必须实现MethodInterceptor接口,而接口中的intercept方法就是代理类的方法体,使用字节码增强机制创建代理对象。

4、动态代理的特性?

动态代理的特性:
1、继承了Proxy类,实现了代理的接口。
2、提供了一个使用InvocationHandler作为参数的构造方法;
3、生成静态代码块来初始化接口中的method对象,以及Object类的equals、hashcode、toString方法;
4、重写了Object类equals、hashcode、toString。他们都是简单的调用了InvocationHandler的invoke方法,即可以对其进行特殊操作,也就是说JDK的动态代理还可以代理上述三个方法;

5、动态代理和静态代理区别:

  静态代理需要手工编写代理类,代理类引用被代理对象(在代理对象和目标对象实现共同接口,并且代理对象持有目标对象的引用);
  动态代理是在内存中构建的,不需要手动编写代理类(jdk1.3后主要实现InvocationHandler,并且将目标对象注入到代理对象中,利用反射机制来中目标对象的方法)
代理目的:是为了在原有的方法上进行增强;

6.IOC和DI是什么?

IOC是什么?控制反转。是一种设计思想,Ioc意味着将你设计好的对象交给容器控制,而
不是传统的在你的对象内部直接控制
为什么反转了,哪些地方反转?传统应用程序是由我们自己在对象中主动控制区直接获取依
赖对象,也就是正转,而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接收依赖对象,所以是反转,哪些方面反转了?依赖对象的获取被反转了。
DI是什么:依赖注入,是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。
谁依赖谁:当然是应用程序依赖于IOC容器;
为什么需要依赖:应用程序需要IOC 容器提供对象需要的外部资源
谁注入谁;很明显是IOC容器注入应用程序某个对象,应用程序依赖的对象。
注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、数据常量)

7、Spring中用到了哪些设计模式?

简单工厂:实质就是由一个工厂类根据传入的参数,动态决定应创建哪一类产品类;
工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类,Spring中的FactoryBean就是典型的工厂方法模式;
单例:保证一个类仅有一个实例,并提供一个访问它的全局访问点,
Spring中单例模式完成了后半句,即提供了全局的访问点BeanFactory,但没有从构造器级别控制单例,这是因为Spring管理的是任意的JAVA对象。
适配器:将一个类的接口传换成客户希望的另外一个接口,Aadapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作;
包装器:动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式相比生产子类更为灵活。
代理:从结构上来看和Decorator模式类似,但Proxy是控制,更像是一种对功能的限制,而Decorator是增加职责;

8、Spring中Bean的作用域有哪些?

Singleton:该属性定义Bean时,Ioc容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例;
prototype:使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例;
Request:该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,使用于WebApplicatinContext环境;
Session:该属性仅用于HttpSession,同Session作用域不同,所有的Session共享一个Bean实例;

9、Spring框架实现实例化和依赖注入的方式分别是什么?

实例化bean:也就是依赖对象实例化;
创建方式:Setter方法,构造函数、静态工厂、实例工厂;
依赖注入的方式:
使用最广泛的@Autowired:自动装配:用于替代基于XML配置的自动装配;
Setter方法注入:假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然后创建SpringDao的set方法;
构造器注入:是指带有参数的构造函数注入
静态工程的方法注入:就是通过调用静态工厂的方法来获取自己需要的对象,为了让Spring管理所有对象,我们不能直接通过“工程类静态方法”
来获取对象,为了让Spring注入的形式获取;
实例工厂的模式注入:实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先new工厂类,在调用普通的实例方法;

☆☆10、SpringMVC的工作流程;

(1)用户发送请求至前段控制器DispatcherServlet;
(2)DispatcherServlet收到请求调用HandlerMapping处理器映射器;
(3)处理器映射器根据请求URL找到具体的处理器,生产处理器对象及处理器拦截器,一并返回DispatcherServlet;
(4)DispatcherServlet通过HandlerAdapter处理器适配器调用处理器;
(5)执行处理器(Controller,也叫后端处理器)
(6)Controller执行完成后返回ModelAndView;
(7)HandlerAdapter将Controller执行结果ModelAndView返回给DispatherServlet;
(8)DispatcherServler将ModelAndView传给ViewReslover视图解析器;
(9)ViewReslover解析后返回具体View;
(10)DispatcherServlet对View进行渲染视图,DispatcherServlet响应用户。

11、SpringMVC如何进行参数绑定?

1、默认支持参数绑定(HttpServletRequest,HttpServletResponse,HttpSession,Model/ModelMap)
2、基于类型的参数绑定
(@RequestParam,@pathVariable,@ModelAttibute,特殊情况下可以用自定义类型转换器——实现converter接口)
3、pojo类型的绑定
4、高级参数的绑定,与数组的参数绑定,与集合参数的绑定

12、SpringMVC获取表达数据的几种方式?

1、直接把表单的参数写在Controller相应的方法的形参中;
2、通过HttpServletRequest接收
3 、通过一个Bean来接收,用这个Bean来封装接收参数
4、利用JS中的ajax请求通过json数据接收;

13、SSM架构的整合流程

1、maven引入需要的JAR包;
2、Spring与MyBatis的整合
2.1、建立JDBC属性文件jdbc.properties
2.2建立spring-mybatis.xml配置文件,主要就是自动扫描,自动注入,配置数据库,事务管理;
2.3配置Log4j
2.4JUnit测试
3.整合SpringMVC
3.1配置spring-mvc.xml 主要是自动扫描控制器,视图解析器,注解驱动的启动这三个;
3.2配置web.xml文件,引入Spring-mybatis.xml编码顾虑器,Spring监听器,配置Spring-mvc的Servlet前段控制器
4整合完毕,进行测试

★★★★★14、mybatis和hibernate之间的优缺点比较?

hibernate的优点:
1、hibernate是全自动,hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库映射结构来自动生成sql;
2、功能强大,数据库无关性好,O/R映射能力强,需要些的代码很少,开发速度快;
3、有更好的二级缓存机制,可以使用第三方缓存;
4、数据库移植性良好;
5、hibernate拥有完整的日志系统,hibernate日志系统非常健全,设计广泛,包括sql记录,关系异常,优化经过,缓存提示,脏数据警告;
hibernatr的缺点:
1、学习门榄高,精通门榄更高,程序员如何设计O/R映射,在性能和对象模型之间如何取得平和,以及怎样更好Hibernate方面需要的经验和能力都很强才行;
2、hibernate的sql很多都是自动生成的,无法直接维护sql。
Mybatis的优点:
1、易于上手和掌握,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有 那么高的对象模型要求的项目来说,相当完美;
2、sql写在XML里,便于统一管理和优化,解除sql与程序代码的耦合;
3、提供映射标签,支持对象与数据库的orm字段的关系映射;
4、提供对象关系映射标签,支持对象关系组建维护;
5、提供xml标签,支持编写动态sql;
6、速度相对于hibernate的速度较快;
Mybatis的缺点:
1、关联表多时,字段多时,sql的工作量很大,
2、sql依赖于数据库,导致移植性很差;
3、由于XML里的标签id必须唯一,导致DAO中的方法不支持方法重载;
4、对象关系映射标签和字段映射标签仅仅是映射关系的描述,具体实现映入依赖于sql;
5、Dao层过于简单,对象组装工作量大,
6.不支持级联更新,级联删除;
7、Mybatis的日志除了基本记录外,其他功能薄弱很多;
8、编写动态SQL时,不方便调试,尤其逻辑复杂时;
9、提供的写动态sql的标签xml功能简单,编写动态sql仍然受限,可读性低。

15、Mybatis中的动态sql是什么意思?

1、mybatis提供用ognl表达式动态生成sql的功能
2、传统的jdbc方法中,在写组合的多表复杂sql语句时,需拼接sql语句,稍不注意少写一个空格,就好导致报错,mybatis动态sql功能,就拥有有效解决了这个办法;
3、例如:
if标签:多个条件查询时候用到where标签,可以自动处理第一个and;
Foreatch:应用场景,在多个ID查询时,传递的是集合或者数组的时候;

16、Mybatis中Mapper动态代理的规范是什么?

1.Mapper.xml配置文件汇中namespace要和接口的全路径一致;
2.接口中的方法名要和mapper.xml中statement的ID要相同;
3.接口中的方法的参数类型要和paeemeterType的类型要一致;
4.接口中的方法的返回值类型要和mapper.xml配置文件resultType一致;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值