spring aop

Posted 砂糖橘子君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring aop相关的知识,希望对你有一定的参考价值。

1 aop 术语

(1)连接点

  连接点就是考虑什么地方嵌入一个方法,比如说我现在有一个class A,A有一个方法叫login(),还有一个class B,B有一个方法叫record(),如果我们想要在A.login()方法执行前要先执行B.record()方法,那么我们直接给B.record()方法加一个Before注解就好了(下面解释),这里的在A.login方法执行前 里面的这个“执行前”就是连接点。

(2)切点

  切点就是一系列连接点的集合,我们接触过正则表达式,这里使用SqEL表达式来表达切点的集合,和正则表达式差不多,目的是选取合适的连接点。

(3)通知

  就是我们在我们想要执行的方法之前要执行的那个方法,就像例子中的B.record()

(4)切面

  切面就是通知和切点的集合,理解起来就好像一个通知的方法应用于好多连接点(切点),这两者加起来就是切面

(5)引入

  引入顾名思义是一个动作,就是将我们的切面应用到实际中,就叫做引入。

(6)目标

  目标就是被通知的对象,就好比Class A

(7)代理

  代理可以先理解为替代的意思,如果我们想执行A.login方法,但是我们又想在这个方法执行之前就去执行B.record()方法,但是我们没有更改A.login方法啊,也没有新建一个类啊,那么就用到了代理的概念,代理就好比我们想要执行A.login方法之前,Spring为我们新建了一个Class C,这个C中包含如下代码:

  public void execute(){

    B.record();

    A.Login();

  }

当然不是这么简单~但这个C就是一个代理

(8)织入

  spring 采用运行时织入,就是将切面和目标类的逻辑关系弄清楚~谁在谁前面执行,谁在后面执行,都规划好了,然后再运行程序。

2 Aop配置

(1)xml配置

  先说xml配置的话会直观一点,我们现在配置如下xml文件<?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:p="http://www.springframework.org/schema/p"
    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-4.1.xsd
    http://www.springframework.org/schema/context  
    http://www.springframework.org/schema/context/spring-context-3.0.xsd  
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
    <context:annotation-config />
    <context:component-scan base-package="com.demo.aop"></context:component-scan>
<!-- 声明通知 -->
<bean id="B" class="com.demo.aop.B" />
<aop:config>
     <!-- 声明切点 -->
<aop:pointcut expression="execution(* com.demo.aop.A.login())" id="login"/>
<!-- 声明切面 --> <aop:aspect id="record" ref="B">
<!-- 连接点 --> <aop:before method="record" pointcut-ref="login"/>
       <aop:after method="record" pointcut-ref="login" />
</aop:aspect> </aop:config> </beans>

上面的配置就是spring aop 的xml配置方法

(2) 注解配置

package com.demo.aop;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class B {
    @Pointcut("execution(public * com.demo.aop.A.login())")
    private void prtPointCut(){}
@Before(
"prtPointCut()") public void beforePrt(){ System.out.println("before is loading..."); } @After("prtPointCut()") public void afterPrt(){ System.out.println("after is loading..."); } }

首先我们声明B为一个切面,并标注@Component注解。然后我们声明一个切点,我们给一个方法(prtPointCut())声明为切点之后,然后下面的@Before 或者 @After 注解都用的是这个方法的名字,有人也许会问到 这个prtPointCut方法中为什么没有代码,我去搜索过原因,但是可能心不诚。。没找到。。但是在这个方法中加入代码是不会执行的。具体原因我也想求教一下~这样一个简单的aop配置就结束了。










以上是关于spring aop的主要内容,如果未能解决你的问题,请参考以下文章

JAVA之AOP

Spring AOP

Spring源码高级笔记之——Spring AOP应用

2018.12.24 Spring中的aop演示

Spring框架 AOP

Spring的AOP面向切面编程