`
dyy_gusi
  • 浏览: 209758 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

spring中aop的简单使用(Annotation方式)

阅读更多

Spring中AOP开发,使用Annotation注解
1.先加入依赖的jar包
    aspectjart-*.jar
    aspectjweaver-*jar
    cglib-nodep-*.jar


2.修改配置文件中加入
    加入新的命名空间:xmlns:aop="http://www.springframework.org/schema/aop"
    加入新的约束文件:http://www.springframework.org/schema/aop
                      http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
    加入注册处理器配置:<aop:aspectj-autoproxy/>
    完整的配置文件头:

<?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:aop="http://www.springframework.org/schema/aop"  
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"  
	xsi:schemaLocation="http://www.springframework.org/schema/beans     
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd     
	http://www.springframework.org/schema/context     
	http://www.springframework.org/schema/context/spring-context-2.5.xsd  
	http://www.springframework.org/schema/tx  
	http://www.springframework.org/schema/tx/spring-tx-2.5.xsd  
	http://www.springframework.org/schema/aop  
	http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">  		
	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>//这一句是让spring配置文件中打开AOP的注解支持
	<!--其他bean的定义-->
</beans>

 
3.建立一个拦截器类,并且使用给这个拦截器类标记上相应的注解

@Aspect
// @Aspect这表示是一个切面类,有这个注解以后,spring就可以知道这是一个切面类
public class InterceptorAnnotation {
    @Pointcut(value = "execution(* com.spring.dao.impl.UserDaoImpl.*(..))")
    public void anyMethod() {
        // 这只是定义一个切入点,方便各种通知的引用,这个方法是没有实际意义的
    }

    // 前置通知,在目标方法执行之前操作,可以传递参数进来
    @Before(value = "anyMethod()&&args(user)")
    public void before(User user) {
        // 在这里使用的实参需要和上面注解中给的参数的名称一致
        // 然后就可以在这个地方进行记录日志,权限操作等
        System.out.println("---------" + user.getId());
        System.out.println("before前置通知annotation");
    }

    // 运行玩的后置通知,在目标方法正确执行完成后执行
    @AfterReturning(pointcut = "anyMethod()")
    public void afterReturning() {
        // 同样在这个地方可以记录日志等等。注意是正确执行完成后再回到这里来
        System.out.println("afterReturning后置通知Annotation");
    }

    // 运行异常通知,在目标方法执行过程中如果抛出异常后执行
    @AfterThrowing(pointcut = "anyMethod()", throwing = "e")
    public void afterThrowing(Exception e) {
        // 当抛出异常以后,可以在这里记录
        System.out.println(e.getMessage());
        System.out.println("afterThrowing异常通知Annotation");
    }

    // 最终通知,无论运行成功还是抛出异常,最后都会执行的
    @After("anyMethod()")
    public void after() {
        System.out.println("after最终通知Annotation");
    }

    // 环绕通知,在目标方法执行前后都可以执行
    @Around(value = "anyMethod()")
    public void around(ProceedingJoinPoint pjp) throws Throwable {
        // 在目标执行前执行
        System.out.println("around前置通知Annotation");
        pjp.proceed();// 这个地方会代理执行目标方法
        // 在目标执行后执行
        System.out.println("around后置通知Annotation");
    }
}
//这里面涉及到几个概念,在后面解释


4.将拦截器类交给spring容器管理
    在xml配置文件中加入bean:<bean id="interceptorAnnotation" class="com.spring.aop.InterceptorAnnotation"></bean>
    注意,虽让已经在拦截器类上有注解定义了。但是还是需要在spring容器中声明并让spring管理这个拦截器bean
5.测试执行
    执行对应切入点的的那个类的方法,这个例子中就是执行com.spring.dao.impl.UserDaoImpl类下面的任意的一个方法。
    比如执行UserDaoImpl.addUser(user)方法,会输出如下结果
        around前置通知Annotation
        ----------266531660//这是在前置通知中输出的userID
        before前置通知annotation
        add User[-266531660,a,b] to DB//这是目标方法执行addUser的时候的输出
        around后置通知Annotation
        after最终通知Annotation
        afterReturning后置通知Annotation
        //注意,这个输出中没有异常通知的输出,应为在执行目标方法的时候没有发生异常。
       
6.《Spring参考手册》中定义了以下几个AOP的重要概念,结合以上代码分析如下:
    切面(Aspect) :一个关注点的模块化,这个关注点可能会横切多个对象,就是拦截器类
    连接点(Joinpoint) :程序执行过程中的某一行为,就是环绕同通中的参数
    通知(Advice) :“切面”对于某个“连接点”所产生的动作,就是各种通知对应的方法
    切入点(Pointcut) :匹配连接点的断言,在AOP中通知和一个切入点表达式关联,就是之前定义的anyMethod方法
    目标对象(Target Object) :被一个或者多个切面所通知的对象。就是UserDaoImpl类下的任意一个方法
    AOP代理(AOP Proxy) 在Spring AOP中有两种代理方式,JDK动态代理和CGLIB代理。
    有关代理的详细解释,http://dyygusi.iteye.com/blog/1994843


    通知(Advice)类型:
        前置通知(Before advice) :@Before
        后通知(After advice) :@After
        返回后通知(After return advice) :@AfterReturning
        环绕通知(Around advice) :@Around
        抛出异常后通知(After throwing advice) :@AfgerThrowing
   
    @Pointcut(value = "execution(* com.spring.dao.impl.UserDaoImpl.*(..))")的解释:
        定义一个切入点,里面的value是接入点表达式。最常见的切入点表达式就是用execution表示。
        第一个*表示返回任何类型的都可以
        com.spring .dao.impl.UserDaoImpl表示对应的切入点的类
        第二个*表示切入点类下面的所有方法
        (..)表示方法的参数是任意的,可以没有,可以有多个,类型也是任意的
    官方解释:execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?) 
        modifiers-pattern:方法的操作权限
        ret-type-pattern:返回值
        declaring-type-pattern:方法所在的包
        name-pattern:方法名
        parm-pattern:参数名
        throws-pattern:异常
        带?的表示可以去掉,可有可无的。


7.仅供自己学习使用,不喜勿喷。

   

分享到:
评论

相关推荐

    spring 2.0使用AOP实例(基于Annotation的配置方式)

    以上就是Spring 2.0中使用AOP的一个基本实例,基于注解的配置方式使得AOP的使用更加直观和简洁。在实际开发中,我们可以根据需求灵活地定义切面和通知,以实现各种横切关注点的功能。 通过阅读提供的压缩包中的`src...

    spring aop实例annotation方法实现

    为了启用注解驱动的AOP,需要在Spring配置文件中添加`&lt;aop:aspectj-autoproxy&gt;`元素,或者在Java配置中使用`@EnableAspectJAutoProxy`注解。 ```xml &lt;aop:aspectj-autoproxy /&gt; ``` 或者 ```java @Configuration ...

    Spring_Annotation_AOP

    在本资料"Spring_Annotation_AOP"中,我们将深入探讨Spring框架如何利用注解实现AOP,以及其背后的原理和实践应用。 面向切面编程(AOP)是一种编程范式,旨在提高代码的可维护性和可重用性,通过将关注点分离,...

    简单spring aop 例子

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...

    Spring基础:Spring AOP简单使用

    创建一个简单的Spring AOP应用,首先定义一个切面类,包含切点和通知,然后在Spring配置文件中启用AOP并注册切面,最后编写测试类验证AOP功能是否正常工作。 8. **最佳实践** - 适度使用AOP,过多的切面可能导致...

    Spring AOP + AspectJ annotation example

    总结来说,Spring AOP与AspectJ注解的结合使用是Java开发中的强大工具,它们提供了一种优雅的方式来管理横切关注点,提高了代码的可读性和可维护性。通过学习和熟练掌握这一技术,开发者能够更好地应对复杂的企业级...

    spring-aop.jar

    本文将围绕spring-aop.jar这个核心组件,详细探讨Spring AOP的原理、使用方式以及它在实际开发中的应用。 一、AOP概述 AOP是一种编程范式,旨在减少代码冗余,提高模块间的解耦度,通过将关注点分离到不同的切面中...

    以注解方式模拟Spring IoC AOP

    Spring提供了两种主要的AOP实现方式:基于代理(Proxy-based)和基于注解(Annotation-based)。 - **基于代理的AOP**:Spring使用JDK动态代理或CGLIB动态代理创建目标对象的代理,代理对象在调用目标方法前后执行...

    Spring_aop_annotation.zip

    通过对这个实践项目的学习,开发者可以深入理解Spring AOP的注解使用方式,以及如何在实际项目中有效地应用面向切面编程,提高代码的复用性和可维护性。通过这种方式,我们可以更专注于业务逻辑,而不是被系统级的...

    Spring mvc Aop+annotation实现系统日志记录功能实现的jar包

    Spring mvc Aop+annotation实现系统日志记录功能实现的jar包asm-3.3.jar ,aspectjrt.jar , aspectjweaver.jar , cglib-nodep-2.1_3.jar , spring-aop.jar

    学习Spring笔记_AOP_Annotation实现和XML实现

    Spring框架是Java开发中不可或缺的一部分,它以其强大的...通过阅读《学习Spring笔记_AOP_Annotation实现和XML实现》以及探索`Spring_AOP_XML`中的示例,开发者可以深入理解这两个实现方式,并在实际项目中灵活运用。

    spring-aop-annotation-log-all

    这里zip压缩包囊括了学习Spring过程中用到的所有的jar包; 有: commons-logging-1.2.jar spring-beans-4.0.4.RELEASE.jar spring-context-4.0.4.RELEASE.jar spring-core-4.0.4.RELEASE.jar spring-expression-...

    springboot+aspect实现springaop拦截指定方法.zip

    综上所述,SpringBoot结合AspectJ实现SpringAOP拦截指定方法,主要涉及到Spring AOP的原理、切点和通知的定义、自定义注解的使用,以及如何在SpringBoot项目中整合AspectJ进行更复杂的切面编程。通过这些知识点,...

    spring学习之五“AOP概念及使用Annotation的实现”

    在Spring框架中,有两种主要的方式来实现AOP:基于XML配置和基于注解。本篇“spring学习之五”主要介绍的是注解驱动的AOP实现。 1. **定义切面**:在Spring中,我们通常通过创建一个带有`@Aspect`注解的类来定义切...

    spring 3.0 aop 实例

    4. **配置AOP**:在Spring 3.0中,可以使用XML配置或者注解方式来声明AOP。XML配置通过`&lt;aop:config&gt;`和`&lt;aop:advisor&gt;`等元素定义切入点和通知。注解方式则更加简洁,如`@Aspect`定义切面,`@Pointcut`定义切入点,...

    Spring中Aop的使用包括xml和注解

    这里我们将深入探讨两种在Spring中实现AOP的方式:XML配置和注解配置。 首先,让我们来看看**XML配置AOP**。在Spring的早期版本中,XML配置是主要的配置方式。在`spring-aop-xml`中,你可能会看到以下关键元素: 1...

    Spring中的AOP不生效

    - 或者在Java配置中使用: ```java @EnableAspectJAutoProxy(proxyTargetClass = true) ``` 4. **确认Service类是否被正确扫描**: - 检查`@ComponentScan`注解的配置,确保Service类所在的包被扫描到。 - ...

    spring中自定义注解(annotation)与AOP中获取注解

    在Spring框架中,自定义注解(Annotation)和AOP(面向切面编程)的结合使用,极大地增强了代码的可读性和可维护性。本文将深入探讨如何在Spring中创建自定义注解以及如何在AOP中有效地获取并利用这些注解。 首先,...

    spring aop xml 实例

    在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱,而Spring AOP(面向切面编程)则是Spring框架中的一个重要组成部分。AOP允许开发者定义“切面”,它是一种将关注点分离的方式,使得我们可以把...

Global site tag (gtag.js) - Google Analytics