关于代理(九)

自从《关于代理(八)》就在思考,如果在代理之上再实现代理。可能就好像

《施氏食狮史》环绕起来不停止。

前面在http proxy代理之上实现了jdk proxy动态代理,或者利用了代码生成技术实现了「代理」。本篇希望可以将他们融入到Spring体系中。

希望可以达到这样的效果,

public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(GhApp.class, args);Query myTest = ((Query) context.getBean("myTest"));String result = myTest.doQuery("");System.out.println(result);}

代理截图,

首先看用法,启动Spring容器后获取myTest Bean,它是一个Query类型,然后可以执行它的doQuery方法。那么这个myTest Bean是什么注入到Spring容器的呢。

注意看主类上的注解

@Import(QueryRegistar.class)

这个注册局类的目的就是将Query类型的BeanDefinition收集起来,注册到Spring容器的BeanDefinitionRegistry。

它是Spring的扩展机制,实现思路,

通过扫描主类包路径下的所有类,

1)判断是否注解了QueryType

2)然后判断注解了QueryType的类是否注解了QueryMethod

3)将注解QueryMethod的方法解析出来名称,通过名称执行代码生成技术生成一个类

4)通过名称及类构建BeanDefinition,然后注册到BeanDefinitionRegistry

那么这个扫描将会扫描到什么样的类呢

扫描到的是SimpleQueryMapper

其实myTest方法就是定义在SimpleQueryMapper接口类注解了@QueryMethod的方法

这整个过程的处理方式容易让人想到MyBatis的MapperScan处理方式,确实很类似。

附:

我觉得Xxl-job在通过@XxlJob("demoJobHandler")注解定义Bean的方式,也可以修改扫描的方式处理。