论文部分内容阅读
摘要:面向方面编程(AOP)是面向对象编程(OOP)的一种扩展技术,能够很好的解决横切关注点问题,使得大型软件的设计和实现都能保持功能分离,解除代码耦合。采用AOP技术设计的软件,功能划分清晰,代码保持独立,系统维护简单。Spring AOP是AOP技术的一种实现技术。
关键词:Spring;AOP;Java;框架
中图分类号:TP312文献标识码:A文章编号:1009-3044(2007)03-10753-01
1 引言
AOP(Aspected Oriented Programming)是一种新兴的编程技术,它可以解决OOP和过程化方法不能很好解决的横切(cross-cutting)关注点问题,如:事务、安全、日志等。AOP既可以用于分析设计阶段,也可以用于编码实现阶段,真正实现功能模块的分离,避免代码缠绕。Spring是基于J2EE的轻量级开源开发框架,其中Spring AOP是整个Spring框架的核心组件。
2 Spring AOP 介绍
OOP将应用程序分解成各个层次的对象,而AOP将横切程序的各种关注点分离出来,简化了大型软件的设计 。方面(Aspect)是用Spring的 Advisor或拦截器实现的。Spring IoC容器(BeanFactory 和ApplicationContext)并不强制依赖于AOP,如果不需要,可以不用AOP。但使用AOP,可以提供更强的模块性、可扩展性。
Spring AOP是由纯Java开发的,它实现了AOP联盟的接口。不同于AspectJ的实现,Spring AOP 只实现了方法级别的连接点,已经足够满足J2EE应用。OOP倡导的是基于setter/getter 的方法访问,而非直接访问域。为了使控制反转(IoC)很方便的使用企业级服务,则需要Spring AOP 的实现。Spring AOP 在运行时才创建Advice 对象。
3 Spring AOP 面向方面编程
3.1 创建Advice
AOP 通知包含了方面的逻辑。创建一个Advice 对象,就是在编写实现横切的功能。连接点是用方法拦截器实现的,这意味着你编写的通知将在方法调用的不同点织入程序中。由于在调用一个方法时有几个不同的时间点,Spring 可以在不同的时间点将方面织入程序。Spring AOP提供了四种Advice接口:MethodBeforeAdvice 用于在目标方法调用前触发;AfterReturningAdvice 用于在目标方法调用后触发;ThrowsAdvice 用于在目标方法抛出异常时触发;MethodInterceptor 用于在目标方法执行时触发。如果要实现相应功能,则需要实现上述对应的接口。例如:实现Before Advice,需要实现方法 void before(Method method, Object[] args, Object target)。
3.2 在 Spring 中定义 Pointcut
切入点可以决定特定的类、特定的方法是否匹配特定的标准。如果匹配成功,则通知将应用到此方法上。Spring 切入点用很灵活的方式将通知组织进类中。Spring 中的切入点框架的核心是Pointcut接口,此接口允许定义织入通知中的类和方法。许多方面是通过一系列的通知和切入点组合来定义的。
在Spring中,一個advisor就是一个方面的完整的模块化表示。Spring提供了PointcutAdvisor接口,把通知和切入点组合成一个对象,可以方便的在一个地方管理切入点和通知。切入点分为两类:静态和动态。静态切入点的性能要优于动态切入点,所以应优先考虑使用。对Spring内建的静态切入点类:StaticMethodMatherPointcut,只需要关心setMappedName和setMappedNames方法。可以使用具体的类名,也可以使用通配符。如:设置mappedName属性为set* ,则匹配所有以set为前缀的方法。Spring还提供了静态类:RegexpMethodPointcut,通过使用正则表达式来定义你感兴趣的方法。
当切入点需要运行时参数来执行通知时,需要使用动态切入点。Spring内建的动态切入点类是ControlFlowPointcut,此切入点匹配基于当前线程的调用堆栈,在当前线程执行时找到特定的类和特定的方法时才返回true。大多数的切入点可以静态确定,使用动态切入点有很大的性能损耗。为了增加切入点的可重用性,Spring 提供了切入点上的集合操作——交集和合并。
3.3 用ProxyFactoryBean创建AOP代理
如果定义一个名字为myfactory的ProxyFactoryBean,引用myfactory的对象所看到的不是ProxyFactoryBean实例本身,而是由实现ProxyFactoryBean的类的 getObject()方法所创建的对象。这个方法将创建一个包装了目标对象 的AOP代理(Spring倡导基于接口编程)。使用ProxyFactoryBean或者其他IoC可知的类来创建AOP代理的最重要的优点之一,是IoC可以管理通知和切入点。这是一个非常的强大的功能,能够实现其他AOP框架很难实现的特定的方法。例如,一个通知本身可以引用应用对象(除了目标对象, 它在任何AOP框架中都可以引用应用对象),这完全得益于依赖注入所提供的可插入性。通常,不需要ProxyFactoryBean的全部功能,因为我们常常只对一个方面感兴趣: 例如,事务管理。仅当对一个特定的方面感兴趣时,可以工厂来创建AOP代理,如:TransactionProxyFactoryBean。
3.4 自动代理
只有很少类需要被通知时,ProxyFactoryBean 可以很好的工作。当有许多类需要通知时,显式地创建每个代理就显得很繁琐,Spring提供了自动通过容器来创建代理的功能。Spring提供了两个类实现自动代理:BeanNameAutoProxyCreator和DefaultAdvisorAutoProxyCreator。
BeanNameAutoProxyCreator为匹配名字的Bean产生代理,它可以使用在将一个或者多个方面应用在命名相似的Bean中。自动代理框架判定代理将要暴露什么接口,如果目标Bean没有实现任何接口,就会动态产生一个子类。而更强大的自动代理是:DefaultAdvisorAutoProxyCreator,你所需要做的是在BeanFactory中包含它的配置。Bean定义被加载到Spring容器中后,DefaultAdvisorAutoProxyCreator将搜索上下文中的Advisor,最后它将Advisor应用到匹配Advisor切入点的Bean中。这个代理只对Advisor起作用,它需要通过Advisor来得到需要通知的Bean。
元数据自动代理(MetaData AutoProxy)的配置,依赖于源代码属性而不是外部XML配置文件。这可以非常方便的使源代码和AOP元数据组织在同一个地方。元数据自动代理最常用的地方是用来声明事务。Spring提供了通过AOP框架来声明事务,这与EJB使用声明式事务的功能是相同的。
4 结束语
AOP使得大型、复杂软件的分析设计和实现变得简单,保持功能和代码分离。AOP不会取代OOP,而是OOP的扩展。AOP技术并不复杂,经过短时间的学习就可以掌握。AOP技术已经引入C、C++、Java、C#等许多语言中。Spring 因为引入AOP,比EJB简单、可靠、高效,不依赖于容器,更容易集成、测试和移植。
参考文献:
[1] Rod Johnson. Professional Java Development with the Spring Framework [M],Wiley Publishing,2005.
[2] Craig Walls. Spring in action[M], Manning Publications,2005.
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词:Spring;AOP;Java;框架
中图分类号:TP312文献标识码:A文章编号:1009-3044(2007)03-10753-01
1 引言
AOP(Aspected Oriented Programming)是一种新兴的编程技术,它可以解决OOP和过程化方法不能很好解决的横切(cross-cutting)关注点问题,如:事务、安全、日志等。AOP既可以用于分析设计阶段,也可以用于编码实现阶段,真正实现功能模块的分离,避免代码缠绕。Spring是基于J2EE的轻量级开源开发框架,其中Spring AOP是整个Spring框架的核心组件。
2 Spring AOP 介绍
OOP将应用程序分解成各个层次的对象,而AOP将横切程序的各种关注点分离出来,简化了大型软件的设计 。方面(Aspect)是用Spring的 Advisor或拦截器实现的。Spring IoC容器(BeanFactory 和ApplicationContext)并不强制依赖于AOP,如果不需要,可以不用AOP。但使用AOP,可以提供更强的模块性、可扩展性。
Spring AOP是由纯Java开发的,它实现了AOP联盟的接口。不同于AspectJ的实现,Spring AOP 只实现了方法级别的连接点,已经足够满足J2EE应用。OOP倡导的是基于setter/getter 的方法访问,而非直接访问域。为了使控制反转(IoC)很方便的使用企业级服务,则需要Spring AOP 的实现。Spring AOP 在运行时才创建Advice 对象。
3 Spring AOP 面向方面编程
3.1 创建Advice
AOP 通知包含了方面的逻辑。创建一个Advice 对象,就是在编写实现横切的功能。连接点是用方法拦截器实现的,这意味着你编写的通知将在方法调用的不同点织入程序中。由于在调用一个方法时有几个不同的时间点,Spring 可以在不同的时间点将方面织入程序。Spring AOP提供了四种Advice接口:MethodBeforeAdvice 用于在目标方法调用前触发;AfterReturningAdvice 用于在目标方法调用后触发;ThrowsAdvice 用于在目标方法抛出异常时触发;MethodInterceptor 用于在目标方法执行时触发。如果要实现相应功能,则需要实现上述对应的接口。例如:实现Before Advice,需要实现方法 void before(Method method, Object[] args, Object target)。
3.2 在 Spring 中定义 Pointcut
切入点可以决定特定的类、特定的方法是否匹配特定的标准。如果匹配成功,则通知将应用到此方法上。Spring 切入点用很灵活的方式将通知组织进类中。Spring 中的切入点框架的核心是Pointcut接口,此接口允许定义织入通知中的类和方法。许多方面是通过一系列的通知和切入点组合来定义的。
在Spring中,一個advisor就是一个方面的完整的模块化表示。Spring提供了PointcutAdvisor接口,把通知和切入点组合成一个对象,可以方便的在一个地方管理切入点和通知。切入点分为两类:静态和动态。静态切入点的性能要优于动态切入点,所以应优先考虑使用。对Spring内建的静态切入点类:StaticMethodMatherPointcut,只需要关心setMappedName和setMappedNames方法。可以使用具体的类名,也可以使用通配符。如:设置mappedName属性为set* ,则匹配所有以set为前缀的方法。Spring还提供了静态类:RegexpMethodPointcut,通过使用正则表达式来定义你感兴趣的方法。
当切入点需要运行时参数来执行通知时,需要使用动态切入点。Spring内建的动态切入点类是ControlFlowPointcut,此切入点匹配基于当前线程的调用堆栈,在当前线程执行时找到特定的类和特定的方法时才返回true。大多数的切入点可以静态确定,使用动态切入点有很大的性能损耗。为了增加切入点的可重用性,Spring 提供了切入点上的集合操作——交集和合并。
3.3 用ProxyFactoryBean创建AOP代理
如果定义一个名字为myfactory的ProxyFactoryBean,引用myfactory的对象所看到的不是ProxyFactoryBean实例本身,而是由实现ProxyFactoryBean的类的 getObject()方法所创建的对象。这个方法将创建一个包装了目标对象 的AOP代理(Spring倡导基于接口编程)。使用ProxyFactoryBean或者其他IoC可知的类来创建AOP代理的最重要的优点之一,是IoC可以管理通知和切入点。这是一个非常的强大的功能,能够实现其他AOP框架很难实现的特定的方法。例如,一个通知本身可以引用应用对象(除了目标对象, 它在任何AOP框架中都可以引用应用对象),这完全得益于依赖注入所提供的可插入性。通常,不需要ProxyFactoryBean的全部功能,因为我们常常只对一个方面感兴趣: 例如,事务管理。仅当对一个特定的方面感兴趣时,可以工厂来创建AOP代理,如:TransactionProxyFactoryBean。
3.4 自动代理
只有很少类需要被通知时,ProxyFactoryBean 可以很好的工作。当有许多类需要通知时,显式地创建每个代理就显得很繁琐,Spring提供了自动通过容器来创建代理的功能。Spring提供了两个类实现自动代理:BeanNameAutoProxyCreator和DefaultAdvisorAutoProxyCreator。
BeanNameAutoProxyCreator为匹配名字的Bean产生代理,它可以使用在将一个或者多个方面应用在命名相似的Bean中。自动代理框架判定代理将要暴露什么接口,如果目标Bean没有实现任何接口,就会动态产生一个子类。而更强大的自动代理是:DefaultAdvisorAutoProxyCreator,你所需要做的是在BeanFactory中包含它的配置。Bean定义被加载到Spring容器中后,DefaultAdvisorAutoProxyCreator将搜索上下文中的Advisor,最后它将Advisor应用到匹配Advisor切入点的Bean中。这个代理只对Advisor起作用,它需要通过Advisor来得到需要通知的Bean。
元数据自动代理(MetaData AutoProxy)的配置,依赖于源代码属性而不是外部XML配置文件。这可以非常方便的使源代码和AOP元数据组织在同一个地方。元数据自动代理最常用的地方是用来声明事务。Spring提供了通过AOP框架来声明事务,这与EJB使用声明式事务的功能是相同的。
4 结束语
AOP使得大型、复杂软件的分析设计和实现变得简单,保持功能和代码分离。AOP不会取代OOP,而是OOP的扩展。AOP技术并不复杂,经过短时间的学习就可以掌握。AOP技术已经引入C、C++、Java、C#等许多语言中。Spring 因为引入AOP,比EJB简单、可靠、高效,不依赖于容器,更容易集成、测试和移植。
参考文献:
[1] Rod Johnson. Professional Java Development with the Spring Framework [M],Wiley Publishing,2005.
[2] Craig Walls. Spring in action[M], Manning Publications,2005.
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。