spring学习——AOP学习

AOP简介

AOP是spring所支持的面向切面编程,首先先看一下正式的定义

  • AOP术语
  • 1,通知:

通知定义了切面要完成的工作内容和何时完成工作,就是什么时候去做辅助功能,功能具体是什么代码

五种类型

Before——在方法调用之前调用通知

After——在方法完成之后调用通知,无论方法执行成功与否

After-returning——在方法执行成功之后调用通知

After-throwing——在方法抛出异常后进行通知

Around——通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为

  • 2,连接点:

在执行正常的功能时,能够插入切面的点。可以作为切入点的点。备选点。
连接点可以是调用方法时、抛出异常时、甚至修改字段时,在这些点,就可以去执行切面。

  • 3,切面:

定义:切面是通知和切点的集合,通知和切点共同定义了切面的全部功能——它是什么,在何时何处完成其功能。
声明切面:

在Spring中,切面就是一个包含通知和切点的对象,是一个Bean,Bean的字段和方法就是该切面的状态和行为,还要通过配置,来指定切入点和通知实现
在xml中,切面使用aop:aspect标签指定,ref属性用来引用切面支持Bean。这个bean里面就是用来执行要做的辅助功能的。

  • 4,切点:

定义:如果通知定义了“什么”和“何时”。那么切点就定义了“何处”。切点会匹配通知所要织入的一个或者多个连接点。通常使用明确的类或者方法来指定这些切点。

作用:定义通知被应用的位置(在哪些连接点)

切入点的声明:

切入点在Spring也是一个Bean。

切点的声明有三种定义方式:

1)在aop:config标签下使用aop:pointcut声明一个切入点Bean,**该切入点可以被多个切面使用,对于需要共享使用的切入点最好使用该方式,**该切入点使用id属性指定Bean名字,在通知定义时使用pointcut-ref属性通过该id引用切入点,expression属性指定切入点表达式

2)在aop:aspect标签下使用aop:pointcut声明一个切入点Bean,该切入点可以被多个切面使用,但一般该切入点只被该切面使用,当然也可以被其他切面使用,但最好不要那样使用,该切入点使用id属性指定Bean名字,在通知定义时使用pointcut-ref属性通过该id引用切入点,expression属性指定切入点表达式:

3)匿名切入点Bean,可以在声明通知时通过pointcut属性指定切入点表达式,该切入点是匿名切入点,只被该通知使用:

  • 5,引入:

引入允许我们向现有的类中添加方法或属性

  • 6,织入:

织入是将切面应用到目标对象来创建的代理对象过程。 切面在指定的连接点被织入到目标对象中,在目标对象的生命周期中有多个点可以织入
编译期——切面在目标类编译时期被织入,这种方式需要特殊编译器。AspectJ的织入编译器就是以这种方式织入切面。
类加载期——切面在类加载到

JVM ,这种方式需要特殊的类加载器,他可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5 的 LTW 就支持这种织入方式
运行期——切面在应用运行期间的某个时刻被织入。一般情况下,在织入切面时候,AOP 容器会为目标对象动态的创建代理对象。Spring AOP 就是以这种方式织入切面。

自己的理解

AOP的过程分为两步:
1,在业务类中插入切入点,
2,将切入点和切面类关联起来

在我自己感觉看来,AOP就相当于将一个整体的应用,分为(核心功能)业务类和(辅助功能)切面,通过XML配置对业务类设置切点(触发点)

然后通过使用配置将切面(辅助功能)通过切点绑在某个业务类上,一旦执行,触发切点,切面(辅助功能)就会随之运行

  • 1、在核心功能中添加切入点

     <!-- 从Pr...到第二个* ,此处是指包名以ProductService开头的类的任意方法 -->
     <!-- 第一个*是指返回任意类型  (..) 表示方法的参数是任意数量和类型 -->
       <!-- 切点的声明 ,aop:pointcut 声明一个切点bean,对于需要共享使用的切入点最好使用该方式-->
       
     <aop:pointcut id="loggerCutpoint"
                   expression=
                           "execution(* ProductService.ProductService.*(..)) "/>
    

AOP的切面需要在xml文件文件中声明,而且切面在spring中也是一个bean

  <bean name="s" class="ProductService.ProductService">

    </bean>

    <bean id="loggerAspect" class="LoggerAspect.LoggerAspect"/>

id是代表这个bean的名字,后边的class是这个切面所在的包

  • 2、将切入点和切面类关联起来
 <!-- 所谓的辅助功能 ,就是切面,上边的就是是切点声明和位置,上边中任意一个方法被触发,下边的切面(辅助功能)就会与运行 -->
        
        <aop:aspect id="logAspect" ref="loggerAspect">
            <aop:around pointcut-ref="loggerCutpoint" method="log"/>
        </aop:aspect>
    </aop:config>
   pointcut-ref是指引用此切点,menthod是指运行切面的方式,即AOP的五种类型,此处是Around,使用日志方法;

AOP的五种类型中,只有最后一种比较难懂,下面的代码可以清楚的看懂Around

public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println("start log:" + joinPoint.getSignature().getName());
    Object object = joinPoint.proceed();
    System.out.println("end log:" + joinPoint.getSignature().getName());
    return object;
}  /**
 * Around——通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为
 * joinPoint,连接点,可以理解为断点
 * 就相当于全程监视一个程序的运行,并在运行前后通过log方法输出结果
 *  Object object = joinPoint.proceed();表示正在运行的程序
 * @param joinPoint
 * @return
 * @throws Throwable
 */

运行结果:
运行结果
AOP就相当于将辅助功能的运行通过切点和切面进行代理。
你只需要关注核心功能的运行,“代理”就会根据切点位置,来选择什么时候来运行辅助功能。

学习网址: http://how2j.cn/k/spring/spring-aop/89.html#step1878
参考网址:https://www.cnblogs.com/mxck/p/7027912.html?utm_source=itdadao&utm_medium=referral

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值