引入与其他类型的通知不同,引入影响的是整个类。他们通过给需要消息的类添加方法和属性来实现。引入让你能够动态地建立复合对象,提供了多态继承的好处。
Spring通过一个特殊的方法拦截器接口IntroductionMethodInterceptor来实现引入。这个接口添加一个方法:
boolean implementsInterface(Class intf);
如果IntroductionMethodInterceptor是为了实现指定接口,那么方法implementsInterface应该返回true.就是说,调用这个接口声明的方法的任何调用将被委派给IntroductionMethodInterceptor的invoke()方法.invoke()方法负责实现这个方法,不能调用MethodInvocation.proceed().他引入了新的接口,调用目标对象是没有用的。
Spring提供了一个方便的类来处理我们的大多数应用:DelegatingintroductionInterceptor.代码:
package com.wyq.spring.base.aopinstance;
import java.util.Date;
/**
* @author 作者
* @version 创建时间:2009-11-6 下午02:58:21
* 类说明
*/
public interface Auditable {
void setLastModifiedDate(Date date);
Date getLastModifiedDate();
}
package com.wyq.spring.base.aopinstance;
import java.util.Date;
import org.springframework.aop.support.DelegatingIntroductionInterceptor;
/**
* @author 作者
* @version 创建时间:2009-11-6 下午03:00:06
* 类说明
*/
public class AuditableMixin extends DelegatingIntroductionInterceptor implements
Auditable {
private Date lastModifiedDate;
/*
* 注意我们不用实现invoke()方法了,DelegatingIntroductionInterceptor为我们实现了这
* 个方法。DelegatingIntroductionInterceptor也要实现你的混合类暴露的任何方法,并且将
* 任何对这些方法的调用委托给这个混合类。因为我们的类实现了Auditable,对这个接口的方法的
* 所有调用都将调用我们的拦截器。任何其他方法将委托给目标对象。
*/
public Date getLastModifiedDate() {
return lastModifiedDate;
}
public void setLastModifiedDate(Date lastModifiedDate) {
this.lastModifiedDate = lastModifiedDate;
}
}
创建一个引入Advisor:
因为引入通知只应用在类层次上,所以引入有他们自己的Advisor:IntroductionAdvisor.Spring也提供了一个适合大多数情况的缺省实现。它的名字叫做DefaultIntroductionAdvisor.
BeanFactory对象是一个负责创建其他JavaBean的JavaBean.我们的ProxyFactoryBean创建代理对象。和其他JavaBean一样,它有控制行为的属性。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 创建一个目标对象 -->
<bean id="courseTarget" class="com.springinaction.training.model.Course"></bean>
<!-- 创建一个引入 -->
<bean id="auditableMixin" class="com.springinaction.training.advice.AuditableMixin"></bean>
<!-- 创建一个引入通知 -->
<bean id="auditableAdvisor" class="org.springframework.aop.support.DefaultIntroductionAdvisor">
<constructor-arg>
<ref bean="auditableMixin"/>
</constructor-arg>
</bean>
<!-- 创建一个代理
ProxyFactoryBean的属性
target:代理的目标对象
proxyinterfaces:代理应该实现的接口列表
interceptorNames:需要应用到目标对象上的通知Bean的名字,可以是拦截器、Advisor或者其他通知类型的名字。
singleton:在每次抵用getBean时,工厂是否返回的是同一个代理实例。如果是有状态通知,应该设置为false.
aopProxyFactory:通常不需要使用这个属性。
ProxyTargetClass:是否代理目标类,而不是接口类。
-->
<bean id="course" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyTargetClass">
<value>true</value>
</property>
<property name="singleton">
<value>false</value>
</property>
<property name="proxyInterfaces">
<value>com.springinaction.training.advice.Auditable</value>
</property>
<property name="interceptorNames">
<ref bean="auditableAdvisor"/>
</property>
<property name="target">
<ref bean="courseTarget"/>
</property>
</bean>
</beans>
posted on 2009-11-06 15:35
王永庆 阅读(157)
评论(0) 编辑 收藏 所属分类:
SPRING