- 起因:这两天遇到几个业务逻辑是要在文件审核通过后去调用好几个第三方接口同步过去,但是调用第三方接口又得把方法写在Service层中,想了一下这样极度耦合,为了贯彻Spring良好的解耦性所以我采用Spring 的AOP。
- 过程:一开始在网上找很多注解类型的使用AOP方式发现老是调用不到也不报错,不知道自己是不是spring版本的问题(spring版本用的4.2.2),为了节省时间还是用XML的方式实现。好了废话不多说看源码怎么搞。
- 首先在代码中写好切面类
package com.qpedu.aop; import java.net.SocketTimeoutException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.qpedu.entity.file.MicroVideo; /** * 我这里只用到了后置通知所以就用这个举例了 */ public class MessageCommonAop { private Logger logger = LoggerFactory.getLogger(MessageCommonAop.class); //后置通知 public void commitTransaction(String reviewBy, MicroVideo video, boolean agreed, String message){ System.out.println(reviewBy); System.out.println(video.getName()); System.out.println(agreed); System.out.println(message); } }
- 接着在applicationContext.xml中,配置切面
-
<!-- 首先将切面类注册到spring容器中 --> <bean id="messageCommonAop" class="com.qpedu.aop.MessageCommonAop"/> <!-- 配置AOP --> <aop:config> <!-- 带参数的访问切面类后面加上"and args(reviewBy,video,agreed,message)" 并起一个别名 --> <aop:pointcut expression="execution(* com.qpedu.service.impl.file.MicroVideoServiceImpl.reviewBind(..)) and args(reviewBy,video,agreed,message)" id="reviewBind" /> <!-- 审核通过后向消息中心发送通知 --> <aop:aspect ref = "messageCommonAop"> <!--method 中写切面类中的方法 pointcut-ref中写方法别名--> <aop:after-returning method="commitTransaction" pointcut-ref="reviewBind"/> </aop:aspect> </aop:config>
好了这样当调用reviewBind方法完成后会去调用messageCommonAop切面类中的commitTransaction方法,当以后业务逻辑有所改动的时候直接改切面类中的代码就好了,这样就能达到解耦的目的
- 首先在代码中写好切面类