Spring AOP

Posted 门虫不是虫

tags:

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

1、配置

  导入AspectJ Weaver包;

  xml配置aop相关;

<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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--使用注解方式配置-->
    <aop:aspectj-autoproxy />

2、属性说明

    aspect:切面  -  横切关注点被模块化的特殊对象;即,它是一个类

    advice:通知  -  切面必须要完成的工作。即,他是类中的一个方法

    target:目标  -  被通知对象

    proxy:代理  -  向目标对象应用通知之后创建的对象

    pointcut:切入点  -  切面通知执行的“地点”的定义

    jointPoint:连接点  -  s与切入点匹配的执行点

3、实现

  3.1 Spring API接口实现

    xml配置

   <!--方式一:xml配置实现-->
    <aop:config>
        <!--切入点-->
        <aop:pointcut id="pointcut" expression="execution(* com.doubleh.service.UserServiceImpl.*(..))" />
        <!--通知-->
        <aop:advisor advice-ref="logBefore" pointcut-ref="pointcut" />
        <aop:advisor advice-ref="logAfter" pointcut-ref="pointcut" />
    </aop:config>

    实现通知接口重写方法;

import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;

public class logBefore implements MethodBeforeAdvice {

    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println(target.getClass().getName() +"类,执行了"+method.getName()+"方法");
    }
}

    测试;

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//        接口接收调用功能
        UserService userServiceImpl = applicationContext.getBean("userService", UserService.class);
        userServiceImpl.create();

  3.2 注解实现

    首先需要在xml配置自动代理设置。

   <aop:aspectj-autoproxy />

    然后编写切面类,方法即通知定义。

@Component
@Aspect
public class aopAspect {

    @Before("execution(* com.doubleh.service.UserServiceImpl.*(..))")
    public void before(){
        System.out.println("这是开始");
    }

    @After("execution(* com.doubleh.service.UserServiceImpl.*(..))")
    public void after(){
        System.out.println("这是结束");
    }

    @Around("execution(* com.doubleh.service.UserServiceImpl.*(..))")
    public void around(ProceedingJoinPoint pj) throws Throwable {
        System.out.println("环绕前");
        Object proceed = pj.proceed();
       System.out.println(pj.getSignature());
        System.out.println("环绕后");
    }
}

  3.3 自定义类实现

    类似第二种,知识在xml去切面、切入点和通知方法。

<!--方式三:自定义类实现-->
    <aop:config>
        <aop:aspect  ref="aopAspect">
          <aop:pointcut id="pointcut" expression="execution(* com.doubleh.service.UserServiceImpl.*(..))"></aop:pointcut>
            <aop:before method="before" pointcut-ref="pointcut" />
            <aop:after method="after" pointcut-ref="pointcut" />
        </aop:aspect>
    </aop:config>

 

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

JAVA之AOP

Spring AOP

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

2018.12.24 Spring中的aop演示

Spring框架 AOP

Spring的AOP面向切面编程