### Environment
* Dubbo version: all
* Operating System version: mac
* Java version: jdk1.8
### Step to reproduce this issue
由于AnnotationBean捕获了异常并未做适当处理,Spring容器正常启动,但此时容器内是丢失了部分Bean的。源码调用路径如下
`Spring ClassPathBeanDefinitionScanner类`
```
protected Set<BeanDefinitionHolder> doScan(String... basePackages) {
Set<BeanDefinitionHolder> beanDefinitions = new
LinkedHashSet<BeanDefinitionHolder>();
for (String basePackage : basePackages) {
Set<BeanDefinition> candidates =
findCandidateComponents(basePackage);
for (BeanDefinition candidate : candidates) {
...
// 该方法判断bean是否已存在
// checkCandidate发生异常后,注册流程终止,丢失部分Bean,异常上抛
if (checkCandidate(beanName, candidate)) {
...
registerBeanDefinition(definitionHolder, this.registry);
}
}
}
return beanDefinitions;
}
//
如果不同的jar包里引入了同名Bean(例如SpringUtil),且各自实现不同不兼容,Spring判定为冲突,抛ConflictingBeanDefinitionException异常
protected boolean checkCandidate(String beanName, BeanDefinition
beanDefinition) throws IllegalStateException {
if (!this.registry.containsBeanDefinition(beanName)) {
return true;
}
BeanDefinition existingDef =
this.registry.getBeanDefinition(beanName);
BeanDefinition originatingDef =
existingDef.getOriginatingBeanDefinition();
if (originatingDef != null) {
existingDef = originatingDef;
}
if (isCompatible(beanDefinition, existingDef)) {
return false;
}
// 有可能走到这里
throw new ConflictingBeanDefinitionException("...");
}
```
`Dubbo-config AnnotationBean类`
```
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
if (annotationPackage == null || annotationPackage.length() == 0) {
return;
}
if (beanFactory instanceof BeanDefinitionRegistry) {
try {
// init scanner
Class<?> scannerClass =
ReflectUtils.forName("org.springframework.context.annotation.ClassPathBeanDefinitionScanner");
Object scanner = scannerClass.getConstructor(new Class<?>[]
{BeanDefinitionRegistry.class, boolean.class}).newInstance(new Object[]
{(BeanDefinitionRegistry) beanFactory, true});
// add filter
Class<?> filterClass =
ReflectUtils.forName("org.springframework.core.type.filter.AnnotationTypeFilter");
Object filter =
filterClass.getConstructor(Class.class).newInstance(Service.class);
Method addIncludeFilter =
scannerClass.getMethod("addIncludeFilter",
ReflectUtils.forName("org.springframework.core.type.filter.TypeFilter"));
addIncludeFilter.invoke(scanner, filter);
// scan packages
String[] packages =
Constants.COMMA_SPLIT_PATTERN.split(annotationPackage);
Method scan = scannerClass.getMethod("scan", new
Class<?>[]{String[].class});
// 上层调用,异常在这处理
scan.invoke(scanner, new Object[] {packages});
} catch (Throwable e) {
// spring 2.0
// 此处应该记录错误日志或者抛出异常告知应用
}
}
}
```
### Expected Result
期望继续抛出异常或者记录错误日志,便于问题定位。
### Actual Result
表象为应用启动成功,日志里没有任何错误信息,但请求过来时会报错(手动从容器内获取bean).
```
Just put your stack trace here!
```
[ Full content available at:
https://github.com/apache/incubator-dubbo/issues/2473 ]
This message was relayed via gitbox.apache.org for [email protected]