【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
rose-scanning的功能
- 把classpath中使用rose的jar包和folder都生成资源对象,供spring读取里面的bean到beanfactory中(更准确是的RoseAppContext或RoseWebAppContext)。
- 自动打开annotation识别,不用再在xml中配置。
处理过程
- new RoseAppContext或RoseWebAppContext,后面用RoseAppContext代替。
- RoseAppContext构造函数中最后会调用在父类AbstractApplicationContext中实现的的#refresh()方法。
- 在#refresh()方法中会调用一些列方法,最后调用到AbstractXmlApplicationContext#loadBeanDefinitions(XmlBeanDefinitionReader reader),这个里面会调用RoseAppContext中重写的#getConfigResources()方法。这个方法是为了获取xml配置文件的位置,然后让后面的reader去读取到Context中。
- 在#getConfigResources()方法中调用RoseResources#findContextResources(),这个方法会根据new Context的时候传的scope来查找配置成Rose的Jar或者Folder。是通过写META-INF/rose.propertie或者manifest写rose=xxx来配置成Rose。如果写了rose=xxx就会被构建成ResourceRef(resource(jar or folder) + modifiers(xxx))
- rose=xxx是有规定的xxx=*,controllers,dao,messages,applicationContext,单独scanning包的话,只有messages和applicationContext。
- 不符合规定的xxx(modifiers)会被过滤掉,而符合规定的会被转成Spring的resource,供Spring使用。
- 在#refresh()方法中会调用RoseAppContext中重写的prepareBeanFactory()。这个方法在RoseAppContext中只会注册‘注解配置处理器’,而在RoseWebAppContext中除了注册‘注解配置处理器’以外,还会注册获取Message和注册Message
扩展Spring的方式
- 在构造函数里面调用refresh方法
- 通过重写 getConfigResources和 prepareBeanFactory
阅读建议
- 如果不想了解spring,就直接从RoseAppContext#getConfigResources()开始看,这个里面就包含了scanning的主要功能。
- 如果想了解Spring就直接从#refresh()中跟。到Spring中的时候最好在旁边放一个context类图,这样才能搞清他们的关系,方便阅读。
其他
- RoseScanner是单例模式,里面有classesFolderResources和jarResources,当下次再使用这个类扫描的时候,就会直接返回这两个面的资源
来源:oschina
链接:https://my.oschina.net/u/226270/blog/201880