注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

享受编码

    的乐趣

 
 
 

日志

 
 

林信良的《spring2.0技术手册》中ControlFlowPointcut例子不适用  

2011-12-26 16:53:38|  分类: Spring |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
近期内学Spring一些技术,翻看林信良的《spring2.0技术手册》这本书,在看到 4.3.3 ControlFlowPointcut这一章节的时候,发现这个章节的例子是错误的,因为这个例子根本没有体现出ControlFlowPointcut的作用,让初学者很容易一头雾水或者认知错误,并且在搜索ControlFlowPointcut细节时,发现网络转载的很多文章,都是这个例子,所以,在这里记录一下,并给出一个更合适的例子给初学者。

ControlFlowPointcut作用是在B内设置一个Pointcut,当B的方法被定义的A类或者A类中的方法调用时,执行设定的Advice,如果不是,则不织入,正常执行B的方法;

所以我们需要(这里我把通告称之为拦截器,我觉得拦截器更恰当,虽然有的地方他不起到拦截作用,但是好理解)
一个业务接口,利用这个接口执行AOP的设定;
一个实现了业务接口的类,真正的业务类;
一个Advice,拦截时做的动作;
一个Pointcut,什么情况下织入拦截器;
一个Advisor,包括Advice和Pointcut的拦截器;
一个Proxy,代理业务类,设定要代理的接口和要代理的业务类,并且设定Advisor;
一个调用者,调用Proxy的类,当调用Proxy时,拦截器执行,当单独执行Proxy时,拦截器不执行

这样才能完成一个ControlFlowPointcut的动作;
接下来看代码:

public interface IHello {
public void hello(String name);
}

public class HelloSpeaker implements IHello {

@Override
public void hello(String name) {
System.out.println("Hello " + name);
}

}

import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;

public class LogBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method arg0, Object[] arg1, Object arg2)
throws Throwable {
System.out.println(arg0 + " 织入拦截器, start...");
}

}

public class PointcutSpeaker {

private IHello hello;//用来调用业务类,

public void setHello(IHello hello){
this.hello = hello;
}

public void pointHello(String name) {
hello.hello("PointcutSpeaker的Hello:" + name);
}
}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
">

<bean id="helloSpeaker" class="HelloSpeaker" />
<bean id="logBeforeAdvice" class="LogBeforeAdvice" />

<bean id="pointcut" class="org.springframework.aop.support.ControlFlowPointcut" >
<constructor-arg value="PointcutSpeaker" />
</bean>

<bean id="advisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="logBeforeAdvice" />
<property name="pointcut" ref="pointcut" />
</bean>

<bean id="helloProxy" class="org.springframework.aop.framework.ProxyFactoryBean" >
<property name="proxyInterfaces" value="IHello" />
<property name="target" ref="helloSpeaker" />
<property name="interceptorNames">
<list>
<value>advisor</value>
</list>
</property>
</bean>

</beans>

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class PointDemo {
public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplicationContext("point*.xml");
IHello helloProxy = (IHello)context.getBean("helloProxy");

helloProxy.hello("普通执行,不会触发拦截器");

PointcutSpeaker pointcutSpeaker = new PointcutSpeaker();
pointcutSpeaker.setHello(helloProxy);

pointcutSpeaker.pointHello("被pointcutSpeaker调用,会执行拦截器");
}
}

通过这个例子可以清楚的看到hellProxy在不同情况下执行hello的时候,符合定义的Pointcut才会被拦截;
  评论这张
 
阅读(1136)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017