1.1 Spring框架简介

1.1Spring框架

Spring框架是Java应用最广的框架。它的成功来源于理念,而不是技术本身。它的理念包括IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程).

1.1.1 Spring IoC简介
Ioc是一个容器,在Spring中,他会认为一切Java资源都是Java Bean,容器的目标就是管理这些Bean和他们之间的关系。所以在Spring IoC里面装载的是各种Bean,也可以理解为各种Java资源,包括Java Bean的创建、事件、行为等,他们有IoC容器管理。除此之外,各个Java Bean之间会存在一定的依赖关系,比如班级是依赖于老师和学生组成的,假设老师、学生都是Java Bean,那么显然二者之间形成了依赖关系,老师和学生有教育和被教育的关系。这些Spring IoC容器都能对其进行管理。只是Spring IoC管理对象和其依赖关系,才用的不是认为的主动创建,而是由Spring IoC自己通过描述创建的,也就是说 Spring是依靠描述来完成对象的创建以及其依赖关系。
比如插座,它依赖国家标准(这个标准可以定义一个接口,Socket)去定义,现有两种插座(Socket1,Socket2),如图:

在这里插入图片描述
有两种插座可以供选择,具体使用那种呢?我们可以通过代码实现使用插座1(Socket1),如下

Socket socket=new Socket1();//多态的用法
user.setSocket(socket);
user.useSocket();

使用Socket socket=new Scoket1();后,国家标准插座接口(Socket)就和插座1(Socket1)捆绑在一起了。这样就会有一个弊端:如果要使用其他的插座,就需要修改代码了。这种情况下Socket接口和其实现类Socket1耦合了,如果有一天不在使用Socket1,而是要使用Socket1,那么就需要把代码修改为如下:

Socket socket=new Socket2();//多态的用法
user.setSocket(socket);
user.useSocket();

如果有其他更好的插座,岂不是还要修改源码?一个大型互联网项目对象成千上万,如果要不断修改,那么对系统的可靠性将是极大的挑战,Spring IoC可以解决这个问题。
首先,我们不用new 的方式创建对象,而是使用配置的方式,然后让Spring IoC容器自己通过配置去找到插座。先用一段XML描述插座和用户的引用插座1,如下

<bean id="socket" class="Socket1"/>
<bean id="user" class="xxx.User">
	<property name="socket" ref="socket"/>
</bean>

注意了,这些不是Java代码,而是XML配置文件,换句话说只要把配置切换为:

<bean id="socket" class="Socket2"/>
<bean id="user" class="xxx.User">
	<property name="socket" ref="socket"/>
</bean>

就可以网用户信息中注入插座2,切换插座的实现类十分方便。这个时候Socket接口就可以不依赖任何插座,而通过配置进行切换,如图:
在这里插入图片描述

配置信息是”我要插座2",相当于XML依赖关系配置,这时候Spring IoC只会拿到插座2,然后通过国家标准插座接口注入给使用者,提供给使用者使用。换句话说,这是一种被动的行为,而需要的资源(Bean)通过描述信息就可以得到,其中的控制权在Spring IoC容器中,他会根据描述找到使用者需要的资源,这就是控制反转的含义。
这样的好处就是Socket接口不在依赖于某个实现类,需要使用某个实现类时候我们通过配置信息就可以完成了。这样想修改或者加入其他资源就可以通过配置完成,这样就不需要使用new来进行对象的创建,依赖关系也可以通过配置完成,从而完全可以即插即拔地管理他们之间的关系。
你不需要去找资源,只要向Spring IoC容器描述所需资源,Spring IoC自己会找到你所需要的资源,这就是Spring IoC的理念。这样就把Bean之间的依赖关系解耦了,更容易写出结构清晰的程序。除此之外,Spring IoC还提供对Java Bean生命周期的管理,可以延迟加载,可以在其生命周期内定义一些行为等,更加方便有效的使用和管理Java资源,这就是Spring IoC的美丽。

1.1.2 Spring AOP

IoC的目标就是为了管理Bean,而Bean是Java面向对象(OOP)的基础设计,比如声明一个用户类,插座类等都是基于面向对象的概念。
有些情况是面向对象没办法处理的。举个例子,生产部门的订单、生产部门、财务部门三者符合OOP的设计理念。订单发出,生产部门审批通过准备付款,但是财务部门发现订单的价格超支了,需要取消订单。显然超支限定已经不只是影响财务部门了,还会影响生产部门之前所做的审批,需要把他们作废。我们把预算超支这个条件称为切面,它影响了订单、生产部门和财务部门3个OOP对象。在现实中,这样的的切面条件跨越了3个甚至更多的对象,并且影响了他们的协作。所以只用OOP并不完善,还需要面向切面的编程,通过它去管理在切面上的某些对象之间的协作,如图:
在这里插入图片描述
在图中,实现是订单提交的流程,虚线是订单驳回的流程,影响他们的条件是预算超额,这是一个切面条件。
Spring AOP常用于数据库事务的编程,很多情况都如同上面的例子,我们在做完第一步数据库数据更新后,不知道下一步是否会成功,如果下一步失败,会使用数据库事务的回滚功能区回滚事务,使得第一步的数据库更新也作废。在Spring AOP实现的数据库事务管理中,是以异常作为消息的。在默认的情况下(可以通过Spring的配置修改),只要Spring接受到了异常消息,他就会将数据库的事务回滚,从而保证数据的一致性。这样我们就知道在Spring的事务管理中只要让它接收到异常信息,他就会回滚事务,而不需要通过代码来实现这个过程。代码如下:

private void proceed(Order order){
	//判断生产部门是否通过订单,数据库记录订单
	boolean pflag=productionDept.isPass(order);
	if(pflag){//如果生产部门通过进行财务部门审批
		if(finacialDept.isOverBudget(order)){//财务审批是否超限
			//抛出异常回滚事务,之前的订单操作也会被回滚
			throw new RuntimeException("预算超出限制!!!");
		}
		
	}
}

这里我们完全看不到数据库代码,也没有复杂的try…catch…finally…语句。在现实中,Spring AOP的编程也是如此,这些东西都被Spring屏蔽了,不需要关注它,只需要关注业务代码,知道只要发生了异常,Spring会回滚事务就足够了,当然这段话还不算准确,因为事务和业务是十分复杂的,但是Spring已经提供了隔离级别和传播行为去控制他们,只是在入门的章节没有必要讲的如此复杂,后面会剖析他们,有了Spring的这些封装,开发人员就可以减少很多的代码和不必要的麻烦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值