Spring 不止一种类型的 bean:提前崩溃
Spring more than one bean of type: crash early
当我在 Spring 网络应用程序中加载网页时,出现以下错误:
java.lang.IllegalStateException: More than one bean of type [com.Car] found, you have to specify the name of the bean
如何强制 Spring 在启动时检测到这个问题?
请注意,我知道如何自行解决问题(例如删除两个定义之一)
我只是想确保在打开每个网页之前没有任何其他情况我找不到。
创建一个 BeanPostProcessor,它跟踪为应用程序上下文中的每个 bean 定义创建的实例数。这将为您要限制的 bean 类型抛出异常,并将停止容器初始化。因此您可以更早地检测到错误
public class DuplicateBeanDetectionBeanPostProcessor implements BeanPostProcessor{
private Map<Class<?> , Boolean> beanTypeFound = new HashMap<Class<?> , Boolean>();
private Set<Class<?> typesToRestrictToOneInstance = new HashSet<Class<?>>();
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException{
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException{
Set<Class<?>> restrictedTypesForBean = findRestrictedTypesForInstance(bean);
if(!restrictedTypeForBean.isEmpty() && typeAlreadyFound(bean , restrictedTypesForBean)){
throw new IllegalStateException("Bean of type : " + restrictedTypeForBean + " already found in the application context";
}
return bean;
}
private Set<Class<?>> findRestrictedTypesForInstance(Object bean){
Set<Class<?>> restrictedTypesForBean = hew HashSet<>();
Class<?> superClass = bean.getClass();
while(superClass != null){
for(Class<?> restrictedType : typesToRestrictToOneInstance){
if(restrictedType.isAssignableFrom(superClass){
restrictedTypesForBean.add(restrictedType);
}
}
}
return restrictedTypesForBean;
}
private boolean typeAlreadyFound(Object bean , Set<Class<?>> restrictedTypesForBean){
for(Class<?> restrictedTypeForBean : restrictedTypesForBean){
if(beanTypeFound.get(restrictedTypeForBean)){
return true;
}
else{
beanTypeFound.set(restrictedTypeForBean , true);
}
}
return false;
}
public void setTypesToRestrictToOneInstance(Set<Class<?>> typesToRestrictToOneInstance){
this.typesToRestrictToOneInstance = typesToRestrictToOneInstance;
}
}
通过适合您的配置机制将 BeanPostProcessor 添加到您的应用程序上下文中。然后设置所有你想限制的类型
当我在 Spring 网络应用程序中加载网页时,出现以下错误:
java.lang.IllegalStateException: More than one bean of type [com.Car] found, you have to specify the name of the bean
如何强制 Spring 在启动时检测到这个问题?
请注意,我知道如何自行解决问题(例如删除两个定义之一) 我只是想确保在打开每个网页之前没有任何其他情况我找不到。
创建一个 BeanPostProcessor,它跟踪为应用程序上下文中的每个 bean 定义创建的实例数。这将为您要限制的 bean 类型抛出异常,并将停止容器初始化。因此您可以更早地检测到错误
public class DuplicateBeanDetectionBeanPostProcessor implements BeanPostProcessor{
private Map<Class<?> , Boolean> beanTypeFound = new HashMap<Class<?> , Boolean>();
private Set<Class<?> typesToRestrictToOneInstance = new HashSet<Class<?>>();
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException{
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException{
Set<Class<?>> restrictedTypesForBean = findRestrictedTypesForInstance(bean);
if(!restrictedTypeForBean.isEmpty() && typeAlreadyFound(bean , restrictedTypesForBean)){
throw new IllegalStateException("Bean of type : " + restrictedTypeForBean + " already found in the application context";
}
return bean;
}
private Set<Class<?>> findRestrictedTypesForInstance(Object bean){
Set<Class<?>> restrictedTypesForBean = hew HashSet<>();
Class<?> superClass = bean.getClass();
while(superClass != null){
for(Class<?> restrictedType : typesToRestrictToOneInstance){
if(restrictedType.isAssignableFrom(superClass){
restrictedTypesForBean.add(restrictedType);
}
}
}
return restrictedTypesForBean;
}
private boolean typeAlreadyFound(Object bean , Set<Class<?>> restrictedTypesForBean){
for(Class<?> restrictedTypeForBean : restrictedTypesForBean){
if(beanTypeFound.get(restrictedTypeForBean)){
return true;
}
else{
beanTypeFound.set(restrictedTypeForBean , true);
}
}
return false;
}
public void setTypesToRestrictToOneInstance(Set<Class<?>> typesToRestrictToOneInstance){
this.typesToRestrictToOneInstance = typesToRestrictToOneInstance;
}
}
通过适合您的配置机制将 BeanPostProcessor 添加到您的应用程序上下文中。然后设置所有你想限制的类型