内容来源 https://blog.csdn.net/aohongzhu/article/details/94975515
面试题
什么是控制反转(IOC),什么是依赖注入(DI)
首先知道什么是控制反转 什么是依赖注入 IoC(控制反转) 首先想说说IoC(Inversion of Control,控制反转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好、qq号、电话号、ip号、iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类藕合起来。
那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。 DI(依赖注入) IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。
控制反转 Inversion of Control
创建对象的方式反转了,以前对象的创建是由开发人员自己维护,包括依赖关系也是自己创建. 使用spring后,对象的创建以及依赖关系可以有spring完成创建以及注入了, 反转控制就是反转对象的创建方式.
依赖注入
DI:我们在使用Spring容器的时候,容器通过调用set方法或者是构造器来建立对象之间的依赖关系。
AOP
aop思想面向切面编程,就是横向重复,纵向抽取,用的最多的就是servlet的filter技术.aop主要解决是事务和记录日志
在编写业务逻辑代码的时候,我们习惯性的都要写:日志记录,事物控制,以及权限控制等,每一个子模块都要写这些代码,代码明显存在重复。这时候,我们运用面向切面的编程思想,采用横切技术,将代码中重复的部分,不影响主业务逻辑的部分抽取出来,放在某个地方进行集中式的管理,调用。
aop的名词: Joinpoint(连接点):所谓连接点是指那些被拦截到的点 Pointcut(切入点):所谓切入点是指我们要针对那些joinpoint进行拦截 advice(通知,增强):所谓通知是指拦截到的joinpoint之后要做的事情 traget(目标对象):代理的目标对象 weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程. proxy(代理):一个类被aop织入增强后,就产生了一个结果代理的类 aspect(切面)是切入点和通知
你用aop举例,生活中的一个例子来解释aop
从前有一个叫java的小县城,在一个月黑风高的晚上,这个县城发生命案.凶手十分的狡猾,现场没有留下有什么价值的线索.不过万幸的是,刚从隔壁回来的老王恰好就看这个行凶的过程,但是由于天色已晚,加上凶手蒙面,看清凶手的面目,只知道凶手是个男性,身高约7尺五寸,java的县令根据老王的描述,对守门的士兵下命令说:凡是发现身高7迟五寸的都抓过来审问. 士兵不敢违抗命令,只要把进出符号条件的都抓起来.
连接点:所有的java的县城的人. 切入点:男性,7尺五寸 切入点 advice:抓过来审问 advice是一个动作 aspect:是point cut 和adivce的组合 凡是发现身高7迟五寸的都抓过来审问.
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消 二.事务的 ACID 事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。 1 、原子性 事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 2 、一致性 事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。 3 、隔离性 一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。 4 、持续性 也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
mysql默认隔离级别?可重复读 oracle默认级别?读已提交
1.数据库连接创建,释放频繁造成系统资源浪费,从而影响系统性能,如果使用数据库连接池 可以解决此问题 早sqlmapConfig.xml中配置数据库连接池,使连接池管理连接 2.sql语句在代码中硬编码,造成代码不易维护,实际应用中sql变化可能较大,sql变动需要更换java代码 将sql语句配置在xxxx.mapper.xml文件中与java代码隔离 3.使用preparedStatement向占有符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护 mybatis自动将java对象映射至sql语句,通过statment中的parmanterType定义输入参数的来写 4.对结果集解解析存在硬编码,sql编号导致解析代码编号,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便 mybatis自动将sql执行结果映射至java对象,通过statment中resultType定义输出结果的类型 #{}和${}: #{}表示一个占位符号,通过#{}可以实现priparedstatement向占位符中设置值, 自动进行ajva类型和jdbc类型转换,#{}可以有效的防止sql 注入.#{}可以接收简单类型或pojo属性值,如果parameterType传输单个简单类型值,#{}括号中可以是value或其他名称.如果是pojo,那么应该跟属性值对应上
KaTeX parse error: Expected 'EOF', got '#' at position 14: {}表示拼接sql串,通过#?{}可以将parameterT…{}可以接收简单类型值或pojo属性值,如果paramaterTy pe传输单个简单类型值,${}括号中只能用value.
mapper动态代理开发方法: mapper开发规范: 1.mapper.xml文件中的 namespace与mapper接口的类路径相同 2.mapper接口方法名和mapper.xml中定义的每个statement的id相同 3.mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parmetertype的类型相同 4.mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resuttype的类型相同
1.用户发送请求至前端控制器DispathcerServlet 2.DispathcerServlet收到请求调用HandlerMappring处理器映射器 3.处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器一并返回给DispathcerServlet 4.DispathcerServlet通过HadnlerAdapter处理器适配器调用处理器 5.执行处理器(controller,也叫后端控制器) 6.Controller执行完成后返回ModelAndView 7.HadnlerAdapter将contriller执行结果ModelAndView返回给DispathcerServlet 8.DispathcerServlet将ModelAndView传给ViewReslover视图解析器 9.ViewReslover解析后返回具体的View 10.DispathcerServlet对View进行渲染视图 11.DispathcerServlet响应用户
|