`
weitao1026
  • 浏览: 994330 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring的AOP注解功能

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

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

1、实体bean
Java代码  收藏代码

    public class Person { 
     
        private Long id; 
        private String name; 
        public Long getId() { 
            return id; 
        } 
        public void setId(Long id) { 
            this.id = id; 
        } 
        public String getName() { 
            return name; 
        } 
        public void setName(String name) { 
            this.name = name; 
        } 
    } 

  2、接口类
Java代码  收藏代码

    public interface PersonService { 
        public void save(Person person); 
         
        public void update(Person person);  
         
        public Person getByIdPerson(Long id); 
         
        public void delete(Long id); 
    } 

  3、实现类
Java代码  收藏代码

    public class PersonServiceImpl implements PersonService{ 
     
        Map<Long, Person> maps = new HashMap<Long, Person>(); 
         
        @Override   
        public void save(Person person) { 
            System.out.println("***执行save方法***"); 
            maps.put(person.getId(), person); 
        }   
       
        @Override   
        public void update(Person person) {   
            System.out.println("***执行update()方法***"); 
            maps.remove(person.getId()); 
            maps.put(person.getId(), person); 
        }   
       
        @Override   
        public Person getByIdPerson(Long id) {   
            System.out.println("***执行getByIdPerson()方法***");   
            return maps.get(id); 
        }   
         
        @Override 
        public void delete(Long id) { 
            System.out.println("***执行delete()方法***");   
            maps.remove(id); 
        } 
    } 

4、定义Aspect
Java代码  收藏代码

    public class MyInterceptor { 
     
        /**在核心业务执行前执行,不能阻止核心业务的调用*/ 
        public void doBefore(JoinPoint joinPoint) { 
            //可通过joinPoint来获取所需要的内容 
            Object[] objects = joinPoint.getArgs(); 
            Person person = (Person) objects[0]; 
            System.out.println("前置通知:"+person.getName());  
        }   
           
        /** 核心业务逻辑退出后(包括正常执行结束和异常退出),执行此Advice @param joinPoint */   
        public void doAfter(JoinPoint joinPoint) {   
            System.out.println("最终通知");  
        }   
           
        /** 
         * 核心业务逻辑调用正常退出后,不管是否有返回值,正常退出后,均执行此Advice 
         * @param joinPoint 
         */   
        public void doAfterReturning(JoinPoint joinPoint) {   
            System.out.println("后置通知"); 
        }   
           
        /**异常通知*/   
        public void doAfterThrowing(Throwable ex) {   
            System.out.println("异常通知:"+ex.getMessage());   
        }   
         
        /**环绕通知*/ 
        public Object doAround(ProceedingJoinPoint pjp) throws Throwable {   
            System.out.println("进入环绕通知");   
            Object object = pjp.proceed();//执行该方法   
            System.out.println("退出方法");    
            return object;   
        }   
    }   

5、在Spring的XML配置文件中配置AOP
Java代码  收藏代码

    <?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 
        xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:context="http://www.springframework.org/schema/context" 
        xmlns:mvc="http://www.springframework.org/schema/mvc" 
        xsi:schemaLocation=" 
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd 
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 
         
        <context:annotation-config /> 
        <context:component-scan base-package="cn.tzz.aop.annotation" /> 
         
        <!--AOP 注解 --> 
        <aop:aspectj-autoproxy proxy-target-class="true" /> 
        <bean id="personService" class="cn.tzz.aop.annotation.service.impl.PersonServiceImpl"></bean> 
        <bean id="myInterceptor" class="cn.tzz.aop.annotation.MyInterceptor"></bean> 
        <!--XML 注解 --> 
        <bean id="personXmlService" class="cn.tzz.aop.xml.service.impl.PersonServiceImpl"></bean> 
        <bean id="myXmlInterceptor" class="cn.tzz.aop.xml.MyInterceptor"></bean> 
        <aop:config>   
            <aop:aspect id="aspect" ref="myXmlInterceptor"> 
                <!--定义切点 --> 
                <aop:pointcut id="myPoint" expression="execution(* cn.tzz.aop.xml. 
    service.impl..*.*(..))"/> 
                   
                <aop:before method="doBefore" arg-names="person" pointcut-ref="myPoint"/>   
                <aop:after method="doAfter"  pointcut-ref="myPoint"/>   
                <aop:after-returning method="doAfterReturning"  pointcut-ref="myPoint"/>   
                <aop:after-throwing method="doAfterThrowing" throwing="ex"  
    pointcut-ref="myPoint"/>   
                <aop:around method="doAround"  pointcut-ref="myPoint"/>   
            </aop:aspect>   
        </aop:config>      
    </beans> 



  6、测试
Java代码  收藏代码

    public class TestAop { 
     
        private static ApplicationContext ctx = null; 
        private static PersonService personService = null; 
         
        static{ 
         ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 
         personService = (PersonService)ctx.getBean("personXmlService"); 
        } 
         
        public void testSave(){ 
            Person person = new Person(); 
            person.setId(1L); 
            person.setName("abc"); 
            personService.save(person); 
        } 
         
        public void testGetByIdPerson(){ 
            Person p = personService.getByIdPerson(1L); 
            System.out.println(p.getId()+"---"+p.getName()); 
        } 
         
        public void testUpdate(){ 
            Person person = new Person(); 
            person.setId(1L); 
            person.setName("abc_1"); 
            personService.update(person); 
        } 
         
        public void testDelete(){ 
            personService.delete(1L); 
        } 
         
        @Test   
        public void testInteceptor(){   
            testSave(); 
    //      testGetByIdPerson(); 
    //      testUpdate(); 
    //      testGetByIdPerson(); 
    //      testDelete(); 
    //      testGetByIdPerson(); 
        }   
    } 

7、测试结果
Java代码  收藏代码

    前置通知:abc 
    进入环绕通知 
    ***执行save方法*** 
    最终通知 
    后置通知 
    退出方法 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics