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

Aop(面向切面编程)

  1. 使用注解的方式:

    1. 加入相应的jar包:

      1. com.springsource.org.aopalliance-1.0.0.jar
      2. com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
      3. sping-aspects-4.3.3.RELEASE.jar
    2. 创建一个切面类
      package com.alibaba.wlq.invoke;
      
      import java.util.Arrays;
      
      import org.aspectj.lang.JoinPoint;
      import org.aspectj.lang.annotation.After;
      import org.aspectj.lang.annotation.Aspect;
      import org.aspectj.lang.annotation.Before;
      import org.springframework.stereotype.Component;
      //@Aspect:表示该类为切面类
      @Aspect
      //@Component:表示该类由Spring管理
      @Component
      public class logAspect {
          //@Before:表示before方法在被通知的程序类的方法执行之前执行
          //execution():表示需要被通知的类中的add方法,add方法可以用通配符表示,那就表示该类中所有的方法都要被通知
        @Before(value="execution(* com.alibaba.wlq.invoke.ArithmeticImp.add(double,double))")
          //JoinPoint:是程序执行中的一个精确执行点,例如类中的一个方法。它是一个抽象的概念,在实现AOP时,并不需要去定义一个join point
        public void before(JoinPoint joinpoint) {
              //获得被通知程序类的参数,返回类型是一个数组
            Object[] args = joinpoint.getArgs();
              //获取被通知程序类的方法名,返回类型是字符串
            String name = joinpoint.getSignature().getName();
            System.out.println("alibaba------>the method "+name+" begin with"+Arrays.asList(args));
        }
      
        //@After:后置通知,表示在类的方法执行后、类中的return方法执行前执行
        @After(value="execution(* com.alibaba.wlq.invoke.ArithmeticImp.add(double,double))")
        public void after() {
            System.out.println("alibaba------>the method *** end result");
        }
      }
    3. 创建被通知的类的接口
      package com.alibaba.wlq.invoke;
      
      public interface Arithmetic {
        public double add(double a,double b);
      }
    4. 创建被通知的类并且继承接口重写其中的方法
      package com.alibaba.wlq.invoke;
      
      import org.springframework.stereotype.Component;
      
      @Component
      public class ArithmeticImp implements Arithmetic{
      
        @Override
        public double add(double a, double b) {
            double result = a + b;
            System.out.println(result);
            return result;
        }
      
      }
    5. 配置文件中的配置
      <?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:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
      
        <!-- 包扫描,前提加入aop的jar包 -->
        <context:component-scan base-package="com.alibaba.wlq"></context:component-scan>
        <!-- 开启切面注解 -->
        <aop:aspectj-autoproxy/>
      </beans>
    6. 测试类
      package com.alibaba.wlq.test;
      
      import org.springframework.context.ApplicationContext;
      import org.springframework.context.support.ClassPathXmlApplicationContext;
      
      import com.alibaba.wlq.controller.UsersController;
      import com.alibaba.wlq.invoke.Arithmetic;
      import com.alibaba.wlq.invoke.ArithmeticImp;
      
      public class Test2 {
      
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ApplicationContext app = new ClassPathXmlApplicationContext("app3.xml");
            Arithmetic arith = (Arithmetic) app.getBean("arithmeticImp");
            arith.add(15.0, 20.0);
        }
      }
    7. 打印结果
      alibaba------>the method add begin with[15.0, 20.0]
      35.0
      alibaba------>the method *** end result
  2. 使用xml配置文件
    1. 导入相应的jar包
    2. 创建接口并且创建相应的类实现该接口
      package com.alibaba.wlq.invoke;
      
      public interface Metic {
        public double add(double a,double b);
        public double sub(double a,double b);
        public double mul(double a,double b);
        public double div(double a,double b);
      }
      package com.alibaba.wlq.invoke;
      
      public class MeticImp implements Metic{
      
        @Override
        public double add(double a, double b) {
            double result = a + b;
            System.out.println(result);
            return result;
        }
      
        @Override
        public double sub(double a, double b) {
            double result = a - b;
            System.out.println(result);
            return result;
        }
      
        @Override
        public double mul(double a, double b) {
            double result = a * b;
            System.out.println(result);
            return result;
        }
      
        @Override
        public double div(double a, double b) {
            double result = a / b;
            System.out.println(result);
            return result;
        }
      
      }
      
    3. 创建切面类
      package com.alibaba.wlq.invoke;
      
      import java.util.Arrays;
      
      import org.aspectj.lang.JoinPoint;
      
      public class Invoke {
        public void before(JoinPoint joinPoint) {
            Object[] args = joinPoint.getArgs();
            String name = joinPoint.getSignature().getName();
            System.out.println("alibaba------>the method "+name+" begin with "+Arrays.asList(args));
        }
        public void after(JoinPoint joinPoint) {
            String name = joinPoint.getSignature().getName();
            System.out.println("alibaba------>the method "+name+" end result:");
        }
        public void afterreturn(Object result) {
            System.out.println("result:========"+result);
        }
      }
    4. 配置文件
      <?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"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
      
        <!-- 定义被通知的程序类 -->
        <bean id="metic" class="com.alibaba.wlq.invoke.MeticImp"></bean>
      
        <!-- 定义切面类的Bean -->
        <bean id="invoke" class="com.alibaba.wlq.invoke.Invoke"></bean>
      
        <!-- 配置切面 -->
        <aop:config>
            <!-- 定义表达式、切点 -->
            <aop:pointcut expression="execution(* com.alibaba.wlq.invoke.*.*(..))" id="point"/>
            <!-- 定义切面 -->
            <aop:aspect ref="invoke">
                <!-- 定义前置通知 -->
                <aop:before method="before" pointcut-ref="point" />
                <!-- 定义后置通知 -->
                <aop:after method="after" pointcut-ref="point"/>
                <!-- 定义返回通知returning属性值得名称要和方法中的参数名称一致 -->
                <aop:after-returning method="afterreturn" pointcut-ref="point" returning="result"/>
            </aop:aspect>
        </aop:config>
      </beans>
    5. 测试类
      package Test;
      
      import org.springframework.context.ApplicationContext;
      import org.springframework.context.support.ClassPathXmlApplicationContext;
      
      import com.alibaba.wlq.invoke.Metic;
      
      public class Test1 {
        public static void main(String[] args) {
            ApplicationContext app = new ClassPathXmlApplicationContext("app.xml");
            Metic arith = (Metic) app.getBean("metic");
            arith.add(15, 10);
        }
      }
      
    6. 输出结果
      alibaba------>the method add begin with [15.0, 10.0]
      25.0
      alibaba------>the method add end result:
      result:========25.0

