1.Spring IOC
IOC(Inversion of Control):控制反转,IOC是一种面向对象的设计思想,可以减低代码间的耦合度,其中最常见的方式叫做依赖注入(DI)。IOC意味着将你设计好的对象交给容器控制,而不是传统的在你对象内部控制
控制反转三个问题: 1.谁控制谁
2.控制了什么
3.为什么反转了
谁控制谁,控制什么:在传统Java代码中,我们直接在对象内部通过new创建对象,是程序主动去创建对象。而IOC中专门有一个容器来创建这些对象,即由IOC容器来控制对象的创建,主要控制外部资源的获取(不只是对象还包括文件等)
为什么反转了:有反转就有正转,传统应用程序是由我们在对象中主动控制去直接获取依赖对象,这就是正转。反转是由容器来帮忙创建并注入依赖对象,因为容器帮我们创建并注入依赖对象,对象只是被动接受依赖对象,所以是反转,依赖对象的获取被反转了
2.Spring DI
DI(Dependency Injection):依赖注入,在容器运行的时候,扫描所有的依赖关系,并为之动态的注入对应的依赖关系。依赖注入的目的并不是为软件系统带来更多的功能,而是为了提高组件重用的频率
依赖注入三个问题: 1.谁依赖谁
2.谁注入谁
3.注入了什么
谁依赖谁,谁注入谁:应用程序依赖IOC容器。IOC容器注入应用程序依赖的对象
注入了什么:注入某个对象所需要的资源
总结:
依赖注入是控制反转的一种实现方式,还有一种方式是依赖查找,这两个概念就是一个同一个概念的不同角度描述
3.IOC的优缺点
优点:由IOC容器通过配置文件来管理对象的生命周期、依赖关系等,这样就不需要重新修改并编译具体的代码,从而实现组件之间的解耦,提高程序的灵活性和可维护性
缺点:创建对象的步骤变得复杂了,不直观
使用反射来创建对象,在效率上会有损耗
缺少IDE重构的支持,如果修改了类名,需要手动修改XML文件
4.什么是IOC容器?
IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象中的依赖
5.AOP的思想
AOP将应用系统分为两部分,一部分是核心业务逻辑,一部分是横向的通用逻辑,Spring通过反射机制调用目标类的代码,动态的将横切逻辑和业务逻辑交织在一起
6.Spring是如何管理事务的
1).Spring为事务管理提供了一致的编码模板,在高层次简历了统一的事务抽象,不管选择Spring JDBC、hibernate、JPA还是选择MyBatis,Spring都可以让用户用统一的编程模型进行事务管理,通过TransactionTemplate并配合使用事务回调TransactionCallback指定具体的持久化操作,就可以通过编程方式实现事务管理,而不需要关注资源的获取、复用、释放、事务同步和异常处理等操作
2).在Spring事务管理的抽象层主要包括3个接口:TransactionDefinition用于描述事务的隔离级别、超时时间、是否为只读事务和事务传播规则等控制事务具体行为的事务属性,TransactionStatus代表一个事务的具体运行状态,事务管理器可以通过该接口获取事务运行期的状态信息,PlatformTransactionManager事务管理器根据TransactionDefinition提供的事务属性配置信息创建事务,并用TransactionStatus描述这个激活事务的状态
3).Spring的声明式事务管理是通过Spring AOP实现的,通过事务的声明性信息,Spring负责将事务管理增强逻辑动态织入业务方法的相应连接点中,这些逻辑包括获取线程绑定资源、开始事务、提交/回滚事务、进行异常转换和处理等工作,Spring在基于Schema的配置中添加了一个tx命名空间,在配置文件中以明确结构化的方式定义事务属性,配合AOP命名空间所提供的切面定义,业务类方法事务配置得到了极大的简化
7.说一下Spring事务机制
Spring有两种事务处理机制,一种是声明式事务,一种是编程式事务
Spring的声明式事务管理在底层是建立在AOP的基础上的,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务,声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需要在配置文件中做相关的事务规则声明(或通过等价的基于标注的方式),便可以将事务规则应用到业务逻辑中,Spring强大的声明式事务管理功能,这主要得益于Spring依赖注入容器和Spring AOP的支持,依赖注入容器为声明式事务提供了基础设施,使得Bean对于Spring框架而言是可管理的,而Spring AOP则是声明式事务管理的直接实现者,和编程式事务相比,声明式事务唯一不足的地方是,后者的最细粒度只能作用到方法级别,无法做到编程式事务那样可以作用到代码块级别
8.Spring如何配置事务
1).使用XML配置声明式事务
2).使用注解配置声明式事务
9.Mybatis中#{ }和${ }的区别
#{}可以防止SQL注入,使用#{}的SQL语句会先经过预编译,经过与编译后,会=动态解析成一个参数标记符?,而${}在解析时,会直接传入值
简单来说就是#{}是先编译好SQL语句再取值,${}是先取值再编译SQL语句