zoukankan      html  css  js  c++  java
  • Spring的注解方式实现AOP

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

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

    然后我们写一个接口

    [java] view plain copy
     
     print?
    1. package com.bird.service;  
    2.   
    3. public interface PersonServer {  
    4.   
    5.     public void save(String name);  
    6.     public void update(String name, Integer id);  
    7.     public String getPersonName(Integer id);  
    8.       
    9. }  


    和一个接口实现类

    [java] view plain copy
     
     print?
    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进行方法拦截

    [java] view plain copy
     
     print?
    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. }  
    [java] view plain copy
     
     print?
    1. @Pointcut("execution(* com.bird.service.impl.PersonServiceBean.*(..))")  

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

    表各种方法.

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

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

    [java] view plain copy
     
     print?
    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测试

    [java] view plain copy
     
     print?
    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. }  


    测试结果为

    [java] view plain copy
     
     print?
      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. 最终通知  
  • 相关阅读:
    88. Merge Sorted Array
    87. Scramble String
    86. Partition List
    85. Maximal Rectangle
    84. Largest Rectangle in Histogram
    83. Remove Duplicates from Sorted List
    82. Remove Duplicates from Sorted List II
    81. Search in Rotated Sorted Array II
    80. Remove Duplicates from Sorted Array II
    计算几何——点线关系(叉积)poj2318
  • 原文地址:https://www.cnblogs.com/hoobey/p/6106137.html
Copyright © 2011-2022 走看看