使用AOP的几种方式
1.经典的基于代理的AOP
2.@AspectJ注解驱动的切面
3.纯POJO切面
4.注入式AspectJ切面
Demo详解
在讲Demo之前,先把项目结构贴一下,我用的的一般的Java Project+Maven进行测试,用Web Project的小区别一会会说到。有一点很重要,jar依赖必须导入正确,我在测试过程中,很多bug都是因为依赖问题引起的,这里也贴一下。
包结构:
pom.xml:
下面开始正式的讲解:
1、经典的基于代理的AOP实现,以一个睡觉的例子实现。
(1)可睡觉的接口,任何可以睡觉的人或机器都可以实现它。
(2)接口实现类,“Me”可以睡觉,“Me”就实现可以睡觉的接口。
( 3)Me关注于睡觉的逻辑,但是睡觉需要其他功能辅助,比如睡前脱衣服,起床脱衣服,这里开始就需要AOP替“Me”完成!解耦!首先需要一个SleepHelper类。因为一个是切入点前执行、一个是切入点之后执行,所以实现对应接口。
(4)最关键的来了,Spring核心配置文件application.xml配置AOP。
其中:
<beans>是Spring的配置标签,beans里面几个重要的属性:
xmlns:
是默认的xml文档解析格式,即spring的beans。地址是http://www.springframework.org/schema/beans;通过设置这个属性,所有在beans里面声明的属性,可以直接通过<>来使用,比如<bean>等等。一个XML文件,只能声明一个默认的语义解析的规范。例如上面的xml中就只有beans一个是默认的,其他的都需要通过特定的标签来使用,比如aop,它自己有很多的属性,如果要使用,前面就必须加上aop:xxx才可以。类似的,如果默认的xmlns配置的是aop相关的语义解析规范,那么在xml中就可以直接写config这种标签了。
xmlns:xsi:
是xml需要遵守的规范,通过URL可以看到,是w3的统一规范,后面通过xsi:schemaLocation来定位所有的解析文件。
xmlns:aop:
这个是重点,是我们这里需要使用到的一些语义规范,与面向切面AOP相关。
xmlns:tx:
Spring中与事务相关的配置内容。
(5)测试类,Test,其中,通过AOP代理的方式执行Me的sleep()方法,会把执行前、执行后的操作执行,实现了AOP的效果!
执行结果:
(6)通过org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator简化配置。
将配置文件中设置代理的代码去掉,加上:
然后,在Test中,直接获取me对象,执行sleep方法,就可以实现同样的功能!
通过自动匹配,切面会自动匹配符合切入点的bean,会被自动代理,实现功能!
2、更简单的方式,通过AspectJ提供的注解实现AOP。
(1)同样的例子,修改后的SleepHelper:
(2)在方法中,可以加上JoinPoint参数以进行相关操作,如:
(3)然后修改配置为:
(4)最后测试,一样的结果!
3、使用Spring来定义纯粹的POJO切面(名字很绕口,其实就是纯粹通过<aop:fonfig>标签配置,也是一种比较简单的方式)。
(1)修改后的SleepHelper类,很正常的类,所以这种方式的优点就是在代码中不体现任何AOP相关配置,纯粹使用xml配置。
(2)配置文件:
(3)配置的另一种写法
学东西还是要深入进去的,推荐一篇网评还不错的博文,http://blog.csdn.net/moreevan/article/details/11977115/