使用Spring的注解方式实现AOP

使用Spring的注解方式实现AOP

[日期:2012-03-13]来源:Linux社区 作者:a352193394[字体:大 中 小]

Spring对AOP的实现提供了很好的支持。下面我们就使用Spring的注解来完成AOP做一个例子。

首先,为了使用Spring的AOP注解功能,必须导入如下几个包。aspectjrt.jar,aspectjweaver.jar,cglib-nodep.jar.

然后我们写一个接口

    package com.bird.service;  
      
    public interface PersonServer {  
      
        public void save(String name);  
        public void update(String name, Integer id);  
        public String getPersonName(Integer id);  
          
    }  

和一个接口实现类

  1. package com.bird.service.impl;  
  2.   
  3. import com.bird.service.PersonServer;  
  4.   
  5. public class PersonServiceBean implements PersonServer{  
  6.       
  7.     @Override  
  8.     public void save(String name) {  
  9.           
  10.         System.out.println("我是save方法");  
  11.     //  throw new RuntimeException();  
  12.     }  
  13.   
  14.     @Override  
  15.     public void update(String name, Integer id) {  
  16.           
  17.         System.out.println("我是update()方法");  
  18.     }  
  19.   
  20.     @Override  
  21.     public String getPersonName(Integer id) {  
  22.           
  23.         System.out.println("我是getPersonName()方法");  
  24.         return "xxx";  
  25.     }  
  26.   
  27. }  

下面使用Spring注解方式对这个Bean进行方法拦截

  1. package com.bird.service;  
  2.   
  3. import org.aspectj.lang.ProceedingJoinPoint;  
  4. import org.aspectj.lang.annotation.After;  
  5. import org.aspectj.lang.annotation.AfterReturning;  
  6. import org.aspectj.lang.annotation.AfterThrowing;  
  7. import org.aspectj.lang.annotation.Around;  
  8. import org.aspectj.lang.annotation.Aspect;  
  9. import org.aspectj.lang.annotation.Before;  
  10. import org.aspectj.lang.annotation.Pointcut;  
  11.   
  12. /** 
  13.  * 切面 
  14.  * @author Bird 
  15.  * 
  16.  */  
  17. @Aspect  
  18. public class MyInterceptor {  
  19.     @Pointcut("execution(* com.bird.service.impl.PersonServiceBean.*(..))")  
  20.     private void anyMethod(){}//定义一个切入点  
  21.       
  22.     @Before("anyMethod() && args(name)")  
  23.     public void doAccessCheck(String name){  
  24.         System.out.println(name);  
  25.         System.out.println("前置通知");  
  26.     }  
  27.       
  28.     @AfterReturning("anyMethod()")  
  29.     public void doAfter(){  
  30.         System.out.println("后置通知");  
  31.     }  
  32.       
  33.     @After("anyMethod()")  
  34.     public void after(){  
  35.         System.out.println("最终通知");  
  36.     }  
  37.       
  38.     @AfterThrowing("anyMethod()")  
  39.     public void doAfterThrow(){  
  40.         System.out.println("例外通知");  
  41.     }  
  42.       
  43.     @Around("anyMethod()")  
  44.     public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{  
  45.         System.out.println("进入环绕通知");  
  46.         Object object = pjp.proceed();//执行该方法  
  47.         System.out.println("退出方法");  
  48.         return object;  
  49.     }  
  50. }  

 

  1. @Pointcut("execution(* com.bird.service.impl.PersonServiceBean.*(..))")  

这句话是方法切入点,execution为执行的意思,*代表任意返回值,然后是包名,.*意思是包下面的所有子包。(..)代

表各种方法.

然后下面的注解就比较简单了,就是在使用方法前和中,还有环绕拦截/

然后在Spring的配置文件中继续配置Bean,需要打开AOP命名空间

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xmlns:aop="http://www.springframework.org/schema/aop"  
  5.        xsi:schemaLocation="  
  6.        http://www.springframework.org/schema/beans   
  7.        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  8.        http://www.springframework.org/schema/aop   
  9.        http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">  
  10.           
  11.         <aop:aspectj-autoproxy/>  
  12.     <bean id="personServiceBean" class="com.bird.service.impl.PersonServiceBean"/>  
  13.     <bean id="myInterceptor" class="com.bird.service.MyInterceptor"/>  
  14.      
  15. </beans>  

然后建立一个Junit测试

  1. package junit.test;  
  2.   
  3. import org.junit.Test;  
  4. import org.springframework.context.ApplicationContext;  
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  6.   
  7. import com.bird.service.PersonServer;  
  8.   
  9. public class SpringAOPTest {  
  10.       
  11.     @Test  
  12.     public void inteceptorTest(){  
  13.         ApplicationContext ctx = new ClassPathXmlApplicationContext("beanAop.xml");  
  14.         PersonServer bean = (PersonServer)ctx.getBean("personServiceBean");  
  15.         bean.save(null);  
  16.     }  
  17.       
  18.   
  19. }  

测试结果为

  1. 2012-3-12 18:08:39 org.springframework.context.support.AbstractApplicationContext prepareRefresh  
  2. 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@dd20f6: display name [org.springframework.context.support.ClassPathXmlApplicationContext@dd20f6]; startup date [Mon Mar 12 18:08:39 CST 2012]; root of context hierarchy  
  3. 2012-3-12 18:08:40 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
  4. 信息: Loading XML bean definitions from class path resource [beanAop.xml]  
  5. 2012-3-12 18:08:40 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory  
  6. 信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@dd20f6]: org.springframework.beans.factory.support.DefaultListableBeanFactory@b0bad7  
  7. 2012-3-12 18:08:40 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons  
  8. 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@b0bad7: defining beans [org.springframework.aop.config.internalAutoProxyCreator,personServiceBean,myInterceptor]; root of factory hierarchy  
  9. null  
  10. 前置通知  
  11. 进入环绕通知  
  12. 我是save方法  
  13. 后置通知  
  14. 退出方法  
  15. 最终通知 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值