Java高阶—代理设计模式从抢银行开始说起

Java的设计模式多达23种,这二十三般绝艺,绝大多数人都是样样精通,样样疏松,咋一看猛如虎,定眼一瞧,只会用在main函数。大家都用Mybatis框架,增删改查都不怕,若要问你只见接口不见实现是为啥,你脑袋一拍,得去找真专家。今天我从代理设计模式出发结合Mybatis框架给大家讲解一下。

静态代理——套丝袜抢银行

你是法外狂徒张三,你准备策划一起抢银行事件,你开始进行思考,然后你聪明的大脑灵光一现∑(●ΦДΦ●),你决定给自己套上丝袜。这样你就套上了一层壳子,抢银行的是丝袜变态,关我张某人什么事情 ԾωԾ,这就是静态代理。

interface 银行劫匪 {
    void 打劫();
}

class 丝袜变态 implements 银行劫匪 {
    private 法外狂徒 张三;

    @Override
    public void display() {
            张三.打劫();
    }
}

class 法外狂徒 implements 银行劫匪 {
    @Override
    public void 打劫() {
        System.out.println("");
    }
}

动态代理——哥谭Joker:you completed me

由于你上次的策划行动很完美,你引起了哥谭义警的注意,同时你也成为了闻名遐迩的犯罪大师,你现在改名Joker,人送外号莫里亚蒂,也看不上以前的拙劣伎俩,你开始策略一起完美的犯罪。你准备藏身在幕后,指挥别人去完成,但是你担心会走漏消息,该怎么办呢,你进行思考。

∑(●ΦДΦ●),这时,一道灵光闪过你聪明的大脑。你先脑海里挑出龙套A,B,C一直到Z,26个候选人。等到抢劫时倒计时5分钟,你再从26个人中,临时选一个出去干,这样消息就不会走漏了,不愧是你。

interface 银行劫匪 {
    void 打劫();
}

class 龙套A implements 银行劫匪 {
    @Override
    public void 打劫() {
    }
}

class 龙套B implements 银行劫匪 {
    @Override
    public void 打劫() {
    }
}

class 丝袜变态 implements InvocationHandler {
 
    //打劫
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        Object result = method.invoke(target, args);

        return result;
    }
}

    public static void main(String[] args) {
        龙套A 龙套a = new 龙套A();

        银行劫匪 proxyObject = (银行劫匪) Proxy.newProxyInstance(
                龙套A.class.getClassLoader(),
                new Class[]{龙套A.class},
                new CustomInvocationHandler(龙套a)
        );
        proxyObject.打劫();
    }

罪案实录——mybatis是怎么抢银行的

Mybatis的作者以及使用Mybatis框架的我们当然是聪明人啦,所以让我们来看看大聪明们都是怎么办的吧。

犯罪第一步:挑龙套

Mybatis框架的这个注解,实现了ImportBeanDefinitionRegistrar接口。其实现类,会扫描配置的mapper接口,然后封装成factoryBean(龙套们)。这个接口会在Spring框架的invokeBeanFactoryPostProcessor方法,在Bean实例化之前,同@Configuration,@Import,@Bean等标签一起处理,注入到Spring的上下文中。

犯罪第二步:抢银行

Spring框架,在完成实例化后,会去判断这个实例的类型是不是FactoryBean类型,如果是的话,会去调用FactoryBean.getObject()方法,生成一个新的实例替代掉。让我们看看MyBatis的底层怎么做的吧。

看清楚了吧,Mybatis的底层就是通过动态代理,让接口实例化的。

如果你觉得内容干货满满,对你有用的话,记得点赞收藏与关注我哦,我会继续推出更多优质的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值