applicationContextxml配置文件中配置的名叫adminprojecttypeAction的这个Action实例化失败了。 主要原因就是对应的AdminProjecrTypeAction这个类的构造方法里出现空的对象,导致空指针异常了。可以加断点调试一下,看看是哪个对象为空了。。。进行修复。
上一篇 prepareContext()准备应用上下文 中分析了spring容器的准备, 共计执行了如下8步:
准备刷新, 执行了两步:
清空CachingMetadataReaderFactory中的缓存
设置刷新开始事件, 设置closed为false, active为true, 标记容器处于active状态
AbstractApplicationContext中定义了模板方法, refreshBeanFactory和getBeanFactory调用的是GenericApplicationContext中实现的方法
更新thisrefreshed字段为true, 表示已经更新了, 然后beanFactory设置serializationId, 最后返回beanFactory
beanFactory是GenericApplicationContext中DefaultListableBeanFactory类型的成员变量, 设置beanFactory, 一共执行了
后续处理各个beanFactory, 当前applicationContext是AnnotationConfigServletWebServerApplicationContext的实例, postProcessBeanFactory执行了三步
进行了两个 *** 作, 首先添加了一个WebApplicationContextServletContextAwareProcessor的Aware Bean处理器, ServletContextAware的子类Bean在实例化过程中, 会被注入servletContext和servletConfig对象, 然后beanFactory中注册了request和session两个scopes, 注册了几个Autowired依赖类
注册了request, session两个scope, 然后注册ServletRequest, ServletResponse, >
BeanFactory factory = new XmlBeanFactory(new ClassPathResource(
"applicationContextxml"));
generalQuery = (GeneralQuery) factorygetBean("generalQuery");
applicationContextxml是你的配置文件。下面一句就是从bean里取个GeneralQuery的对象
最近一直在看dubbo的源码部分。在阅读的时候,需要有一个入手点,才能一点一点的进行下去。自己在研究的时候,发现思绪比较乱,于是就以 芋道源码 为基础,一点一点的啃食。芋道源码是直接从dubbo的配置和一些核心的API开始讲起,是从dubbo已经启动的过程作为开始节点,而这些核心 API 与 Spring 的之间的关系被省略了,这些东西对我来说属于前置的知识点,所以花了比较长的时间又从 Dubbo 的核心 API 倒着往前看。
在阅读 Dubbo 时,发现前置知识越来越多,如:Spring 的 refresh 中的一些核心点,Spring 中 bean 的生命周期,BeanFactory 与 FactoryBean 的区别等。所以这些前置知识花了特别多的时间去补。所幸,虽然补前置知识虽然时间长,但是性价比还是可以的。Dubbo 是依赖于Spring 的上下文环境的框架,其他依赖于 Spring 的框架也是相同的道理。Spring 的一些对外的扩展点,读过之后也会心中有数。
1、本篇主要是描述了 Dubbo 在 Spring 创建上下文的时候,是如何从创建,到能完整提供一个RPC调用能力的一些相关点。
2、由于源码比较多,直接贴断点也太过臃肿,所以仅仅贴一些关键点来概括整个流程。
3、本文是依赖于前面的 dubbo 项目进行断点分析,项目结构可以参照这里。项目中 dubbo 的配置方式是 xml 文件,所以本篇主要说 xml 配置方式。其他方式道理相同,并不是问题的关键点。
4、项目启动的是 dubbo-user 服务,所以 UserService 为 dubbo:service,OrderService 为 dubbo:reference。
下图为Spring 启动时是如何加载 Dubbo 的,其中省略了大量过程,只保留了一些关键节点,省略的部分可以略微脑补一下。
整个流程的入口是 Spring 的 refresh 方法。每个方法都有比较深的调用栈。与 Dubbo 有关的入口是 refresh 中的 invokeBeanFactoryPostProcessors 方法
这个方法是执行 beanFactory 的一些后处理 *** 作,其核心流程为在Spring容器中找出实现了BeanFactoryPostProcessor接口的processor并执行。Spring容器会委托给PostProcessorRegistrationDelegate的invokeBeanFactoryPostProcessors方法执行。
ConfigurationClassPostProcessor 是比较核心的类,在这里我们关注一下这个类。它的作用是对项目中配置的类进行处理。具体处理可以分为几步:
在加载类信息时,spring 会去用各种方式扫到注册的 bean 信息。我们在 spring 中注册的 bean,逃不出这个方法的扫描方式。 核心方法是:
扫描之后,会将扫描到的 bean 注册到 beanDefinitionMap 中
首先是此处 orgspringframeworkbeansfactoryxmlDefaultBeanDefinitionDocumentReader#parseBeanDefinitions,可以看出方法会以配置文件根节点起,遍历所有子节点。
其次是这里 orgspringframeworkbeansfactoryxmlBeanDefinitionParserDelegate#parseCustomElement(orgw3cdomElement, orgspringframeworkbeansfactoryconfigBeanDefinition), 此方法会通过解析出来的节点,获取对应的 Spring 的 namespaceUri ,进而获取对应的配置文件处理器。
此处 ele 参数实际值为 <dubbo:service />,namespaceUri 为 >
以上就是关于Java main函数读取spring获取bean时遇到的一个问题BeanCreationException全部的内容,包括:Java main函数读取spring获取bean时遇到的一个问题BeanCreationException、Spring源码9. refreshContext()刷新应用上下文、Spring 中 如何获取一个类对象等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)