gigix 说,j2ee的世界象一座魔法森林,数不清的新概念和open source framework,让新进来的同学非常眼晕。gigix还说,AOP正在成为软件开发的下一个圣杯,呵呵,我想起帝国时代中的圣杯了,僧侣们梦想收集到的法器,可以提升精神力量......
在上回学习iBatis的Dao框架时,提到动态代理,恰好Spring framework中也支持AOP,同样是采用jdk1.3的动态代理方式的。不过基于配置的方案更优雅一些。
我走了一遍那个简单的例子,就是基于org.springframework.aop.MethodBeforeAdvice接口来实现拦截器的。现在网上一说AOP,举的例子总是LOG的,晕死。iBatis中的事务包裹也可以算一个典型的用法。
在使用spring的aop时,除了spring.jar外,切记要引入以下几个包:
1. aopalliance.jar
2. commons-logging.jar
3.jakarta-oro-2.0.8.jar 这个比较隐蔽,因为不引这个编译期不报错。
然后要理解三个概念,就可以编写AOP模块。
advice 你想向别的类内部不同的地方注入的代码,即你关注的Aspect;
pointcut 定义了需要注入advice的位置,通常是某个特定的类的一个public方法。
advisor 是pointcut和advice的装配器,需要在配置文件中指明两个属性:advice和pattern,前者是你自己写的请求注入的类,做一些比如加日志,判断是否有权限等的事情,pattern指你需要拦截的接口及其方法。
<!--CONFIG-->
<bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>org.chage.springtest.Bean</value>
</property>
<property name="target">
<ref local="beanTarget"/>
</property>
<property name="interceptorNames">
<list>
<value>theAdvisor</value>
<value>theAdvisor2</value>
</list>
</property>
</bean>
<!--REAL CLASS-->
<bean id="beanTarget" class="org.chage.springtest.BeanImpl"/>
<bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref local="theBeforeAdvice"/>
</property>
<property name="pattern">
<value>org/.chage/.springtest/.Bean/.execute</value>
</property>
</bean>
<!--ADVICE-->
<bean id="theBeforeAdvice" class="org.chage.springtest.TestBeforeAdvice"/>
注意两处蓝色标识处,前一处说明可以给被请求bean加多个拦截器类,这里的次序比较重要,就是实际被调用执行的次序。后一处说明了监听的方法,注意写法。
最后,来点废话。这两天学习的劲头很高,白天吸收了很多东东,晚上躺在床上大脑还在反刍,感觉象一个RPG游戏中的小角色在打怪练级,hoho,经验值嗖嗖地往上涨,满心欢喜呀,充实啊。我渴望成为下一个“马鲁奇”(注:韩国电影”阿罗汉“中称拥有极高天份的修行者突然开悟后为马鲁奇)