原文地址:https://www.cnblogs.com/wuliqqq/p/11483807.html

时间: 2024-08-01 17:22:32

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

spring:AOP面向切面编程(注解)03

使用注解写aop时最好使用环绕通知写 切面类: /** * 用于记录日志的工具类,它里面提供了公共的代码 */ @Component("logger") @Aspect //表示当前类是一个切面类 public class Logger { @Pointcut("execution(* cn.flypig666.service.impl.*.*(..))") private void pt1(){}; /** * 前置通知 */ @Before("pt1(

深入探索spring技术内幕(七): 配置Spring AOP面向切面编程

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

浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~

简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring框架的,这就说明你有权选择是否要用AOP来完成一些业务. AOP面向切面编程,通过另一种思考的方式,来弥补面向对象编程OOP当中的不足,OOP当中最重要的单元是类,所以万物皆对象,万物皆是 对象类.而在AOP的模块单元中,最基础的单元是切面,切面对切点进行模块化的管理. 最后再提一句:Spring当

Javascript aop(面向切面编程)之around(环绕)

Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被严重忽视的技术点.但是利用aop可以有效的改善js代码逻辑,比如前端框架dojo和yui3中AOP则被提升至自定义事件的一种内在机制,在源码中随处可见.得益于这种抽象使得dojo的自定义事件异常强大和灵活.dojo中aop的实现在dojo/aspect模块中,主要有三个方法:before.after

sprint.net(2) AOP面向切面编程,spring.net的环绕通知;Spring.net的AOP通知的四种类型

AOP 有点类似于我们MVC里面的Filter过滤器,例如在MVC里面,如果给一个Action上打一个标签,就可以在这个Action执行之前或者之后,额外的执行一个方法,这个就相当于是面向切面编程. 无侵入式的. (也就是在不改变原来的代码的情况下,来跳转到一个其他的方法,执行完毕后回到主方法..),但是spring.net的AOP更牛叉,只需要在xml里面配置,就可以了,不需要在方法上面打特性的标签,也不需要继承什么类(例如MVC的过滤器是继承了ActionFilterAttribute) 主

AOP:面向切面编程

AOP:面向切面编程(Aspect-Oriented Programming)      AOP可以说是对OOP的补充和完善.OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合.当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力.也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系.例如日志功能.日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系.在OOP设计中,它导致了大量代码的重复,而不利于各个模块的

spring入门-AOP 面向切面编程

AOP 面向切面编程 在日常开发中最后将业务逻辑定义在一个专门的service包下,而实现定义在service包下的impl包中, 服务接口以IXXXService形式,而服务实现就是XXXService,这就是规约设计 步骤: 1.E:\Users\WorkSpaces\KmwalletApp\spring\aop\test\HelloWorldService.java 继承(implements)xx接口 2.E:\Users\WorkSpaces\KmwalletApp\spring\ao

Aspects– iOS的AOP面向切面编程的库

简介 一个简洁高效的用于使iOS支持AOP面向切面编程的库.它可以帮助你在不改变一个类或类实例的代码的前提下,有效更改类的行为.比iOS传统的 AOP方法,更加简单高效.支持在方法执行的前/后或替代原方法执行.曾经是 PSPDFKit 的一部分,PSPDFKit,在Dropbox和Evernote中都有应用,现在单独单独开源出来给大家使用. 项目主页: Aspects 最新实例:点击下载 注: AOP是一种完全不同于OOP的设计模式.更多信息,可以参考这里: AOP 百度百科 快速入门 环境要求

java aop面向切面编程

最近一直在学java的spring boot,一直没有弄明白aop面向切面编程是什么意思.看到一篇文章写得很清楚,终于弄明白了,原来跟python的装饰器一样的效果.http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html Aspect Oriented Programming  面向切面编程.解耦是程序员编码开发过程中一直追求的.AOP也是为了解耦所诞生. 具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回

Spring:AOP, 面向切面编程

AOP概述 什么是AOP, 面向切面编程 AOP为Aspect Oriented Programming的缩写, 意为:面向切面编程, 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP是OOP的延续, 是函数式编程的一种衍生范型. 利用AOP可以对业务逻辑的各个部分进行隔离, 从而使得业务逻辑各部分之间的耦合度降低, 提高程序的可重用性, 同时提高了开发的效率. - 传统开发模型: 纵向的编程.  面向切面编程: 纵横配合的编程. AOP的作用及优势 作用: 在程序运行期