Spring框架深入(二)--AOP面向切面

一、AOP概述

  1、AOP:面向切面编程,实现在不增加代码的基础上,增加一些新的功能(公共功能);

  2、AOP并不是Spring框架持有的,Spring只是支持AOP编程的框架之一,可以整合第三方框架来实现面向切面编程(如:Aspect);

  3、现实的应用场景:使用面向切面编程,AOP框架已经实现了面向切面的很多内容;

  4、程序员使用AOP要做的事情:

    编写公共功能,切面;

    基于AOP框架的配置,直接把核心业务和切面关联起来;

  5、Spring中实现AOP的方式有三种:

    基于AspectJ注解的方式实现

    基于schema的XML配置

    基于ProxyFactoryBean代理实现

二、AOP的简单实现_基于AspectJ注解

  编写步骤如下:

  1、创建一个简单的工程,引入jar包:

  

  2、编写核心业务的接口和实现类

public interface ServiceInterface {
    public void sayHello();

    public void sayBye();
}
/*
 * 核心关注点,核心业务
 * */
@Component("service")
public class ServiceImpl implements ServiceInterface {
    @Override
    public void sayHello() {
        // TODO Auto-generated method stub
        System.out.println("say Hello");
    }
    public void sayBye() {
        System.out.println("say Bye");
    }
}

  3、编写一个切面类:我们就简单的做一个打印输出

/*
 * 公共功能:切面
 * */
@Component
@Aspect
public class AdviceMethod {
    //前置通知
    //将这个方法织入核心业务:
    //@Before,表示在核心业务之前织入;
    //execution,表示织入的位置在哪儿
    @Before("point()")
    public void befor() {
        System.out.println("日志");
    }
}

  4、在核心配置文件中声明这个类为切面

<!-- 启用注解 -->
<context:annotation-config></context:annotation-config>
<!-- 扫描 -->
<context:component-scan base-package="service,advice"></context:component-scan>
<!-- 启用AOP aspectj 的配置 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

  5、最后新建一个测试类

public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    //要使用接口来声明核心业务类
    //service就是一个代理对象
    ServiceInterface service = (ServiceInterface) ac.getBean("service");
    //sayHello代码不需要改变,会自动增加日志的功能
    service.sayHello();
    service.sayBye();
}

    注:这儿必须要用接口来声明核心业务类

  这样,一个简单的AOP案例就搭建完成了;

三、AOP详解

  利用一种横切的技术,剖析封装的对象的内部,将影响了多个累的行为封装到了一个可重用的模块中,成为Aspect,切面;

  将应用程序中的商业逻辑与其提供支持的通用服务进行分离;

  1、AOP中的常用术语

    (1)切面:公共功能、交叉功能的描述

    (2)通知:实现切面功能的类

    (3)目标对象:被通知的对象,核心关注点的对象

    (4)代理对象:代理的是目标对象,通过代理目标对象就增加了切面功能

      目标对象+切面功能

      实现切面功能最早使用的是代理对象

    (5)连接点:静态概念,代表通知执行的地方

    (6)切入点:动态概念,运行时执行通知的地方,实现切面功能是,连接点就变为切入点;

    (7)引入:静态概念,将切面与目标对象关联起来

    (8)织入:将切面应用到代理对象,是一个过程

  2、通知类型

    前置通知:核心业务执行前执行

    返回后通知:核心业务返回后执行

    异常通知:核心业务发生异常时执行

    后置通知:核心业务执行后执行

    环绕通知:核心任务执行的时候执行

  代码编写如下:使用注解的方式;

@Before("execution(* service.*.*.*())")
public void befor() {
    System.out.println("前置通知,日志");
}
@After("execution(* service.*.*.*())")
public void after() {
    System.out.println("后置通知,执行完成");
}
@AfterReturning("execution(* service.*.*.*())")
public void afterReturn() {
    System.out.println("返回后通知,得到返回值后");
}
@AfterThrowing("execution(* service.*.*.*())")
public void throwExp() {
    System.out.println("异常通知,异常执行时");
}
@Around("execution(* service.*.*.*())")
public Object round(ProceedingJoinPoint pjp) throws Throwable {
    System.out.println("环绕前。。。");
    Object o=pjp.proceed();//核心业务的正常执行
    System.out.println("环绕后。。。");
    return o;
}

    执行结果:

    

  3、AspectJ中使用的注解

  (1)、AspectJ是一个面向切面的框架;

  (2)、Spring通过AspectJ实现了一注解的方式定义AOP相关的配置,减少了对于配置文件的依赖

  (3)、AspectJ提供的注解:

    @AspectJ:在类上使用,声明该类为一个切面;

    @Before:在方法上使用,声明该方法的通知类型;

    @After:在方法上使用,声明该方法的通知类型;

    @AfterReturn:在方法上使用,声明该方法的通知类型;

    @AfterThrowing:在方法上使用,声明该方法的通知类型;

    @Around:在方法上使用,声明该方法的通知类型;

    @Pointcut:声明切入点;

@Pointcut("execution(* service.*.*.*())")
public void point() {
}
@Before("point()")
public void befor() {
    System.out.println("前置通知,日志");
}

  4、execution表达式的使用

    AOP配置时,不管是XML配置,注解配置,用于定义pointcut切入点

    execution(* service.*.*.*(..))

    

  5、AOP案例_基于schema

    通过核心配置文件来实现AOP切面类

<!-- AspectJ所提供的基于AOP的配置项 -->
<aop:config>
    <aop:pointcut expression="execution(* service.*.*.*(..))" id="pointCut"/>
    <aop:aspect id="myAspect" ref="adviceMethod_xml">
        <aop:before method="before" pointcut-ref="pointCut"/>
        <aop:after method="after" pointcut-ref="pointCut"/>
        <aop:after-returning method="afterReturn" pointcut-ref="pointCut"/>
        <aop:after-throwing method="throwExp" pointcut-ref="pointCut"/>
        <aop:around method="round" pointcut-ref="pointCut"/>
    </aop:aspect>
</aop:config>

    其实现效果和基于注解一样;

PS:因作者能力有限,如有误还请谅解

原文地址:https://www.cnblogs.com/WHL5/p/9062726.html

时间: 2024-08-14 21:41:18

Spring框架深入(二)--AOP面向切面的相关文章

spring框架学习(三)——AOP( 面向切面编程)

AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 所谓的周边功能,比如性能统计,日志,事务管理等等 周边功能在Spring的面向切面编程AOP思想里,即被定义为切面 在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发 然后把切面功能和核心业务功能 "编织" 在一起,这就叫AOP 原理图 1. 功能分两大类,辅助功能和

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

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

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

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

spring框架(2)— 面相切面编程AOP

spring框架(2)- 面相切面编程AOP AOP(Aspect Oriented Programming),即面向切面编程. 可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入封装.继承.多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合.不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能.日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性.异常处

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

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

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

Spring:AOP, 面向切面编程

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

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

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

AOP:面向切面

AOP: 面向切面编程,是一种编程思想,是对面向对象的一种补充. :面向对象是静态角度考虑程序结构而面向切面是动态的考虑程序运行过程. :面向切面编程是将交叉业务封装成切面,利用AOP容器功能将切面织入到主业务逻辑 Spring AOP是Spring框架中的一部分,但可以作为一个独立的模块单独存在.Spring AOP实现AOP技术从本质上来讲,是利用了JDK提供的动态代理技术.而从实际的实现方式来看,则是利用了IoC(Inversion of Control,反转模式)机制,同时采用了AOP联