一、概念:
Aspect Oriented Programming(AOP),面向切面编程:
AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。比如我们最常见的就是日志记录了,举个例子,我们现在提供一个服务查询学生信息的,但是我们希望记录有谁进行了这个查询。如果按照传统的OOP的实现的话,那我们实现了一个查询学生信息的服务接口(StudentInfoService)和其实现类(StudentInfoServiceImpl.java), 同时为了要进行记录的话,那我们在实现类(StudentInfoServiceImpl.java)中要 添加其实现记录的过程 。这样的话, 假如我们要实现的服务有多个呢?那就要在每个实现的类都添加这些记录过程。这样做的话就会有点繁琐, 而且每个实现类都与记录服务日志的行为紧耦合,违反了面向对象的规则。那么怎样才能把 记录服务的行为与业务处理过程中分离 出来呢?看起来好像就是查询学生的服务自己在进行,但却是背后日志记录对这些行为进行记录,并且查询学生的服务不知道存在这些记录过程,这就是我们要讨论AOP的目的所在。AOP的编程,好像就是把我们在某个方面的功能提出来与一批对象进行 隔离 ,这样与一批对象之间降低了耦合性,可以就某个功能进行编程。通俗理解:
AOP就是在你编写程序(大部分是已有的)的基础上,添加一个路障一样的东西,当执行到这个路障时就停下,做路障这里的工作,这样的话,一个程序就分为几个不一样的层面。通过减少代码重复模块从而帮助开发人员提高工作效率。定义一套Java语言的扩展系统,使开发者可以方便的进行面向方面的开发,这套扩展系统被称为Aspectj。
通过IoC模式(Inversion of Control,控制反转模式)来实现AOP,通常被称为Spring AOP
AOP对AspectJ的支持:
使用AspectJ注解:
1,启用对AspectJ的支持:
通过在Spring的配置中引入下列元素来启用Spring对AspectJ的支持:
<aop:aspectj-autoproxy />
或者(如果不是使用XSD的话)
<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />
2,声明一个带有@Aspect注解的类,在这个类中声明那些方法需要被'关注'(利用@Pointcut),在那些时机点进行关注(利用@Before,@AfterReturning等等...),执行'切入'的方法
3,在Spring的配置文件中定义这个'切面'类:任意带有一个@Aspect切面(拥有@Aspect注解)的bean都将被Spring自动识别并用于配置在Spring AOP.
4,使用被Spring管理的bean,在执行被'关注'的方法时,'切入'的方法就会被执行.
一个完整的例子参考:http://blog.csdn.net/kkdelta/article/details/5515882