`
weitao1026
  • 浏览: 1048369 次
  • 性别: 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、使用Spring注解方式对这个Bean进行方法拦截
Java代码  收藏代码

    @Aspect   
    public class MyInterceptor { 
     
        @Pointcut("execution(* cn.tzz.aop.annotation.service.impl..*.*(..))") 
        private void anyMethod(){}//定义切点   
         
        @Before("anyMethod() && args(person)")   
        public void doAccessCheck(Person person){   
            System.out.println(person.getName());   
            System.out.println("前置通知");   
        }   
         
        @AfterReturning("anyMethod()")   
        public void doAfter(){   
            System.out.println("后置通知");   
        }   
         
        @After("anyMethod()")   
        public void after(){   
            System.out.println("最终通知");   
        }   
         
        @AfterThrowing("anyMethod()")   
        public void doAfterThrow(){   
            System.out.println("异常通知");   
        }   
         
        @Around("anyMethod()")   
        public Object doBasicProfiling(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{   
            System.out.println("进入环绕通知");   
            Object object = proceedingJoinPoint.proceed();//执行该方法   
            System.out.println("退出方法");   
            return object;   
        }   
    }   


Java代码  收藏代码

    @Pointcut("execution(* cn.tzz.aop.annotation.service.impl..*.*(..))") 

上述是定义方法切入点,execution为执行的意思,*代表任意返回值,然后是包名,.*意思是包下面的所有子包,(..)代表各种方法.



5、在Spring的配置文件中配置Bean,需要打开AOP命名空间
Xml代码  收藏代码

    <?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: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> 
         
    </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("personService"); 
        } 
         
        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方法*** 
    后置通知 
    退出方法 
    最终通知 
分享到:
评论

相关推荐

    spring AOP注解的应用1

    在Spring框架中,AOP(面向切面编程)是一...Spring AOP注解的应用使得切面编程更加简单直观,大大简化了对横切关注点的管理。在实际开发中,结合Spring提供的其他特性,如事务管理,可以构建出高效、健壮的后端系统。

    spring aop注解版

    总结起来,Spring AOP注解版通过简单易懂的注解,使得面向切面编程变得更加直观和方便。它降低了横切关注点与业务逻辑之间的耦合度,提高了代码的可维护性和复用性。通过合理利用这些注解,开发者可以轻松地实现日志...

    基于注解实现SpringAop

    基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop

    spring aop 自定义注解保存操作日志到mysql数据库 源码

    2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、可在现有源码上快速进行功能扩展 4、spring boot,mybatis,druid,spring aop的使用

    spring aop 注解例子

    **Spring AOP 注解例子详解** 在 Spring 框架中,面向切面编程(Aspect Oriented Programming,AOP)是一种强大的设计模式,它允许我们分离关注点,将业务逻辑与系统服务(如日志、事务管理等)解耦。在 Spring AOP...

    spring aop注解方式、xml方式示例

    下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### 注解方式 #### 1. 定义切面(Aspect) 在Spring AOP中,切面是包含多个通知(advisors)的类。使用`@Aspect`注解标记切面类,例如: ```java @Aspect ...

    使用Spring的注解方式实现AOP的细节

    本篇文章将深入探讨如何通过Spring的注解方式实现AOP的细节。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或责任。切点(Pointcut)定义了哪些方法会被通知(Advice...

    Spring AOP 注解方式

    在Spring AOP中,我们可以利用注解来实现切面,使得代码更加简洁、易读。本篇文章将深入探讨如何使用注解方式在Spring AOP中实现内部方法的拦截。 首先,理解AOP的基本概念至关重要。AOP的核心是切面(Aspect),它...

    SpringAOP注解特棒例子

    在这个"SpringAOP注解方式"的示例中,我们将深入探讨如何使用注解来实现Spring AOP的功能。 首先,Spring AOP通过两种主要的方式来定义切面:XML配置和注解。本示例主要关注注解方式,因为它提供了更简洁、更直观的...

    spring aop jar 包

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...

    SpringAOP的注解配置

    在Spring AOP中,我们可以通过注解配置来实现切面编程,从而简化代码并提高可维护性。 首先,我们需要了解Spring AOP中的核心概念: 1. **切面(Aspect)**:切面是关注点的模块化,它包含了横切关注点(如日志)和...

    spring注解aop配置详解

    本篇将深入讲解如何通过注解来配置Spring AOP,以实现更加简洁、高效的代码编写。 首先,我们来看注解在Spring AOP中的应用。在传统的AOP配置中,我们需要定义切入点表达式和通知(advice)在XML配置文件中。然而,...

    Spring AOP 16道面试题及答案.docx

    Spring支持两种AOP的实现方式:Spring AspectJ注解风格和Spring XML配置风格。使用AspectJ注解风格是最常见的,它允许开发者直接在方法上使用注解来定义切面。 Spring AOP中有五种不同类型的的通知(Advice): 1....

    用注解的方式进行SpringAOP开发

    本篇我们将深入探讨如何使用注解的方式来实现Spring AOP开发。 ### 一、注解基础 在Spring AOP中,主要使用以下几种注解: 1. `@Aspect`:定义一个切面类,切面是AOP的核心,包含通知(advisors)和切点...

    spring-aop和注解的实例

    而注解在Spring AOP中的应用,使得配置变得更加简洁和直观。 首先,让我们理解什么是切片(Aspect)。在AOP中,切片是关注点的一个模块化单元,它封装了跨越多个对象的代码。例如,事务管理就是一个切片,它涉及到...

    spring aop注解方式代码

    在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务管理、权限...在实际项目中,合理地使用AOP注解,可以让我们更好地应对复杂的应用场景,实现解耦和模块化的代码设计。

    Spring AOP 注解使用

    **Spring AOP 注解使用详解** 在Java世界中,Spring框架以其强大的功能和灵活性而备受推崇,其中AOP(Aspect-Oriented ...通过理解上述概念和实践案例,你将能够更有效地利用Spring AOP注解来优化和组织你的代码。

    spring aop注解所需要的三个jar包,aspectjrt.jar,aspectjweaver.jar,aopalliance.jar

    本篇文章将深入探讨Spring AOP注解所依赖的三个核心JAR包:aspectjrt.jar、aspectjweaver.jar以及aopalliance.jar,并阐述它们在AOP框架中的作用。 首先,`aspectjrt.jar`是AspectJ运行时库,它是AspectJ编译器和织...

    Spring Mvc AOP通过注解方式拦截controller等实现日志管理

    在Spring中,我们通常使用基于注解的AOP,它简化了配置并使代码更易读。 二、注解驱动的AOP 1. 定义切面(Aspect):首先,我们需要创建一个切面类,这个类通常包含通知(Advice),也就是实际的日志记录方法。使用...

    Spring AOP + 注解实现统一注解功能

    "Spring AOP + 注解实现统一注解功能" 本文我们通过Spring AOP和Java的自定义注解来实现日志的插入功能,该方案对原有业务入侵较低,实现较灵活。下面我们将详细介绍该功能的实现原理和相关知识点。 1. 概述 在...

Global site tag (gtag.js) - Google Analytics