spring|十年架构师,带你初识SSM框架结构,深入开发Java就在今天( 二 )


<bean id=“scocket”class=\"Socket2\">

就可以往用户信息中注入插座2 , 切换插座的实现类十分方便 。 这个时候Socket接口就可以不依赖任何插座 , 而通过配置进行切换 , 如下图所示 。
上图的配置信息是“我要插座2” , 相当于XML依赖关系配置 , 这个时候Spring IoC只会拿到插座2 , 然后通过国家标准插座接口注入给使用者 , 提供给使用者使用 。 换句话说 , 这是一种被动的行为 , 而需要的资源( Bean)通过描述信息就可以得到 , 其中的控制权在Spring IoC容器中 , 它会根据描述找到使用者需要的资源 , 这就是控制反转的含义 。
这样的好处是Socket接口不再依赖于某个实现类 , 需要使用某个实现类时我们通过配置信息就可以完成了 。 这样想修改或者加入其他资源就可以通过配置完成 , 不需要再用new关键字进行创建对象 , 依赖关系也可以通过配置完成 , 从而完全可以即插即拔地管理它们之间的关系 。
你不需要去找资源 , 只要向Spring loC容器描述所需资源 , Spring IoC自己会找到你所需要的资源 , 这就是Spring IoC的理念 。 这样就把Bean之间的依赖关系解耦了 , 更容易写出结构清晰的程序 。 除此之外 , Spring IoC还提供对Java Bean生命周期的管理 , 可以延迟加载 , 可以在其生命周期内定义一些行为等 , 更加方便有效地使用和管理Java资源 , 这就是Spring IoC的魅力 。
Spring AOP
IoC的目标就是为了管理Bean而Bean是Java面向对象(OOP)的基础设计 , 比如声明一个用户类、插座类等都是基于面向对象的概念 。
有些情况是面向对象没办法处理的 。 举个例子 , 生产部门的订单、生产部门、财务部门三者符合OOP的设计理念 。 订单发出 , 生产部门审批通过准备付款 , 但是财务部门发现订单的价格超支了 , 需要取消订单 。 显然超支限定已经不只是影响财务部门了 , 还会影响生产部门之前所做的审批 , 需要把它们作废 。 我们把预算超支这个条件称为切面 , 它影响了订单、生产部门和财务部门3个OOP对象 。 在现实中 , 这样的切面条件跨越了3个甚至更多的对象 , 并且影响了它们的协作 。 所以只用OOP并不完善 , 还需要面向切面的编程 , 通过它去管理在切面上的某些对象之间的协作 , 如下图所示 。
在上图中 , 实线是订单提交的流程 , 虚线是订单驳回的流程 , 影响它们的条件是预算超额 , 这是一个切面条件 。
Spring AOP常用于数据库事务的编程 , 很多情况都如同上面的例子 , 我们在做完第一步数据库数据更新后 , 不知道下一步是否会成功 , 如果下一步失败 , 会使用数据库事务的回滚功能去回滚事务 , 使得第- 步的数据库更新也作废 。 在Spring AOP实现的数据库事务管理中 , 是以异常作为消息的 。 在默认的情况下(可以通过Spring的配置修改) , 只要Spring接收到了异常信息 , 它就会将数据库的事务回滚 , 从而保证数据的一致性 。这样我们就知道在Spring的事务管理中只要让它接收到异常信息 , 它就会回滚事务 , 而不需要通过代码来实现这个过程 。 比如上面的例子 , 可用一段伪代码来进行一些必要的说明 ,
这里我们完全看不到数据库代码 , 也没有复杂的try...catch...finally...语句 。 在现实中 , Spring AOP的编程也是如此 , 这些东西都被Spring屏蔽了 , 不需要关注它 , 只需关注业务代码 , 知道只要发生了异常 , Spring 会回滚事务就足够了 。 当然这段话还不算准确 , 因为事务和业务是十分复杂的 , 但是Spring已经提供了隔离级别和传播行为去控制它们 , 只是在入门的章节没有必要谈得如此复杂 , 后面会详细剖析它们 , 有了Spring的这些封装 , 开发人员就可以减少很多的代码和不必要的麻烦 。
MyBatis简介MyBatis的前身是Apache的开源项目iBatis 。 iBatis 一词来源于“internet”和“abatis\"的组合 , 是一个基于Java的持久层框架 。 2010年这个项目由Apache software foundation迁移到Google code并更名为MyBatis 。 2013 年11月 , MyBatis 迁移到GitHub上 , 目前由GitHub提供维护 。


推荐阅读