版权声明:本文为博主原创文章,未经博主允许不得转载。 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注解来设置,数值越大,优先执行。