Spring学习笔记(十一)-----Spring in Action

Spring学习笔记(十一)-----Spring in Action
引入与其他类型的通知不同,引入影响的是整个类。他们通过给需要消息的类添加方法和属性来实现。引入让你能够动态地建立复合对象,提供了多态继承的好处。
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 >

你可能感兴趣的:(Spring学习笔记(十一)-----Spring in Action)