问:
你们现在使用什么框架?做什么功能?
答:
我们一般使用SSM。
S=spring mvc,作为一个mvc分层结构。
S=spring 使用ioc和aop的功能,事物的功能。
M=mybatis 作为数据持久层框架。还有mybatis的通用Mapper插件,可以代替我们去写一些
繁琐的的SQL文件。mybatis generator作为自动生成实体类和dao文件和xml文件。
问:
嗯,好的,既然你说你用到springmvc那么讲讲spring mvc,从前端ajax请求到后端和返回
数据到前端的流程。
答:
1.用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
2.DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,
调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler
对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
3.DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:
如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
4.提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充
Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的
响应信息数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5.Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
6.根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中
的ViewResolver)返回给DispatcherServlet ;
7.ViewResolver 结合Model和View,来渲染视图
8.将渲染结果返回给客户端.

问:
已经很详细了,但是也可以Hander执行完后,返回一个json对象,然后执行拦截器和过滤器,
再返回给前端。好的。那你可以讲讲spring的ioc和aop吗?
答:
ioc(Inversion of Control)是spring的一个基础功能,也就是DI,意思是控制反转,将原本
需要我们自己在代码中new一个对象的过程,现在交给spring框架来做。ioc是工厂模式,
我们需要什么工厂都给我们创建出来。
例如我们用xml来给出类的定义,spring ioc来利用java的反射机制,来实现这个类。将工厂和
对象生成二者分开。目的就是提高灵活性和可维护性。
aop是spring的另外一个比较重要的功能,(Aspect-Oriented Programming),面向切面编程。
通常我们使用它作为日志记录,登录校验,他的本质是代理模式,将要切面的类进一步加强。
问:
你说ioc是工厂模式,那么为什么不直接使用工厂模式。或者说工厂模式和IOC有什么区别?
答:
(卧槽,这一下真的没想到......),直接使用工厂模式会比较麻烦,ioc是使用java反射机制。
当需求变化频繁时,工厂模式往往需要更改的代码很多,如果使用ioc会更加精简。是一种动态
生成。
问:
ioc的使用是更加低侵入性。你只到spring中bean的生命周期吗?
答:
在spring创建bean时,他的生命周期是在这个容器开始创建时和这个容器销毁时会销毁这个bean。
Bean的生命周期:
spring bean的完整生命周期从创建Spring容器开始,直到spring容器销毁bean.
bean自身的方法,Bean本身调用的方法和通过配置文件中<bean>的init-method和destroy-method指定的方法
Bean级生命周期接口方法 BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean这些接口的方法
容器级生命周期接口方法 InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 这两个接口实现,
一般称它们的实现类为“后处理器”。
工厂后处理器接口方法 AspectJWeavingEnabler, ConfigurationClassPostProcessor, CustomAutowireConfigurer等等
非常有用的工厂后处理器 接口的方法。工厂后处理器也是容器级的。在应用上下文装配配置文件之后立即调用
实例BeanFactoryPostProcessor实例化出
容器级别生命周期接口 BeanPostProcessor ,InstantiationAwareBeanPostProcessor 。
InstantiationAwareBeanPostProcessor 执行before方法对对象属性进行修改
在执行Bean构造器
InstantiationAwareBeanPostProcessor 执行Property方法
为bean注入属性
调用Bean级生命周期接口方法
BeanNameAware BeanFactoryAware
调用容器级生命周期接口方法
BeanPostProcessor
调用Bean级生命周期接口方法
InitializingBean
调用Bean自身的方法
nit-method
调用容器级生命周期接口方法
BeanPostProcessor after方法 修改对象属性
InstantiationAwareBeanPostProcessor after方法 修改对象属性
....初始化成功后正常使用......
调用Bean级生命周期接口方法
DiposableBean
调用Bean自身的方法
destroy-method
销毁
问:
spring的bean的作用域?
答:
spring bean的作用域
最常用的singleton和prototype。
1 singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例
2 prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将
产生一个新的Bean实例
3 request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP
请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效
4 session:对于每次HTTP Session,使用session定义的Bean都将产生一个新实例。同样
只有在Web应用中使用Spring时,该作用域才有效。
5 globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。
典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,
该作用域才有效。
问:
aop呢?具体说一下,从代码角度如何使用它?
答:

查看源码注解你可以知道aop的通知方式:
1 @Before 前置通知 在方法调用前执行
2 @After 后置通知 在方法执行(无论成功与失败)后执行
3 @AfterReturning 成功返回后执行
4 @AfterThrowing 异常返回后执行,还可以指定什么异常返回执行
5 @Around 环绕通知
6 @Pointcut ("execution(public int com.bsg.horus.service.TestAopService.add(int,int))")
execution()-执行 某个方法 public(类的类型) int (返回类型)
com.bsg.horus.service.TestAopService (类) .add 类的方法 (int,int)(里面的参数)
问:
好的。你们对spring的源码了解吗?说出一个spring4的注解。
答:
@Transactional, @RestController, @Service, @GetMapping, 等等。
问:
很好,那你就讲讲Transactional注解实现。
答:
好的。关于事务,数据库间有四个隔离界别。
1 Seriallizable 表明事务被处理为顺序执行,这样事务之间就完全不可能产生干扰。
2 read 该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。
3 committed 该隔离级别表示一个事务只能读取另一个事务已经提交的数据。
4 uncommitted 该隔离界别表示一个事务可以读取另一个事务修改但还没有提交的数据。
事务间的传播行为。
1 required 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
这个是最常见的传播行为,所以这个级别通常能满足处理大多数的业务场景。
2 requires_new 创建一个新的事务,如果当前存在事务,则把当前事务挂起。,执行新事务
完成以后,当前事务恢复再执行。
3 supports 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
4 not_supported 以非事务方式运行,如果当前存在事务,则把当前事务挂起。非事务执行后在
执行当前事务。
5 propagation_never 以非事务方式运行,如果当前存在事务,则抛出异常。不能存在上下文事物。
6 propagation_mandatory 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
(上下文必须有事物)
7 propagation_nested 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;
如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。
问:
好的,我是问从源码角度上说事务如何实现?
答:
在spring的事务,其实本质上就是aop,就是对原来的方法进行代理模式增强方法。源码角度上
并没有太多了解。
总结:
在以前的面试中,对于spring的功能ioc和aop的功能询问的很多。查看你对spring的了解多少。
java面试中基本spring是一定询问的问题,查看你的spring的二个基础功能ioc和aop的深度理解。
mybatis可以查看你的使用程度。