提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录面试题1. 什么是IOC容器(说说你对spring IOC的理解)2. Spring IOC容器是如何创建一个对象的?有哪些生命周期方法?3. 什么是AOP?4. Spring是如何实现AOP的?BeanPostProcessor?5.什么是数据库事务?Spring中如何实现事务控制?6.Mybatis 中 ,# 和 $ 的区别?什么是sql注入?如何防止?7.SpringMVC的 DispatcherServlet的工作原理描述一下。
提示:以下是本篇文章正文内容,下面案例可供参考
1. 什么是IOC容器(说说你对spring IOC的理解)SpringIOC负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期)
2. Spring IOC容器是如何创建一个对象的?有哪些生命周期方法?Spring创建对象的方式:
通过有参构造
通过下标
通过参数名 【推荐】
通过参数类型
通过无参构造
默认会用无参构造
① 通过构造器或者工厂方法创建bean实例
② 为bean的属性设置值和对其他bean的引用
③ 调用bean的初始化方法
④ 使用bean
⑤ 当容器关闭时,调用bean的销毁方法
AOP是面向切片编程.在运行时,动态的将代码切入到类的指定方法中,指定位置上的编程思想就是面向切面的编程,以达到优化代码,减少重复代码的目的.
4. Spring是如何实现AOP的?BeanPostProcessor?AOP可以有多种实现方式,而Spring AOP支持如下两种实现方式。
JDK动态代理:这是Java提供的动态代理技术,可以在运行时创建接口的代理实例。Spring AOP默认采用这种方式,在接口的代理实例中织入代码。
CGLib动态代理:采用底层的字节码技术,在运行时创建子类代理的实例。当目标对象不存在接口时,Spring AOP就会采用这种方式,在子类实例中织入代码。
5.什么是数据库事务?Spring中如何实现事务控制?事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。
事务必须有四种属性:原子性,一致性,隔离性,持久性。
Spring实现事务控制
编程式事务管理
声明式事务管理
基于xml配置文件方式
基于注解方式
#{}是预编译处理,KaTeX parse error: Expected 'EOF', got '#' at position 20: …符串替换 Mybatis在处理#̲{}时,会将sql中的#{}替…{}时,就是把${}替换成变量的值
使用#{}可以有效的防止SQL注入,提高系统的安全性
SQL 注入其实就是恶意用户通过在表单中填写包含 SQL 关键字的数据来使数据库执行非常 规代码的过程
7.SpringMVC的 DispatcherServlet的工作原理描述一下。Tomcat 启动,对 DispatcherServlet 进行实例化,然后调用它的 init() 方法进行初始化,在这个初始化过程中完成了:对 web.xml 中初始化参数的加载;建立 WebApplicationContext (SpringMVC的IOC容器);进行组件的初始化;
客户端发出请求,由 Tomcat 接收到这个请求,如果匹配 DispatcherServlet 在 web.xml 中配置的映射路径,Tomcat 就将请求转交给 DispatcherServlet 处理;
DispatcherServlet 从容器中取出所有 HandlerMapping 实例(每个实例对应一个 HandlerMapping 接口的实现类)并遍历,每个 HandlerMapping 会根据请求信息,通过自己实现类中的方式去找到处理该请求的 Handler (执行程序,如Controller中的方法),并且将这个 Handler 与一堆 HandlerInterceptor (拦截器) 封装成一个 HandlerExecutionChain 对象,一旦有一个 HandlerMapping 可以找到 Handler 则退出循环;(详情可以看 [Java]SpringMVC工作原理之二:HandlerMapping和HandlerAdpater 这篇文章)
DispatcherServlet 取出 HandlerAdapter 组件,根据已经找到的 Handler,再从所有 HandlerAdapter 中找到可以处理该 Handler 的 HandlerAdapter 对象;
执行 HandlerExecutionChain 中所有拦截器的 preHandler() 方法,然后再利用 HandlerAdapter 执行 Handler ,执行完成得到 ModelAndView,再依次调用拦截器的 postHandler() 方法;
利用 ViewResolver 将 ModelAndView 或是 Exception(可解析成 ModelAndView)解析成 View,然后 View 会调用 render() 方法再根据 ModelAndView 中的数据渲染出页面;
最后再依次调用拦截器的 afterCompletion() 方法,这一次请求就结束了。



