Spring-AOP

Posted Rzk

tags:

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

导入maven依赖

<dependencies>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.4</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>5.0.0.RELEASE</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

编写service接口

public interface UserService {
    void add();
    void delete();
    void update();
    void selete();
}

service实现类

public class UserServiceImpl implements UserService {
@Override
public void add() {
    System.out.println("添加用户");
}
@Override
public void delete() {
    System.out.println("删除用户");
}
@Override
public void update() {
    System.out.println("修改用户");
}
@Override
public void selete() {
    System.out.println("查询用户");
}

}

编写日志

public class Log implements MethodBeforeAdvice {
    //method 要执行的目标对象方法
    //args 参数
    //target 目标对象
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
    }
}

//这个与前者多了一个return 返回值
public class AfterLog implements AfterReturningAdvice {
    //returnValue:返回值
    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
        System.out.println("执行了"+method.getName()+"返回的结果为"+returnValue);
    }
}

编写appliactionContext.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: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">
    <!--1.注册bean-->
    <bean id="userService" class="com.rzk.service.UserServiceImpl"/>
    <bean id="log" class="com.rzk.log.Log"/>
    <bean id="afterlog" class="com.rzk.log.AfterLog"/>
    <bean id="interlog" class="com.rzk.log.InterLog"/>
    <!--方式一  使用原生Spring API接口-->
    <!--配置aop-->
    <aop:config>
    <!--切入点 execution:表达式, execution(要执行的位置  * 修饰符 * 返回值 * 类名 * 方法名 * 参数),  UserServiceImpl.*(意思是这个类下所有的方法), 方法还有不一样的参数(..)-->
    <aop:pointcut id="pointcut" expression="execution(* com.rzk.service.UserServiceImpl.*(..))"/>

    <!--执行环绕增加! advice-ref:引用上面的 bean的log,pointcut-ref切入到 pointcut这个方法里面-->
    <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
    </aop:config>
</beans>

第二种自定义aop实现方式

新建一个diy类

package com.rzk.diy;
    public class DiyPointCut {
    public void before(){
        System.out.println("=========方法执行前=========");
    }
    public void after(){
        System.out.println("=========方法执行后=========");
    }
}

在applicationContext.xml加入

    <!--第二种方法比较明确:指定哪个类,进行切入-->
<bean id="diy" class="com.rzk.diy.DiyPointCut"/>
<aop:config>
    <!--自定义切面  ref  要引用的类-->
    <aop:aspect ref="diy">
        <!--切入点-->
        <aop:pointcut id="point" expression="execution(* com.rzk.service.UserServiceImpl.*(..))"/>
        <!--通知:也就是要执行什么方法   这里method里面的before就是上面注册bean里面的方法-->
        <aop:before method="before" pointcut-ref="point"/><!--在 point之后执行该方法-->
        <aop:after method="after" pointcut-ref="point"/>
    </aop:aspect>
</aop:config>

第三种注解aop实现方式

新建类

@Aspect//标注这个类是切面
public class AnnotationPointCut {
@Before(" execution(* com.rzk.service.UserServiceImpl.*(..))")
public void before(){
    System.out.println("======方法执行前======");
}
@After("execution(* com.rzk.service.UserServiceImpl.*(..))")
public void after(){
    System.out.println("======方法执行后======");
}
//在环绕增强中,我们可以给定一个参数,代表我们要获取出来切入的点
@Around("execution(* com.rzk.service.UserServiceImpl.*(..))")
public void around(ProceedingJoinPoint jp) throws Throwable {
    System.out.println("环绕前");

    Signature signature = jp.getSignature();//获得签名
    System.out.println("signature"+signature);

    //执行方法
    Object proceed = jp.proceed();
    System.out.println("环绕后");
}

applicationContext.xml

    <!--方式三-->
    <bean id="annotationPointCut" class="com.rzk.diy.AnnotationPointCut"/>
    <!--开启注解支持 aop的-->
    <aop:aspectj-autoproxy/>

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

Spring-AOP

spring-AOP原理

spring-AOP(面向切面编程)

Spring-AOP

spring-AOP概念

Spring-AOP