SpringAOP(注解方式实现面向切面编程)之常用Before、After、Around

一、首先在Springmvc.xml文件中引入如下内容(本示例是在ssm框架基础上实现的)

  1、引入命名空间

xmlns:aop="http://www.springframework.org/schema/aop"

  2、在xsi:schemaLocation中引入如下内容(注意看清自己的spring版本号)

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd

  3、在<beans></beans>节点中添加如下内容

<!-- 开启扫描包,需要去掉service层不进行扫描,避免事务失效 -->
<context:component-scan base-package="com.hp">
        <!-- 配置不需要扫描 service层注解 -->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
 <!-- 开启aop注解方式,此步骤s不能少,这样java类中的aop注解才会生效 -->
<aop:aspectj-autoproxy />

二、切面类

/**
 * @Aspect     将此类声明为切面类
 * @Component  将此类交由spring管理
 * @author wsl
 *
 */
@Component
@Aspect
public class MyAop {
    /*    * sayings()方法只是一个代理对象,个人理解就是将此方法加上
     * @Pointcut 注解后 其他方法 只需要将value设为 此方法名即可 若有错误请指正
     * @Pointcut 注解作用为定义切点 value值为准确切点位置 这里的意思是 com.hp.controller包下所有的方法   */
    @Pointcut(value = "execution(* com.hp.controller..*.*(..))")
    private void sayings() {}

    long time = 0;

    // 方法执行前执行 注意这里的value 是上面定义的代理对象 sayings()
    @Before(value = "sayings()")
    private void before() {
        time = new Date().getTime();
        System.out.println("方法执行前执行");
    }

    // 方法执行后执行
    @After(value = "sayings()")
    private void after() {
        System.out.println("方法执行后执行,执行时间为" + (new Date().getTime() - time));
    }

    // 环绕通知。注意要有ProceedingJoinPoint参数传入。同时必须要有返回值,否者程序会中断执行,web应用中会报页面404;
    @Around(value = "sayings()")
    public Object sayAround(ProceedingJoinPoint pjp) {
        Object proceed = null;
        System.out.println("注解类型环绕通知..环绕前");
        long time2 = new Date().getTime();
        try {
            proceed = pjp.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("注解类型环绕通知..环绕后,执行时间" + (new Date().getTime() - time2));
        return proceed;
    }

}

三、关于 @Pointcut 注解的拓展

  1、任何的Public方法

execution(public * *(..))

  2、以set开头的方法

execution(* set*(..))

  3、定义在com.hp.in接口中的方法

execution(* com.hp.in.*(..))

  4、com.hp.wsl包中的所有方法

execution(* com.hp.wsl.*.*(..))

  5、com.hp.wsl包及其子包中的所有方法

execution(* com.hp.wsl..*.*(..))

四、致谢

  本文借鉴了:

    trayvon 前辈的  《Spring AOP 之二:Pointcut注解表达式》 一文,原文地址:https://my.oschina.net/u/2474629/blog/1083448

    小Cai先森 前辈的《spring中aop的注解实现方式简单实例》 一文,原文地址:https://www.cnblogs.com/caijh/p/7154691.html

      如有不对的地方,谢谢指正;

原文地址:https://www.cnblogs.com/wangshilei/p/11972106.html

时间: 2024-10-13 00:12:42

SpringAOP(注解方式实现面向切面编程)之常用Before、After、Around的相关文章

Spring(十一)使用Spring的注解方式实现面向切面技术AOP

AOP涉及到的一些概念: Aspect(切面):横切性关注点的抽象即为切面,与类相似,只是两者的关注度不一样,类是对物体特征的抽象,而切面是横切性关注点的抽象. Joinpoint(连接点):所谓连接点指那些被拦截的点.在Spring中,这些点指的是方法,因为Spring只支持方法类型的连接点(实际上Joinpoint还可以是field或类构造器). Pointcut(切入点):所谓切入点是指我们要对那些Joinpoint进行拦截的定义. Advice(通知):所谓通知是指拦截到Joinpoin

AOP面向切面编程(使用注解和使用配置文件)

Aop(面向切面编程) 使用注解的方式: 加入相应的jar包: com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar sping-aspects-4.3.3.RELEASE.jar 创建一个切面类 package com.alibaba.wlq.invoke; import java.util.Arrays; import org.aspectj.lang.

面向切面编程(AOP)

        AOP.OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想: OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分.对于"雇员"这样一个业务实体进行封装,自然是OOP/OOD的任务,我们可以为其建立一个"Employee"类,并将"雇员"相关的属性和行为封装其中. 而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中

Spring之面向切面编程AOP(二)

简介 当积累的知识点到一定量的时候,学新知识就变得容易多了.希望再接下来的学习顺利进行下去.今天知识也是挺简单的,主要就是AOP面向切面编程.其中牵涉到了JDKProxy和CGLIB两个代理类,如何使用好,加以深刻理解.学起Spring切面编程也就简单多了 代理模式 1. 代理模式介绍 代理模式的英文叫做Proxy或Surrogate,中文都可译为"代理",所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对

使用Spring进行面向切面编程(AOP)

转载于http://www.blogjava.net/supercrsky/articles/174368.html 文章太长,写的很好,没看完,转过来慢慢理解,品味 简介 面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足. 除了类(classes)以外,AOP提供了 切面.切面对关注点进行模块化,例如横切多个类型和对象的事务管理. (这些关注点术语通常称作 横切(crosscutting) 关注点.) Spring的一个关键的组件就是 AOP

Spring的AOP面向切面编程

什么是AOP? 1.AOP概念介绍 所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程. 功能: 让关注点代码与业务代码分离! 关注点: 重复代码就叫做关注点: 业务代码: 核心业务的代码 业务代码与关注点代码分离,好处? --> 关注点代码写一次即可: -->开发者只需要关注核心业务: -->运行时期,执行核心业务代码时候动态植入关注点代码: [代理] 如何分离? 过程式/对象式/代理模式分离 AOP的好处是可以动态地添加和删除在切面上的逻辑而不

Spring(二):AOP(面向切面编程),Spring的JDBC模板类

1 AOP概述 1.2 什么是AOP 在软件业,AOP为Aspect Oriented Programmig的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. AOP解决了OOP遇到一些问题,采取横向抽取机制,取代了传统

Spring入门第2天--面向切面编程入门

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.06.22 lutianfei none AOP的概述 什么是AOP AOP Aspect Oriented Programing 面向切面编程 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视.事务管理.安全检查.缓存) Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码 AspecJ是一个基于Java语言的AOP框架,Spring2.0

spring入门(四)【面向切面编程】

开发过程中很多时候会用到日志.事务等操作,这些操作如果要写在业务代码中会相当麻烦,这时就会用到面向切面编程(AOP),AOP作为一种编程思想,和OOP有着不同的侧重点,面向对象侧重于万事万物皆对象,而面向切面编程则侧重于事务的一个方面.在面向切面编程过程中有几个比较重要的概念:切面.切点.连接点.通知, 通知:描述了切面要完成的工作,例如,要向某个方法注入日志功能,这里的日志功能就是通知:通知分为5种:Before.After.After-returning.After-throwing.Aro