• Spring的AOP开发-AOP简介


    目录

    AOP简介

    AOP概念

    AOP思想的实现方案

    模拟AOP的基础代码

    AOP相关概念


    AOP简介

    AOP概念

    • AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的生化,OOP是纵向对一个事务的抽象,一个对象包括静态的信息属性,包括动态的方法信息等。而AOP是横向对不同事务的抽象,属性与属性(多个对象的属性进行抽取)、方法与方法(多个对象的方法进行抽取)、对象与对象(多个对象进行抽取)都可成为一个切面,而用这种思维去设计编程的方法叫做面向切面编程。

    AOP思想的实现方案

    • 动态代理技术(Proxy),在运行期间,对目标对象的方法进行增强,代理对象同名方法内可以执行原有逻辑的同时嵌入执行其它增强逻辑或其它对象的方法,关于proxy代理的文章,可参考:Java高级-代理(proxy)-CSDN博客

    模拟AOP的基础代码

    • 在Spring框架中对于bean对象的增强主要是通过后处理器使用AOP思想来进行实现的,在后处理器中使用代理对象对目标对象进行增强,然后将增强后的代理对象放入单例池中。
    • 具体的示例代码如下
        1. package com.example.Processor;
        2. import com.example.advice.MyAdvice;
        3. import org.springframework.beans.BeansException;
        4. import org.springframework.beans.factory.config.BeanPostProcessor;
        5. import org.springframework.context.ApplicationContext;
        6. import org.springframework.context.ApplicationContextAware;
        7. import org.springframework.stereotype.Component;
        8. import java.lang.reflect.Method;
        9. import java.lang.reflect.Proxy;
        10. @Component
        11. public class MockAopBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware {
        12. private ApplicationContext applicationContext;
        13. @Override
        14. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        15. // 目的:对UserServiceImpl中的show1和show2方法进行增强,增强的方法存在于MyAdvice中
        16. // 问题:设定增强范围(判断语句)、如何获取MyAdvice(从Spring容器中获取)
        17. if (bean.getClass().getPackage().getName().equals("com.example.Service.ServiceImpl")) {
        18. // 生成当前Bean的Proxy对象
        19. Object beanProxy = Proxy.newProxyInstance(
        20. bean.getClass().getClassLoader(),
        21. bean.getClass().getInterfaces(),
        22. (Object proxy, Method method, Object[] args) -> {
        23. // 执行增强对象的before方法
        24. MyAdvice myAdvice = applicationContext.getBean(MyAdvice.class);
        25. myAdvice.beforeAdvice();
        26. // 执行目标对象的目标方法
        27. Object result = method.invoke(bean, args);
        28. // 执行增强对象的after方法
        29. myAdvice.afterAdvice();
        30. return result;
        31. }
        32. );
        33. return beanProxy;
        34. }
        35. return bean;
        36. }
        37. @Override
        38. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        39. this.applicationContext = applicationContext;
        40. }
        41. }

        上述代码是实现bean对象增强的核心过程,指定了需要增强bean对象的范围,以及具体的增强逻辑。实现的两个接口作用具体参照文章:SpringBean的生命周期-CSDN博客

      •  目标对象
          1. package com.example.Service.ServiceImpl;
          2. import com.example.Service.UserService;
          3. import org.springframework.stereotype.Service;
          4. @Service
          5. public class UserServiceImpl implements UserService {
          6. @Override
          7. public void show1() {
          8. System.out.println("show1.....");
          9. }
          10. @Override
          11. public void show2() {
          12. System.out.println("show2.....");
          13. }
          14. }
      • 通知类

          1. package com.example.advice;
          2. import org.springframework.stereotype.Component;
          3. // 自定义增强类,内部提供增强方法
          4. @Component("myAdvice")
          5. public class MyAdvice {
          6. public void beforeAdvice() {
          7. System.out.println("前置增强");
          8. }
          9. public void afterAdvice() {
          10. System.out.println("后置增强");
          11. }
          12. }
      • 测试类

          1. package com.example.Test;
          2. import com.example.Service.UserService;
          3. import org.springframework.context.ApplicationContext;
          4. import org.springframework.context.support.ClassPathXmlApplicationContext;
          5. public class TestMyAOP {
          6. public static void main(String[] args) {
          7. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
          8. UserService userService = applicationContext.getBean(UserService.class);
          9. userService.show1();
          10. }
          11. }
      • 运行结果
        •  

    ps:在上述举例代码中,我是在Spring框架下使用注解的的方式进行bean对象的注册,同时需要在配置文件中设置组件扫描的范围,以此让注解进行生效 当然你也可以使用xml配置文件的方式,将对应类的bean对象交给Spring容器管理,具体如何实现可以参考我的往期Spring注解开发、基于Xml方式配置Bean的相关文章

    AOP相关概念

    • 概念描述
      切面(Aspect)增强和切入点的代码组合
      连接点(Joinpoint)目标对象可以被增强的方法
      通知/增强(Advice)增强部分的代码逻辑
      切点(切入点)(Pointcut)目标对象中实际被增强的方法,连接点包括切点。
      引入(Introduction)在不修改类代码的前提下,引入新的接口和功能。
      织入(Weaving)把切面(增强和切入点代码的组合)应用到目标对象并创建新的代理对象的过程。
      目标对象(Target Object)被增强的方法所在的对象
      代理对象(Proxy)对目标对象增强后的对象,客户端实际调用的对象

     

  • 相关阅读:
    携创教育:2022年10月自考英语二高分技巧有哪些?
    LeetCode 0141. 环形链表 - 三种方法解决
    【正点原子STM32连载】 第四十三章 SPI实验 摘自【正点原子】APM32F407最小系统板使用指南
    python工作任务流flow实时框架:prefect
    LoadBalancer负载均衡服务调用
    最大值和最小值之差达标的子数组数量
    浅述蓝牙Mesh的配网流程
    Elasticsearch:Geoshape query - 过滤含有地理位置的文档
    模型预测控制(Model predictive control,MPC)
    DevOps平台建设的关键点是什么?
  • 原文地址:https://blog.csdn.net/weixin_64939936/article/details/133525856