Spring入门知识 ———— Spring切面的优先级

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38111957/article/details/83757262

一、引言

hello everyone,一不小心又叫了份外卖,人生就是这样时刻都有小惊喜。

切面的优先级,顾名思义就是如果存在多个切面应用到一个方法上时,他们之间的优先级是什么? 需要怎么去指定优先级?

开整吧~

二、需求分析

之前我们对用户的操作,添加了一个记录日志的切面,那么现在又来了一个需求。

产品经理:“这个对用户数据的操作是很敏感的,你给我加个功能,如果有对用户数据进行修改,在后台及时的消息推送给我。”

小编:"对用户所有的操作,都需要推送吗? 啥时候需要做完呀?"

产品经理:“是的,今天”

小编:"what?"

针对上述情况,很多开发的小伙伴都习以为常了,谁叫我们是程序猿呢?

具体分析:对用户数据进行修改后,消息推送给产品经理。那肯定是需要修改数据成功之后,才推送。如果失败了那不相当于没有操作,那就不用通知(如果产品经理要求失败也通知,那就没办法了~~)。 但是具体是先保存日志呢?还是先消息通知呢?

具体往下看~

三、具体实现

增删改查、以及实现类代码就不展示了。

第一个:添加日志的切面

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class InsertLogHeadr {


    /**
     * 定一个Pointcut,此方法没有返回值和参数
     * 该方法就是一个标识,不进行调用
     *
     * execution中解释:
     * 第一个* :表示任意修饰符的方法
     * com.spring.two.UserMangeImpl.* : 具体的类下面全部的方法
     * (..):任意参数列表
     */
    @Pointcut("execution(* com.spring.two.UserMangeImpl.*(..))")
    public void beforLog(){}


    /**
     * 方法正确返回时调用
     * returning 使用这个属性,指定接收的返回值
     * @param result
     */
    @AfterReturning(value = "beforLog()",returning ="result")
    public void insertLogAfterReturning(Integer result){
        if(result == 1){
            System.out.println("InsertLogHeadr.insertLogAfterReturning : 日志保存成功!");
        }
    }
}

第二个:通知消息的切面

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

/**
 * 对用户数据操作后,后台进行消息推送给管理员
 */
@Aspect
public class SendMessageHeadr {


    /**
     * 定义切点
     */
    @Pointcut("execution(* com.spring.two.UserMangeImpl.*(..))")
    public void sendMessage(){}

    /**
     * 返回时通知
     * 指定返回值:result,处理成功=1
     */
    @AfterReturning(value = "sendMessage()",returning = "result")
    public void sendMessageAfterReturning(Integer result){
        if(result == 1){
            System.out.println("SendMessageHeadr : 通知管理员成功!");
        }
    }
}

如果指定切面的执行顺序,咱们来看下默认是什么样子的?小编运行了三次,都是如下结果。

  public static void main(String[] args) {

        BeanFactory beanFactory = new ClassPathXmlApplicationContext("applicationContext-two.xml");
        UserMange userMange = (UserMange)beanFactory.getBean("userMangeImpl");
        userMange.deleteUser(1);
    }
log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
----------UserMangeImpl.deleteUser-----------
SendMessageHeadr : 通知管理员成功!
InsertLogHeadr.insertLogAfterReturning : 日志保存成功!

Process finished with exit code 0

那现在小编想先保存日志然后在通知管理员,该怎么实现呢? 可以通过@Order注解的形式来设置,数值越大,优先执行

@Order(2)
@Aspect
public class InsertLogHeadr {}
/**
 * 对用户数据操作后,后台进行消息推送给管理员
 */
@Order(1)
@Aspect
public class SendMessageHeadr {}
log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
----------UserMangeImpl.deleteUser-----------
InsertLogHeadr.insertLogAfterReturning : 日志保存成功!
SendMessageHeadr : 通知管理员成功!

Process finished with exit code 0

好啦,说了这么多,其实就是使用@Order注解来设置,数值越大,优先执行。

猜你喜欢

转载自blog.csdn.net/weixin_38111957/article/details/83757262
今日推荐