今天把request-proxy的类扫描方式改成了spring的
ClassPathBeanDefinitionScanner,不仅速度提高了,而且代码根据简单了
先说下之前的思路自己写的扫描路径根据配置路径然后把类全部过滤一遍,自己写过滤还是很麻烦,看mybatis-spring,发现可以用
ClassPathBeanDefinitionScanner
简单的就可以完成路径扫描,类的加载
我们自己继承者这个类,然后执行一下啊就可以搞定注入,spring so easy
- 获取类名
这个地方spring 默认的是AnnotationBeanNameGenerator我们有用的是这个
这里的component 就是那个@Component 需要你在你自定义的注解上面注解这个如
这样spring 就可以获取你 名称了
spring默认是按照类型注入的,并且如果value是空,那么name就是类名,而不是我们习惯的第一个字母小写,这个需要注意下
2.类型过滤
这里过滤和我们xml的scan配置差不多
包含的和除外的,因为是我们是自定义注解,所以我们用到是
addIncludeFilter
addIncludeFilter(new AnnotationTypeFilter(IRequest.class));
这样就把我们的过滤条件添加了
3.接口配置
因为spring 默认是不会注册接口的需要我们继承
ClassPathBeanDefinitionScanner 然后后写isCandidateComponent
让其允许接口注册,如果你不是接口那么你也就不用这样玩耍了
-----------------------------------------------------------------------------------------------------------------------------
如果你是实体类注册的化,到这里基本上就OK了
-----------------------------------------------------------------------------------------------------------------------------
4.代理创建
创建代理也挺简单的,把代理的工厂注册下就可以了,但是注册的是class这里我们就需要getPropertyValues()这个方法吧我们的参数注入进去如:
这样spring 就会调用我们的工厂注入bean了,下面是我的beanFactory 其实也很简单
这样spring 就把我生成的代理类,注入到容器中了,我们就可以想平常操作对象一样,操作自己定义的类了.
题外话
说实话看源码果然是不一样的,之前不懂spring如何玩耍的时候,慢慢的看看,spring设计还是感觉好神奇,哈哈
ps2.0
- ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS 这个spring默认的扫描各类配置,; \t\n
- resource.isReadable() 发现他们都喜欢做安全校验,果然是大厂家,这些一起基本上都不会在乎