rose-scanning reading

て烟熏妆下的殇ゞ 提交于 2019-12-19 08:44:51

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

rose-scanning的功能

  1. 把classpath中使用rose的jar包和folder都生成资源对象,供spring读取里面的bean到beanfactory中(更准确是的RoseAppContext或RoseWebAppContext)。
  2. 自动打开annotation识别,不用再在xml中配置。

处理过程

  1. new RoseAppContext或RoseWebAppContext,后面用RoseAppContext代替。
  2. RoseAppContext构造函数中最后会调用在父类AbstractApplicationContext中实现的的#refresh()方法。
  3. 在#refresh()方法中会调用一些列方法,最后调用到AbstractXmlApplicationContext#loadBeanDefinitions(XmlBeanDefinitionReader reader),这个里面会调用RoseAppContext中重写的#getConfigResources()方法。这个方法是为了获取xml配置文件的位置,然后让后面的reader去读取到Context中。
  4. 在#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))
  5. rose=xxx是有规定的xxx=*,controllers,dao,messages,applicationContext,单独scanning包的话,只有messages和applicationContext。
  6. 不符合规定的xxx(modifiers)会被过滤掉,而符合规定的会被转成Spring的resource,供Spring使用。
  7. 在#refresh()方法中会调用RoseAppContext中重写的prepareBeanFactory()。这个方法在RoseAppContext中只会注册‘注解配置处理器’,而在RoseWebAppContext中除了注册‘注解配置处理器’以外,还会注册获取Message和注册Message

扩展Spring的方式

  1. 在构造函数里面调用refresh方法
  2. 通过重写 getConfigResources和 prepareBeanFactory

阅读建议

  1. 如果不想了解spring,就直接从RoseAppContext#getConfigResources()开始看,这个里面就包含了scanning的主要功能。
  2. 如果想了解Spring就直接从#refresh()中跟。到Spring中的时候最好在旁边放一个context类图,这样才能搞清他们的关系,方便阅读。

其他

  1. RoseScanner是单例模式,里面有classesFolderResources和jarResources,当下次再使用这个类扫描的时候,就会直接返回这两个面的资源
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!