顶起来,哪位大神帮看下
Spring factoryBean加载 框架内部嵌套加载问题
各位大神,最近在研究spring框架bean加载过程,遇到一个棘手问题,我相信研究spring原理的大神肯定对这个问题有兴趣
我的项目框架是spring+rpc,配置文件方式注入bean,非注解
一部分bean是普通的serivce bean配置,spring内部走正常bean的加载过程,没有问题;
还有一部分是自定义标签,通过一个工厂类生成service的代理对象bean,作为消费者/生产者,这个工厂类实现了FactoryBean接口,spring内部走FactoryBean的加载过程
public class RemoteServiceFactory implements FactoryBean, BeanFactoryAware, InitializingBean {
private static final Logger log = LoggerFactory.getLogger(RemoteServiceFactory.class);
public RemoteServiceFactory(Object bean, String path, int port) {
this.object = bean; // 自定义标签中配置的service bean的引用(ref属性,引用配置文件bean id)
this.path = path; // 生产者服务路径(和此问题无关)
this.port = port; // 生产者服务端口(和此问题无关)
}
public boolean isSingleton() {
return true;
}
public void afterPropertiesSet() throws Exception {
// 根据this.object创建相应的生产者/消费者代理对象,用于rpc
}
}
问题分析,debug spring bean解析后的加载过程
1.spring对配置文件解析后,遍历所有的bean,进行一一实例化
AbstractApplicationContext:finishBeanFactoryInitialization()
内部调用beanFactory.preInstantiateSingletons();
DefaultListableBeanFactory:preInstantiateSingletons()
内部遍历beanNames,进行一一实例化
2.假如第一个bean是普通的service bean,在初始化时,会解析内部的依赖,然后遍历依赖参数,解析依赖
DefaultListableBeanFactory:doResolveDependency()
内部调用findAutowireCandidates()
内部调用BeanFactoryUtils.beanNamesForTypeIncludingAncestors()
内部调用lbf.getBeanNamesForType()
-> DefaultListableBeanFactory:doGetBeanNamesForType()
关键就在这里,doGetBeanNamesForType方法内部会遍历所有bean,去判断是否匹配上面的依赖参数的类型,
当遍历到实现FactoryBean的bean时,会实例化这个bean(因为FactoryBean只是代理,不是真正bean),然后又会解析factoryBean中真实bean中的依赖参数,
然后就又会走到这里,导致一直嵌套下去的加载过程
如果程序加载没有问题,则一切正常;一旦某个类加载失败(比如某个类注入的属性在properties中不存在),就会出现大量的异常信息抛出,
原因就是上面的嵌套加载,某个类加载抛出异常会一直抛出到嵌套的最顶层,每一层的异常信息都会积攒下来,最后爆发似的抛出
(每层的异常信息都是 当前这层bean的加载失败)
各位大神:
我一直感觉spring这样嵌套加载在设计上是不应该的,不理解为什么会这样,单纯匹配类型的话,不能通过其他方式获取FactoryBean中真实bean的类型吗?
为什么非要实例化它呢?有什么方法可以解决这个问题?
- 点赞
- 写回答
- 关注问题
- 收藏
- 复制链接分享
- 邀请回答
1条回答
为你推荐
- dubbo服务中在consumer中通过autowired方式注入bean失败
- java
- spring
- 5个回答
- 基于SSM框架的tomcat死循环问题···求大佬解答,我截下了循环的部分
- java
- maven
- tomcat
- eclipse
- 1个回答
- tomcat7.0启动项目报错Error creating bean with name 'processDefinitionDiagramLayoutResource': Injection of autowired dependencies failed;
- java
- spring
- tomcat
- 1个回答
- Spring Boot 整合mybatis-plus注入失败
- java
- spring
- intellij-idea
- 2个回答
- openfeign里面配置httpclient出错。
- java
- spring
- jar
- 2个回答
- The error SQL: select * from ACT_GE_PROPERTY where NAME_ = ? Cause: java.lang.NullPointerException
- java
- spring
- tomcat
- 5个回答
- 测试时报错Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required 新人在线等
- java
- maven
- spring
- 1个回答
- sprongboot配置双数据源问题
- spring
- 2个回答
- spring data jpa的误将方法名当成属性名称的问题
- hibernate
- spring
- 0个回答
- SpringDm为什么老报java.lang.ClassNotFoundException
- 编程语言问答
- 互联网问答
- it技术
- IT行业问题
- 计算机技术
- 0个回答
- spring+struts2+hibernate tomcat部署时报错
- tomcat
- 0个回答
- 关于springside3发布在tomcat正常,但是在weblogic出错的问题
- spring
- 0个回答
- 问一个spring入门级的问题
- spring
- 0个回答
- spring security 基于数据库的配置 控制不了url
- spring
- 0个回答
- Spring FactoryBean的使用
- spring
- 0个回答
- 调用dubbo调用其他工程的服务接口 , 打上@Autowired注解启动时报下面的错 ,求大神们帮忙?
- dubbo
- bean
- spring
- 3个回答
- Spring boot entityManagerFactory Bean
- bean
- spring
- 3个回答
- 这个项目启动报错怎么解决?
- java
- spring
- 5个回答
- 配置dubbo,启动消费端服务器出现这个问题
- dubbo
- 2个回答
- SpringBoot不能批量加载mapperLocations!急!在线等!求大神指点啊!
- mybatis
- 8个回答