SpringAOP-讲清楚切点 通知 切面 链接点

切点 -- 切点就定义了“何处”,切点会匹配通知所要植入的一个或者多个连接点

通知 - 切面也需要完成一定的工作,在 AOP 术语中,切面的工作被称为通知

切面--切面是通知和切点的集合,通知和切点共同定义了切面的全部功能,何时何处完成其功能

链接点 -- 连接点是一个应用执行过程中能够插入一个切面的点,从应用程序的视角来看。

为什么要知道这4个点呢,因为接下来写代码的时候都是基于这四个点来写的。

切点 对应注解@pointcut ,可以自己定义需要对那些方法或这类进行拦截/切。

通知,对应用我们的@Before,@After@AfterThorwing@AfterReturn,及对方法调用的哪个时间进行通知。

切面,对应于@Aspect 用在类上面,在这里面可以定义我们的切点,通知

链接点,对应用joinpoint 对象,用来抓取我们被切方法内部的所有数据,参数,方法名等等。

SpringAOP-讲清楚切点 通知 切面 链接点_第1张图片

SpringAOP-讲清楚切点 通知 切面 链接点_第2张图片

使用spring AOP 的三板斧:

第一步 引入jar包,

         
            org.springframework
            spring-context
            5.2.11.RELEASE
        
        
            org.springframework
            spring-aspects
            5.2.11.RELEASE
        
        
            org.springframework
            spring-aop
            5.1.5.RELEASE
        
        
            org.aspectj
            aspectjweaver
            1.8.13
        

第二步:

在spring 配置文件,spring.xml放在resource下面,加上package scan 和 aspectj打开sop注解







第三步,

自己新建切面类,并在类上面加上注解:

@Aspect

@Component

package com.allen.trainning.spring.aop.aspect;

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

@Component
@Aspect
public class LogAspect {

    @Before("execution(* com.allen.trainning.spring.aop.service.impl.*.*(..))")
    public void before(){
        System.out.println("someone get is find one xiaojieji!");
    }
}

编写自己的类进行测试,即切点类:

接口:

public interface GetXiaoJieJieDao {
    public  XiaoJieJie getByAge(int age);
    public  XiaoJieJie getByName(String name);
}

实现: 

@Repository
public  class GetXiaoJieJieDaoImpl implements GetXiaoJieJieDao {

    public  XiaoJieJie getByAge(int age){
        return new XiaoJieJie("Lucy",age);
    }
    public  XiaoJieJie getByName(String name){
        return new XiaoJieJie(name,18);
    }
}

实体类:

public class XiaoJieJie {
    public XiaoJieJie(String name, Integer age){
        this.name=name;
        this.age=age;
    }
    private String name;
    private Integer age;
    public void play(){
        System.out.println( "my Master, I am "+name+ " ,"+age+ " years old, will you play with me");
    }
}

自己的测试类:

public class TestAop {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext xml = new ClassPathXmlApplicationContext("spring.xml");
        GetXiaoJieJieDao service = xml.getBean(GetXiaoJieJieDao.class);
        XiaoJieJie girl = service.getByName("ziyi");
        girl.play();
    }
}

执行结果:

someone get is find one xiaojieji!
my Master, I am ziyi ,18 years old, will you play with me

Process finished with exit code 0

以上代码实现了,不管谁调用了类GetXiaoJieJie类的时候,都会被抓取到,在执行该类 的方法前打印一句话。

这里只介绍了spring aop的基本思想,接下来的一篇文章会用实例介绍spring aop里面更多的更详细的知识点。

你可能感兴趣的:(Spring,AOP,Spring,SpringAOP使用)