• 第八章 Spring AOP


    1.AOP 概念

    aop: Aspect Oriented Programing 面向切面编程

            就是将与业务无关但为业务模块所共同调用的逻辑或责任封装起来,用于减少系统的重复代码,降低模块之间的耦合度,有利于未来的可操作性和可维护性。

            其核心思想就是:将应用程序中的商业逻辑同对其提供支持的通用服务进行分离;

            如:将日志记录,性能统计,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过将这些行为的分离,我们可以将它们独立到非指导业务逻辑的方法中,进而该百年这些行为的时候不影响业务逻辑的代码。

     特征:

            ①aop面向切面编程,能够实现不修改代码来完成功能扩展;

            ②aop采用横向抽取机制,取代传统的纵向继承体系重复性代码;

            ③aop底层使用动态代理的方式实现。

    优点:

            减少代码重复量;

            降低业务之间的耦合度;

            提高代码维护性。 

    2. 实现AOP

    需要的包:

    1. <dependency>
    2. <groupId>org.aspectjgroupId>
    3. <artifactId>aspectjweaverartifactId>
    4. <version>1.9.8version>
    5. dependency>

    通知(Advice/增强):

    1. public class MyAdvice {
    2. public void before(){
    3. System.out.println("before:前置通知");
    4. }
    5. public void afterReturn(){
    6. System.out.println("afterReturn:后置通知");
    7. }
    8. public void around(ProceedingJoinPoint joinPoint) throws Throwable {
    9. System.out.println("around:环绕通知+");
    10. joinPoint.proceed();
    11. System.out.println("around:环绕通知-");
    12. }
    13. public void after(){
    14. System.out.println("after:最终通知");
    15. }
    16. public void afterThrowing(Exception ex){
    17. System.out.println("afterThrowing:异常通知");
    18. System.out.println("异常:"+ex.getMessage());
    19. }
    20. }

    2.1 xml配置方式实现

    1. <context:component-scan base-package="com.service"/>
    2. <bean id="myAdvise" class="com.advise.MyAdvice"/>
    3. <aop:config>
    4. <aop:pointcut id="pc" expression="execution(* com.service.IUserService.insert(..))"/>
    5. <aop:aspect ref="myAdvise">
    6. <aop:before method="before" pointcut-ref="pc"/>
    7. <aop:after-returning method="afterReturn" pointcut-ref="pc"/>
    8. <aop:after method="after" pointcut-ref="pc"/>
    9. <aop:around method="around" pointcut-ref="pc"/>
    10. <aop:after-throwing throwing="ex" method="afterThrowing" pointcut-ref="pc"/>
    11. aop:aspect>
    12. aop:config>
    1. //测试类
    2. ApplicationContext ac = new ClassPathXmlApplicationContext("spring-1.xml");
    3. IUserService userService = ac.getBean(IUserService.class);
    4. userService.select();
    5. userService.insert(new User());

    效果:

    异常通知会在发生异常之后执行。

     2.2 注解方式实现AOP

    xml配置:

    1. <context:component-scan base-package="com.advise,com.service"/>
    2. <aop:aspectj-autoproxy/>

    增强类配置:

    1. @Component
    2. @Aspect
    3. public class MyAdvice {
    4. /**
    5. * 配置公共切入点
    6. * 第一个 * 匹配方法返回类型
    7. * 第二个 * 匹配方法名
    8. * .. 匹配方法参数
    9. */
    10. @Pointcut("execution(* com.service.IUserService.*(..))")
    11. public void pc(){
    12. }
    13. @Before("pc()")
    14. public void before(){
    15. System.out.println("before:前置通知");
    16. }
    17. @AfterReturning("pc()")
    18. public void afterReturn(){
    19. System.out.println("afterReturn:后置通知");
    20. }
    21. @Around("pc()")
    22. public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
    23. System.out.println("around:环绕通知+");
    24. joinPoint.proceed();
    25. System.out.println("around:环绕通知-");
    26. return null;
    27. }
    28. @After("pc()")
    29. public void after(){
    30. System.out.println("after:最终通知");
    31. }
    32. @AfterThrowing(pointcut = "pc()",throwing = "ex")
    33. public void afterThrowing(Exception ex){
    34. System.out.println("afterThrowing:异常通知");
    35. System.out.println("异常:"+ex.getMessage());
    36. }
    37. }

    测试效果:

  • 相关阅读:
    [python刷题模板] 最短路(Dijkstra)
    【Docker】docker网络
    noip模拟赛多校第八场 T3 遥控机器人 (最短路 + 技巧拆点)
    Word格式处理控件Aspose.Words for .NET教程——插入段落并调整样式
    目标检测的yolov3、4、5、6总结
    PyTorch 实战之水果分类
    MyBatis `<foreach>`
    窄带物联网,开启万物互联新篇章
    低代码没有技术含量?来扒扒你所不了解的低代码
    kaniko官方文档 - Build Images In Kubernetes
  • 原文地址:https://blog.csdn.net/m0_71674778/article/details/126853961