Spring之Aop与Ioc

来源:互联网 发布:淘喵淘宝互刷流量软件 编辑:程序博客网 时间:2024/05/16 08:12

用Spring用了这么久,也该找个时间总结总结,这里我并没有把Aop和Ioc分开讲。

首先概述一下Spring,Spring是一款设计非常好的解耦框架,无侵入性,可以整合其它很多框架,比如常用的Struts,Hibernate,Mybatis或者Ibatis等,由此可以解决企业开发的复杂性,其核心的两个东西,就是AOP和IOC。

Spring包含了7个模块,每个模块可以独立存在

每个模块的作用如下(这里参考的其它博客。原文地址:http://www.ibm.com/developerworks/cn/java/wa-spring1,感谢作者):

  • 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
  • Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
  • Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
  • Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
  • Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
  • Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
  • Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

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吧,时间比较晚了,具体的例子只有抽空再写了





0 0
原创粉丝点击