一、Spring

1.什么是Spring?
答:Spring是一个开源的轻量级开发框架,用于开发java应用,减轻模块之间,类与类之间的管理,提高开发人员的开发效率以及增强系统的可维护性。
2.使用Spring的好处的是什么?
答:Spring的好处在于它的几个核心模块,IOC:就是由框架来创建于管理对象,来实现与代码之间的解耦合。 AOP:面向切面的编程,实现系统功能与业务代码之间的分离。改动系统功能的时候可以不用改动业务代码。事务管理:提供了一种对不同数据库处理事务的统一模型。
3.说说Bean的生命周期?
答:bean的声生命周期主要是创建对象的过程。
解析spring管理的类的beanDefinition——->实例化对象——->对象属性赋值—->初始化——>AOP———>代理对象(代理对象没有进行属性填充)———使用bean———>销毁。
这里初始化主要在赋值之后需要进行的一些动作,比如某些属性还未赋值,可以在初始化方法中进行赋值。初始化后看对象要不要进行AOP,这里生成对象前看对象是否有相应的切面对象,如果有,那么就生成代理对象。
4.AOP的实现原理?
答:AOP实现原理都是基于动态代理,有两种方法,JDK基于接口的动态的代理和cglib基于继承的动态代理。对于jdk方式,通过共同实现的接口创建出一个代理对象;对于cglib,创建一个类继承被代理类,然后找到相关联切面对象的方法放置在子类方法对应的位置,最后生成的代理类是子类,代理对象没有属性填充。
5.构造方法是如何进行注入的?
答:如果有多个构造方法,默认是用无参的构造方法创建对象,如果是多个有参数的会报错,如果想要不报错用@Autowired注解在对应的构造方法上,这个注解先byType后byName。
如果只有一个有参数的构造方法,会优先byType,如果容器中有多个同类型的bean,则会byName来寻找。
6.AutoWired的工作原理?
答:先byType——>找到isAutowiredCandidate为true的对象(该属性默认为true)——->筛选是否符合Qualifier(这个是注解),@Qualifier(“xxx”)这个注解相当于一个表示,放在@AutoWired下面,找到的对象看有没有也有这个注解标识的,有的话优先从里面选———>找有没有@Primary注解标识的对象,该bean为主bean———->最后byName
7.@Resource注入的原理?
答:@Resource(name=”xxx”)加了name属性,那就根据byName的方式来寻找对象,如果没找到就报错。
如果不加name属性,先byName后byType。
8.为什么要有AtuoWired和Resource?
答:
9、Spring中使用到哪些设计模式?
答:工厂模式:使用BeanFactory创建对象。
代理模式:AO。、。、P底层的动态代理。
单例模式:spring中的bean默认都是单例的。
适配器模式:Spring MVC中用到处理器适配器来执行处理器对象。
10.了解事务的传播行为吗?
答:我知道常用的几个,PROPOGATION_REQUIRED:是默认的传播行为,表示当前上下文存在事务的情况会加入到事务中运行,如果没有的话就新建一个事务运行;PROPOGATION_SUPPORT:当前上下文存在事务就加入到事务中运行,没有的话就以非事务方式运行;PROPOGATION_REQUIRES_NEW:无论上下文是否存在事务都新建一个事务的方式运行。
11.了解事务的隔离级别吗?
答:在事务处理中,通常可能会出现脏读、幻读、不可重复读等现象,不同事务隔离级别就是为了处理这些现象。
脏读:事务A读取到了事务B还没有提交的数据,比如事务A读取卡里余额1000元,事务B取走了100元,但是还有提交,切回到事务A读取到的还是1000元,读出来的数据是错的,脏读。
不可重复读:事务两次读取到的数据不一样,事务A多次读取同一个数据,中间事务B对数据进行了修改并提交,然后事务A再次读取到数据发生变化,叫不可重复读。
幻读:事务前后两次查询一个范围的是时候,后一次发现了前一次没有的行。事务A发现了自己没有操作过的数据,很梦幻,叫幻读。多是增删等操作。
12、什么是循环依赖?怎么解决?为什么不用两级缓存?
答:在几个单例Bean中出现了互相应用的场景。比如A依赖于B,B依赖于A,A在创建对象中发现需要B,然后去实例化B,又发现B需要A,于是就这样循环下去导致OOM。
使用三级缓存解决,先创建对象A,放到三级缓存(singleonFactories)中,填充属性的时候发现需要B,然后创建B对象,放到三级缓存中,B填充属性的时候发现需要A,在创建A的过程中发现A存在于三级缓存中,就将A移到二级缓存中,然后给B注入,B完成后放入到一级缓存,然后就给A填充属性,完成后放入到一级缓存。完成创建。
三级缓存中的二级缓存是为了使用aop生成Bean的代理对象。
13.说说你对IoC和AOP的理解?
答:IoC的全称是控制反转,控制指的是创建、配置、管理对象,控制对象的声明周期,反转是把控制对象的权利交给IoC容器。简单来说就是把本应由自己创建、配置、管理对象以及控制对象的声明周期的权利交给IoC容器。
依赖注入是实现控制反转的手段,依赖注入就是把程序内对象需要的数据注入给对象。举个例子类A中维护了一个类B的对象,类A不需要new一个B对象,只需要在外部中把B对象注入到类A中来。
这样做的好处
一、自己不用再重复的创建对象,因为自己创建对象,给对象赋值这过程是很麻烦的,如果很多地方都要用到对象那就要繁琐的进行创建对象,这一过程是非常繁琐的,让容器帮我们创建管理,需要的时候拿来用就可以了很省心。
二、实现了对象的解耦,举个例子,类A中维护有一个类B对象,需要类A来控制类B,两者呈现直接依赖关系,如果实现了控制反转,B对象将由容器来进行注入,类A不用关心是如何创建的。实现了类A和类B之间的解耦。
AOP的全称是面向切面的编程,我先解释切面是什么,在一个项目中的业务代码中,不同对象之间可能存在相同的公共行为,将这些公共行为的代码提取出来就是切面程序。使用AOP,我们可以在不修改业务代码的情况下为不同业务组件添加切面程序。比如我们项目中许多的service类,类中所有方法都需要记录运行的时间,如果在每个方法内都添加这样一个功能,代码维护起来是非常困难的,我们可以把这样一个功能给提取出来,在需要该功能的地方将公共功能与其连接起来,实现了与业务代码相解耦,维护起来也更加方便。AOP就是实现了不同模块相同行为的统一管理
14.静态代理和动态代理的区别?
答:静态代理在编译时期生成代理类;动态代理对象在运行的时候通过反射来创建。
静态代理通常只能代理一个类;动态代理可以代理同一个接口下的多个类。
15.session在框架中是怎么管理的?
答:
16、@Component和@Bean的区别?
答:@Component注解作用与类,被这个注解标记的类会被实例化然后装配到spring容器中。
@Bean作用于方法,方法中返回了对象,是要告诉spring这个对象,当需要的时候从这里获取。

