spring总结
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring总结相关的知识,希望对你有一定的参考价值。
★IoC:Spring通过控制反转技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。可以认为IoC与JNDI相反——不是我们自己控制对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它,这就是DI——依赖注入。
依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。
基本上就是对象不用自己动手管理和创建。完全由容器管理,我们只管用就行。
首先想说说IoC(Inversion of Control,控制倒转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好、qq号、电话号、ip号、iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类藕合起来。
那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。如果你还不明白的话,我决定放弃。
0
在spring 中就是应用前两种;但又不仅仅是初始化实例,而且是运用接口的概念去实现这种注入依赖。静态地看,只是依赖一个接口,但实际运行起来,是依赖一个实现了该 接口的具体类。
IOC就是面向接口编程的应用?
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就是通过反射来实现注入的。关于反射的相关资料请查阅java doc。
理解了IoC和DI的概念后,一切都将变得简单明了,剩下的工作只是在spring的框架中堆积木而已。
============================================
IOC概念
ioc是控制反转。从字面意义上理解,控制反转就是反过来控制。以前我们需要一个对象,都需要自己去new出来这个对象,控制反转之后,也就是说我们不需要主动自己去new这个对象,我们只要直接去接受这个对象就行了,换句话说这个对象被注入进来了,这就是DI的概念。
IOC原理
IOC的最大作用就是bean管理和解耦。到底是如何进行解耦的呢?下面我用数学中的有向图进行说明。我们可以把Spring管理的每一个Bean当做一个节点(假设有N个Bean,那么就有N个节点),于是这些Bean加上相互之间表示调用关系的有向边就组成了一个有向图。毫无疑问,有向图的边越多那么平均来说每个顶点之间的耦合度就越大,最大的情况为完全有向图,即任何两个节点之间都有两条有向边,此时每个顶点的度为2(N-1),也就是说每个Bean与其他的N-1个Bean有耦合,而且还是双向耦合。如下图所示:
在编程的时候,我们都是本着高内聚、低耦合的编程方式,但是我们知道,要想达到完全的没有耦合是不可能的。所以能做的就是尽最大可能的保证松耦合。如何能减少类与类直接的耦合呢?一般我们都是用接口来实现。通过让类与类之间,依赖于接口,而不依赖于类,来达到松耦合的目的。但是无论耦合多么“松散”,具体的实现类还是需要new出来的,于是就得考虑这个new的过程应该放在哪里才是最合适的。如果在每个Bean中都去new这个Bean需要的其他Bean,那么耦合的程度又回到了上图的情况,那是没有意义的。所以我们就需要找一个中间人,在中间人那里实现new的过程,然后把new好的实例传递给需要这个实例的对象,这样的话一切问题就迎刃而解了。因此spring ioc容器就借助这个原理实现了bean管理和松耦合的功能。如下图所示:
上图也就是Spring的数学描述,图中很清晰的表明了在使用Spring之后,任意两个节点(Bean)之间的有向线段变成了0(确切的说不完全是0,因为任意两个节点之间还是可以通过容器连接的),唯一和这些Bean有关系的是容器(无论谁需要什么东西都去找容器,尽量避免两个Bean之间直接打交道)也正因为如此Spring才达到了解耦的目的。
======================================================================
★AOP:Spring提供了面向切面的编程支持,AOP将与程序业务无关的内容分离提取,应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责其它的系统级关注点,例如日志或事务支持。
AOP将与业务无关的逻辑横切进真正的逻辑中。
面向切面编程(简称AOP )的目标:
1.把横切关注点从业务逻辑中分离,独立模块化
2.在不改变现有代码的前提下,动态的添加功能
★借助Spring,依赖注入,AOP应用,面向接口编程,来降低业务组件之间的耦合度,增强系统的扩展性。
★ 让已有的技术和框架更加易用。
★利用其对hibernate的SessionFactory、事务管理的封装,更简洁的应用hibernate。
★Spring并不完全依赖于Spring,开发者可自由选用Spring框架的部分或全部
★利用AOP思想,集中处理业务逻辑,减少重复代码,构建优雅的解决方案。
★低侵入式设计,代码污染极低。
spring在项目中可以带来下面的好处进行了总结。
?? 1)降低组件之间的耦合度,实现软件各层之间的解耦。
????? Controller——>Service——>DAO
? 2)可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务.也不需处理复杂的事务传播。
3)容器提供单例模式支持,开发人员不再需要自己编写实现代码。
4)容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
5)容器提供的众多辅作类,使用这些类能够加快应用的开发,如: JdbcTemplate、 HibernateTemplate。
6)Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,这样更便于应用的开发。
?7)? 使用spring容器可以提供的服务:事务管理服务,JMS服务,Spring Core核心服务,持久化服务等。
8)如果使用Spring, 我们就不再需要手工控制事务,例如在Hibernate中控制事务的语句 session.beginTransaction(); session.getTransaction().commit();
以上是关于spring总结的主要内容,如果未能解决你的问题,请参考以下文章