用Spring用了这么久,也该找个时间总结总结,这里我并没有把Aop和Ioc分开讲。
首先概述一下Spring,Spring是一款设计非常好的解耦框架,无侵入性,可以整合其它很多框架,比如常用的Struts,Hibernate,Mybatis或者Ibatis等,由此可以解决企业开发的复杂性,其核心的两个东西,就是AOP和IOC。
Spring包含了7个模块,每个模块可以独立存在
每个模块的作用如下(这里参考的其它博客。原文地址:http://www.ibm.com/developerworks/cn/java/wa-spring1,感谢作者):
BeanFactory
,它是工厂模式的实现。BeanFactory
使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。IOC:
概念:控制反转,因为这个名字晦涩难懂,后来Martine Fowler将其取名为依赖注入(DI),它不是什么技术,只是一种思想
IOC容器:可以实现控制反转功能的容器
原理:为何叫控制反转,因为我们在javaee中要使用某个对象的方法,通常是要new一下这个对象,可以理解为正转,就是普通处理的方式,但是这样就会出现大量依赖的对象,比如A依赖B,A依赖C,出现了大量的耦合,那么控制反转为什么叫反转,因为它把对象交给了Spring容器处理,并非在程序里面声明,把对象交给外部容器处理,内部程序只需调用,其实就是使用了java的反射技术,在程序运行时动态创建,调用对象,在Spring运行时,和其配置文件动态创建,调用对象,也就是Spring容器初始化,装配及管理Bean对象,这些Bean对象再由IOC容器进行控制管理
从图中可以看出控制反转IOC实际包括DL和DI,即依赖查找和依赖注入两种方式,前者是获取依赖关系,后者是注入依赖关系。
关于控制反转IOC,我这里还想罗嗦两句:控制反转这个概念确实不是很好理解,而且这个概念很泛,首先最基本的我要说明的是IOC并不是Spring特有的,在其它框架中也有这个概念,依赖注入在类似框架中只是一种思想,依赖注入实现的方式主要有三种:接口注入,设值注入,构造注入。IOC主要出现过两次较大的争议:一是IOC的概念很模糊抽象,容易让人迷惑,而是作者引入依赖注入代替控制反转后,使用构造注入还是设值注入好,当然作者的观点是可以先使用构造注入,如果出现问题再换成设值注入,个人觉得不如一开始就采用后者(仅个人观点),作者Martine Fowler提出使用XML的方式配置比编码的方式配置好,这也符合OO思想,事实也的确这样。
注入方式(依赖注入)在Spring中的具体实现:
1.接口注入:这种方法由于具有一定的侵入性,而且实际开发中也不常见,暂且不予研究
2.设值注入:
3.构造注入:
(时间比较晚了,先暂时放一放)
AOP:
概念:面向切面编程(Aspect-Oriented Programming的缩写),它也是一种编程的思想,AOP将系统分成了核心业务逻辑和横向的通用逻辑,也就是所谓的方面,这些方面像持久化管理,事务管理,安全管理,日志管理和调试管理等都属于系统通用的逻辑,这样我们通过配置Spring的配置文件就可以重复利用这些通用的逻辑,避免了代码的冗余,配置了该切面的方法后,Spring运行到该方法时会被Spring拦截执行
让我们从定义一些重要的AOP概念开始。
— 方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。
— 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
— 通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。
— 切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点,例如,使用正则表达式。
— 引入(Introduction):添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现IsModified接口,来简化缓存。
— 目标对象(Target Object):包含连接点的对象,也被称作被通知或被代理对象。
— AOP代理(AOP Proxy):AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。
— 编织(Weaving):组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。
原理:AOP的实现主要通过代理来实现的,这里分为两种:(http://my.oschina.net/chape/blog/136453,来自该博文分享,感谢博文作者)
1.静态代理:针对每个具体的类编写代理类;针对一个接口编写一个代理类
2.动态代理:针对一个方面编写一个Invocation Handler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类
动态代理:
不用写代理类,虚拟机根据真实对象实现的接口产生一个类,通过类实例化一个动态代理,在实例化动态代理时将真实对象及装备注入到动态代理中,向客户端公开的是动态代理,当客户端调用动态代理方法时,动态代理根据类的反射得到真实对象的Method,调用装备的invoke方法,将动态代理、 Method、方法参数传与装备的invoke方法,invoke方法在唤起method方法前或后做一些处理。
1、产生动态代理的类:
java.lang.refect.Proxy
2、装备必须实现InvocationHandler接口实现invoke方法
AOP和IOC是Spring中非常重要的两大核心,如果弄清了它们,基本上就弄清了Spring,而且IOC和AOP是互相补充的,以此解决业务上的复杂问题
好了,暂时Ok吧,时间比较晚了,具体的例子只有抽空再写了
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/lsx991947534/article/details/47982227