二、Spring MVC

1.什么是Spring MVC?
答:Spring MVC基于Spirng,在Spring的基础上加了一些功能,专门用于web开发,可以理解成servlet的升级,底层实现都是用的servlet,框架把功能给简化,更便于开发。
2.Spirng MVC的工作流程?
答:1)用户提交请求到中央处理器; 2)中央处理器把请求转发到处理器映射器来获取容器中的处理器对象,放到处理器执行链中; 3)中央调度器把处理器执行链转发到处理器适配器中执行处理器对象; 4)返回的结果再由中央调度器转发到视图解析器; 5)进行视图解析器返回具体View; 6)中央调度器渲染视图最后返回响应。
3.Spring和Spring MVC创建容器对象的区别?
答:Spring是通过创建监听器创建的,监听全局域对象创建的,而Spring MVC是通过新建中央调度器的是调用servlet的init方法创建的。之后都把对象放到全局域对象中。
4.过滤器和拦截器的区别?
答:1)过滤器是servlet规范中的对象,而拦截器是spring mvc框架中的对象。
2)功能上不同,filter主要是用来过滤参数的,比如对请求进行统一编码;interceptor主要用来进行权限控制的,比如发现用户名不对不让进入到业务代码。
3)filter在只有一个时间点进行处理,在处理方法之前;而拦截器可以在三个时间点执行,在处理方法之前和处理方法之后以及请求处理完成后。
5.说一下MVC?
答:MVC把一个项目给分层处理,把视图,业务逻辑和数据分离,M是Model的简写,负责数据相关的功能,比如与数据库交互;V是View的缩写,主要是用户所看到界面等;C是Controller的缩写,主要负责逻辑业务的处理。
6.接收参数的方式有哪些,比如接受json格式的,url传参,表单传送的?
答:对于从表单和url方式传送的参数,可以用参数去逐个接收,也可以用对象去接受,或者用request对象来接收,然后request.getParameter来获取。
对于json格式的数据从前台接收,在参数前面加上@RequestBody注解

三、MyBatis

1.#{}与${}的区别?
答:mybatis在处理#{}的时候,会将其替换成?号,使用preparedStatement来注入参数。
而${}会将其对应的变量进行一个字符串替换。
2.Mybatis动态SQL是什么?都有哪些动态SQL?能简述下动态SQL的执行原理吗?
答:动态SQL是以标签的形式动态的编写SQL,根据条件来拼接SQL语句。
常用的有if、where、foreach,where用来包含多个if语句,并去掉多 余的AND,OR等。
原理是从标签中的变量获取值来进行判断,满足条件就把语句给拼接起来。
3.不同映射文件的id是否可以重复?
答:如果映射文件配置了namespace就可以,namespace是代理接口,id是被代理方法名,这两者结合确定了一个唯一方法,方法名是可以重复的,只要是不同接口就行了。
4.说说mybatis的执行器?
答:SimpleExecutor:每次执行sql语句都创建一个statement对象,用完关闭、
ReuseExecutor:执行update或select前,先检查map里面有没有该sql对应的statement对象,如果没有就创建一个执行后放到map中。
BatchExecutor:不支持查询语句,把sql语句都加到批处理中执行。