自从《关于代理(八)》就在思考,如果在代理之上再实现代理。可能就好像
《施氏食狮史》环绕起来不停止。
前面在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的方式,也可以修改扫描的方式处理。