spring框架成功来源于概念,它的理念包括ioc (控制反转)和aop(面相切面编程) ioc相当于一个容器,在spring中认为一切资源都是JavaBean,spring ioc管理对象和其依赖关系,采用的不是人为的主动创建,,由spring ioc自己描述创建,也就是说spring是依靠描述来完成对象的创建及其依赖关系。
spring ioc 的实际应用(解决的问题):
以人使用插座为例:
人 国家标准插座接口 插座1 插座2
使用插座1代码:
Socket socket = new Socket1();
user.setSocket(socket);
user.useSocket();
使用插座2代码:
Socket socket = new Socket2();
user.setSocket(socket);
user.useSocket();
问题:项目中Socket 接口和实现类Socket1耦合,如果不在使用socket1,时要修改代码。
解决:springioc解决了这个问题,不用new 的方式创建对象,而是使用xml配置的方式
<bean id="socket" class="socket1"/>
<bean id="user" class="xxx.User">
<Property name= "socket" ref="socket"/>
</bean>
//如果要替换插座2,只需要通过配置切换
<bean id="socket" class="socket2"/>
springAop的思想:在运动时,动态的讲代码切入到类的指定方法,指定位置的编程思想就是面向切面编程。
spring AOP:ioc的目标是管理bean,而Bean是Java面相对象(oop),的基础设计的,有些问题面相对象无法处理,如生:产
产部门的订单,生产部门,财务部门,(三者符合面相对象设计)订单发出,生产部门审批通过,准备付款,但是财务部门发现
订单的价格超支了,需要 取消订单,订单的超支限定已经不仅仅影响财务部门,生产部门之前的审批也要作废,我们把预算超支这个条件称为切面。他影响了订单,生产部门,财务部门,三个OOP对象。在现实生活中,这样的切面条件跨越了3个或者更多的对象,并影响了他们之间的协作。所以只用OOP不完善,还需要面相切面编程,去管理周期切面上的某些对象之间的协作。
切面条件影响流程。
Spring AOP 常用于数据库事物的编程,很多情况下,我们在数据库更新后,不知道下一步是否会成功,如果失败会根据数据库回滚功能回滚事物,第一步数据库更新也作废,Spring AOP 实现事物管理,是以异常作为消息机制,,只要Spring接受到异常信息,就会回滚事物,不需要代码来实现这个过程。保证数据库一致性。
面向对象的特点是继承,封装和多态。分装就是要求将功能分散到不同的对象中,让不同的类设计不同放入方法,这样代码分散到一个的类中去了,这样的好处是降低了代码的复杂程度,使类可以服用。
这样在分散代码的同时,也增加了代码的重复性。如在两个类中,可能需要在每个方法中做日志,按照面向对象的设计方法,两个类中的方法中都要加入日志的内容。也许他们是完全相同的。但是因为面向对象的设计,让类与类之间无法联系。不能讲这些重复的代码统一起来。如果将这段代码写在一个独立的方法里,然后在这两个类中调用,那么独立类之间就有耦合,日类的改变会影响到这两个类。
AOP面向切面编程思想的概念:
把逻辑代码和处理琐碎事物 的代码分离开,以便能过分离复杂度,让人在同一时间只考虑代码逻辑,或者琐碎事物(代码逻辑如:插入一条数据,那么琐碎事务就包括获取连接和关闭连接,食物开始,事物提交)
以下是切面的概念:
一般我们管切入到指定类指定方法的大堆繁琐事物中的的逻辑代码片段称之为切面,而切入到哪些类哪些方法则叫切入点。
@Aspect
@Pointcut
@Before
@Around
@After
然后举个例子:
先假设你有一段逻辑代码要写~ 在这段代码之前要写log;代码完成之后要写log。结局就是一大堆的log代码就淹没了逻辑代码。
aop的想法就是将非逻辑部分的代码抽离出来,只考虑逻辑代码就行了,我把框框画好,这里写前面的log,这里写逻辑,这里写后面的log。
有了aop我们可以把几个类共有的代码,抽取到一个切片中,需要时在切入到对象中去,从而改变其原有的行为。这样一来AOP其实只是OOP的补充而已OOP从横向上区分出一个个类来,而AOP则纵向上向对象中加入特定额代码有了AOP,OOP变得更加立体,AOP基本上是通过动态代理机制实现的。