面向对象和面向切面两种编程方式的比较
面向方面编程(AOP)通过提供关于程序结构的另一种思考方式来补充面向对象编程(OOP)。OOP中模块化的关键单元是类,而在AOP中,模块化的单元是方面。方面可以实现关注的模块化,例如跨越多种类型和对象的事务管理。(这种担忧在AOP文献中常常被称为横切关注点。)
AOP的介绍
1.基本的介绍
AOP框架是Spring的关键组件之一。虽然Spring IoC容器不依赖AOP,也就是说如果你不想使用AOP那么就不用AOP,AOP可以为Spring IoC提供功能非常强大的中间件解决方案。
Spring 2.0+ AOP
Spring 2.0引入了一种使用基于模式的方法或@AspectJ注释样式编写自定义方面的更简单,更强大的方法。这两种风格都提供完全类型化的建议和AspectJ切入点语言的使用,同时仍然使用Spring AOP进行编织。
本章将讨论基于Spring 2.0+模式和@AspectJ的AOP支持。下一章将讨论较低级别的AOP支持,如Spring 1.2应用程序中常见的那样。
AOP在Spring框架中用于……
- …提供声明式企业服务,特别是作为EJB声明式服务的替代品。最重要的这种服务是 声明式事务管理。
- …允许用户实现自定义方面,补充他们与AOP一起使用OOP。
2.AOP概念
3.Spring框架的核心
Spring框架的核心原则之一是非侵入性 ; 这是因为您不应该被迫在您的业务/域模型中引入特定于框架的类和接口。但是,在某些地方,Spring Framework确实为您提供了将Spring Framework特定的依赖项引入代码库的选项:为您提供此类选项的基本原理是因为在某些情况下,它可能更容易阅读或编写某些特定的部分功能以这种方式。Spring Framework(几乎)总是为您提供选择:您可以自由决定哪种选项最适合您的特定用例或场景。
与本章相关的一个选择是选择哪种AOP框架(以及哪种AOP样式)。您可以选择AspectJ和/或Spring AOP,并且您还可以选择@AspectJ批注样式方法或Spring XML配置样式方法。本章选择首先引入@AspectJ风格方法的事实不应视为Spring团队赞成Spring XML配置风格的@AspectJ注释风格方法。
4.AOP代理
Spring AOP默认使用AOP代理的标准JDK 动态代理。这使得任何接口(或接口集)都可以被代理。
Spring AOP也可以使用CGLIB代理。这是代理类而不是接口所必需的。如果业务对象不实现接口,则缺省使用CGLIB。因为优良的做法是编程接口而不是类; 业务类通常会实现一个或多个业务接口。在需要通知未在接口中声明的方法的情况下,或者需要将代理对象作为具体类型传递给方法的情况下(希望很少),可以 强制使用CGLIB。
掌握Spring AOP是基于代理的事实是很重要的。请参阅 了解AOP代理以彻底检查此实现细节的实际含义。
二、@AspectJ支持
5.2。@AspectJ支持
@AspectJ引用了一种将方面声明为常规Java类的注释类型。AspectJ项目引入了@AspectJ风格, 作为AspectJ 5版本的一部分。Spring使用AspectJ提供的用于切入点解析和匹配的库来解释与AspectJ 5相同的注释。AOP运行时仍然是纯粹的Spring AOP,并且不依赖于AspectJ编译器或编织器。
1.启用@AspectJ支持
要在Spring配置需要启用配置基于@AspectJ
方面的Spring AOP和Spring支持使用@AspectJ切面,自动代理基于它们是否被那些方面建议豆。通过autoproxying我们的意思是,如果Spring确定一个或多个方面的bean被建议,它会自动生成该bean的代理来拦截方法调用并确保根据需要执行通知。
可以使用XML或Java风格配置启用@AspectJ支持。无论哪种情况,您还需要确保AspectJ的aspectjweaver.jar库位于应用程序的类路径中(版本1.8或更高版本)。该库可在’lib’AspectJ发行版的 目录中或通过Maven Central存储库获得。
2.启用@AspectJ支持
要使用Java启用@AspectJ支持,请@Configuration添加@EnableAspectJAutoProxy 注释:
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
}
使用XML配置启用@AspectJ支持
要使用基于XML的配置启用@AspectJ支持,请使用以下aop:aspectj-autoproxy 元素:
<aop:aspectj-autoproxy/>
3.Declaring(宣布) an aspect(切面)
启用@AspectJ支持后,任何在应用程序上下文中定义的,具有@AspectJ方面(具有@Aspect注解)的类的bean 都将被Spring自动检测并用于配置Spring AOP。以下示例显示了一个不太有用的方面所需的最小定义:
应用程序上下文中的常规bean定义,指向具有@Aspect注释的bean类:
<bean id="myAspect" class="org.xyz.NotVeryUsefulAspect">
<!-- configure properties of aspect here as normal -->
</bean>
而NotVeryUsefulAspect类的定义,与注解 org.aspectj.lang.annotation.Aspect注释;
package org.xyz;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class NotVeryUsefulAspect {
}
方面(带有注释的类@Aspect)可能具有与任何其他类一样的方法和字段。它们也可能包含切入点,建议和介绍(类型间)声明。
通过组件扫描自动检测方面
您可以在Spring XML配置中将方面类注册为常规bean,或者通过类路径扫描自动检测它们 - 就像任何其他Spring管理的bean一样。但是,请注意,@Aspect注解是不足够的classpath中自动检测:为了这个目的,你需要添加一个单独的@Component注释(或可选择地有资格,按照Spring的组件扫描仪的规则自定义构造型注解)。
与其他方面的方面建议?
在Spring AOP,它是不是可以有自己的方面从其他方面意见的目标。类上的@Aspect注释将其标记为方面,因此将其从自动代理中排除。
4.Declaring a pointcut(切入点)
回想一下,切入点确定了感兴趣的连接点,从而使我们能够控制建议何时执行。Spring AOP仅支持Spring bean的方法执行连接点,因此您可以将切入点视为匹配Spring Bean上方法的执行。切入点声明包含两部分:包含名称和任何参数的签名以及确切地确定我们感兴趣的方法执行的切入点表达式。在AOP的@AspectJ注释样式中,切入点签名由常规方法提供定义,并且使用@Pointcut注释来指示切入点表达式(用作切入点签名的方法 必须具有void返回类型)。
一个例子将帮助区分切入点签名和切入点表达式之间的区别。以下示例定义了一个名为的切入点’anyOldTransfer’,它将匹配任何名为的方法的执行’transfer’:
@Pointcut("execution(* transfer(..))")// the pointcut expression
private void anyOldTransfer() {}// the pointcut signature
……
三、Spring AOP还是完整的AspectJ?
使用最简单的方法。Spring AOP比使用完整的AspectJ更简单,因为不需要将AspectJ编译器/编织器引入到开发和构建过程中。如果您只需要建议Spring bean执行操作,那么Spring AOP就是正确的选择。如果您需要建议不是由Spring容器管理的对象(通常是域对象),那么您将需要使用AspectJ。如果您希望建议除简单方法执行之外的连接点(例如,字段获取或设置连接点等),则还需要使用AspectJ。
使用AspectJ时,您可以选择AspectJ语言语法(也称为“代码样式”)或@AspectJ注释样式。很显然,如果你不使用Java 5+,那么你已经选择了…使用代码风格。如果方面在您的设计中扮演重要角色,并且您可以使用针对Eclipse 的AspectJ开发工具(AJDT)插件,那么AspectJ语言语法是首选选项:它更干净更简单,因为语言是专门为写方面。如果您没有使用Eclipse,或者只有少数几个方面在应用程序中不起主要作用,那么您可能需要考虑使用@AspectJ风格,并在IDE中使用常规的Java编译,并添加一个方面编织阶段到您的构建脚本。
这个面向切面编程讲的较为抽象!
具体的下一次咱们在研究下!