• 利用反射手写代码实现spring AOP


    前言:上一篇博客自己动手编写spring IOC源码受到了大家的热情关注,在这里博客十分感谢。特别是给博主留言建议的@玛丽的竹子等等。本篇博客我们继续,还是在原有的基础上进行改造。下面请先欣赏一下博主画的一张aop简图(没有艺术天分,画的不好莫见怪)

    解析:往往在我们的系统的多个核心流程中会有一部分与之关系不大的相同的横切流程,例如权限认证,事务管理。因此我们一般会抽象出这些相同的比较次要的交给spring aop的Handler来统一处理这些横切流程也就是上图中绿色部分。接下来我们看一下本例结构图:

    解析:1,我们的Hostess对象是Master接口的实现,主要实现了WalkDog()和shopping()两个方法,而WalkDog()方法则是调用的是Dog接口的实现类的bark()方法。

    2,我们整个程序的入口Client调用的Hostess对象的两个核心方法,HumanHandler处理的Hostess对象的横切流程。

    复制代码
     1 public class Client {
     2 
     3     public static void main(String[] args) {
     4         ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 
     5         
     6         Master master = (Master)context.getBean("humanProxy");
     7         
     8         System.out.println("");
     9         System.out.println("");
    10         System.out.println("");
    11         System.out.println("");
    12         
    13         master.shopping();
    14         master.WalkDog();
    15         
    16     }
    17 }
    复制代码
    复制代码
     1 package human;
     2 
     3 import dog.Dog;
     4 
     5 public class Hostess implements Master {
     6     
     7     private Dog dog;
     8     
     9     public void setDog(Dog dog) {
    10         this.dog = dog;
    11     }
    12     
    13     @Override
    14     public void WalkDog() {
    15 
    16         dog.bark();
    17     }
    18     
    19     @Override
    20     public void shopping(){
    21         System.out.println("疯狂购物中");
    22     }
    23 
    24 }
    复制代码

    解析:通过以上代码我们不难发现我们的程序只是调用核心业务,而往往核心业务的周围有很多繁琐的相对于比较次要的横切业务。利用本例中遛狗,购物之前,我们需要再家做一些前提准备。例如:整理一下着装,锁上房门等等,回家之后有需要换鞋之类的。因此我们还需要一个handler来处理这些业务。

     View Code

    解析:有了handler我们还需要一个代理工厂

     View Code

    接下来我们来看一下本例的具体配置

     View Code

    最后一步也是关键,本类中使用到的实例需要我们通过读取上面这份配置文件然后通过反射构造出来。

     View Code

    下面是运行结果

    总结:1 spring aop将我们的系统分为两部分,一核心业务,二横切业务。我们的只需关注核心业务,横切业务统一交给代理去处理。

    2 本例依旧是利用反射调用横切方法实现aop,还是那句话,我们自己写的自然是漏洞百出,只是为了说明问题。作为一个开源的框架,如果对spring源码感兴趣的朋友可以自行查看。

    另:博主的个人博客也在努力搭建中,欢迎与各位学习交流,谢谢!个人博客地址:http://www.singletonh.top/

  • 相关阅读:
    10.16 NOIP模拟赛
    10.14 牛客提高集训营5
    10.12 正睿普及4
    Codeforces Round #516 (Div. 2) (A~E)
    hihoCoder.1509.异或排序(位运算 思路)
    hihoCoder.1513.小Hi的烦恼(bitset 五维偏序)
    hihoCoder挑战赛19 A.Rikka with Sequence(状压DP)
    BZOJ.3668.[NOI2014]起床困难综合症(贪心)
    BZOJ.4903.[CTSC2017]吉夫特(Lucas DP)
    BZOJ.3329.Xorequ(数位DP)
  • 原文地址:https://www.cnblogs.com/zhangyingai/p/7098953.html
Copyright © 2020-2023  润新知