Spring AOP使用整理(二)

关键字: spring, aop

三、自动代理的实现

     1、使用BeanNameAutoProxyCreator

          通过Bean的name属性自动生成代理Bean。

Xml代码 复制代码
  1. <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
  2.     <property name="beanNames">  
  3.         <list>  
  4.             <value>*Target</value> <!-- 名字以Target结尾的bean将被拦截 -->  
  5.         </list>  
  6.     </property>  
  7.     <property name="interceptorNames">  
  8.         <list>  
  9.             <value>personAroundAdvice</value>  
  10.         </list>  
  11.     </property>  
  12.  </bean>  

 

     2、使用DefaultAdvisorAutoProxyCreator

          DefaultAdvisorAutoProxyCreator允许我们只需定义相应的Advisor通知者,就可以完成自动代理。配置好DefaultAdvisorAutoProxyCreator受管Bean后,它会自动查找配置文件中定义的Advisor,并将它们作用与所有的Bean。

          Spring提供了以下通知者:

                RegexpMethodPointcutAdvisor
                NameMatchMethodPointcutAdvisor

Xml代码 复制代码
  1. <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>  
  2.   
  3. <bean id="nameMatchMethodPointcutAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">  
  4.     <property name="advice" ref="personAroundAdvice"/>  
  5.     <property name="mappedNames">  
  6.         <list>  
  7.             <value>*info*</value>  
  8.         </list>  
  9.     </property>  
  10. </bean>  

 

      3、测试代码

Java代码 复制代码
  1. ApplicationContext context = new FileSystemXmlApplicationContext("classpath:com/cjm/aop/beans.xml");   
  2. Person p = (Person)context.getBean("personTarget");   
  3. p.info();  
ApplicationContext context = new FileSystemXmlApplicationContext("classpath:com/cjm/aop/beans.xml");
Person p = (Person)context.getBean("personTarget");
p.info();

 

四、基于aop命名空间的AOP

     1、切面类MyAspect的源码

Java代码 复制代码
  1. public class MyAspect {   
  2.     public void BeforeAdvice(JoinPoint point){   
  3.         PersonImpl p = (PersonImpl)point.getTarget();   
  4.     }   
  5.        
  6.     public void AfterAdvice(JoinPoint point){   
  7.         PersonImpl p = (PersonImpl)point.getTarget();   
  8.     }   
  9.        
  10.     public void AfterReturningAdvice(Object retValue){   
  11.         System.out.println(retValue);   
  12.     }   
  13.        
  14.     public void AroundAdvice(ProceedingJoinPoint point)throws Throwable{   
  15.         System.out.println("AroundAdvice >> 目标对象 前");   
  16.         point.proceed(point.getArgs());   
  17.         System.out.println("AroundAdvice >> 目标对象 后");   
  18.     }   
  19.        
  20.     public void ThrowingAdvice(Throwable throwing)throws Throwable{   
  21.         System.out.println(throwing);   
  22.     }   
  23. }  
public class MyAspect {
	public void BeforeAdvice(JoinPoint point){
		PersonImpl p = (PersonImpl)point.getTarget();
	}
	
	public void AfterAdvice(JoinPoint point){
		PersonImpl p = (PersonImpl)point.getTarget();
	}
	
	public void AfterReturningAdvice(Object retValue){
		System.out.println(retValue);
	}
	
	public void AroundAdvice(ProceedingJoinPoint point)throws Throwable{
		System.out.println("AroundAdvice >> 目标对象 前");
		point.proceed(point.getArgs());
		System.out.println("AroundAdvice >> 目标对象 后");
	}
	
	public void ThrowingAdvice(Throwable throwing)throws Throwable{
		System.out.println(throwing);
	}
}

 

     2、配置

Xml代码 复制代码
  1. <!-- 切面受管Bean -->  
  2. <bean id="myAspect" class="com.cjm.aop.MyAspect"/>  
  3.   
  4. <aop:config proxy-target-class="true">  
  5.     <!-- 声明一个切面 -->  
  6.     <aop:aspect ref="myAspect" order="0">  
  7.         <!-- 声明一个切入点 -->  
  8.         <aop:pointcut id="pointcut1" expression="execution(* com.cjm.aop..*(..))"/>  
  9.            
  10.         <!-- 声明通知 -->  
  11.         <aop:before pointcut-ref="pointcut1" method="BeforeAdvice"/>  
  12.         <aop:after pointcut-ref="pointcut1" method="AfterAdvice"/>  
  13.         <aop:after-returning pointcut-ref="pointcut1" method="AfterReturningAdvice" returning="retValue"/>  
  14.         <aop:around pointcut-ref="pointcut1" method="AroundAdvice"/>  
  15.         <aop:after-throwing pointcut-ref="pointcut1" method="ThrowingAdvice" throwing="throwing"/>  
  16.     </aop:aspect>  
  17. </aop:config>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值