Что такое исключение NoSuchBeanDefinitionException и как его исправить?

Пожалуйста, объясните, о NoSuchBeanDefinitionException исключение весной:

  • что это значит?
  • при каких условиях он будет брошен?
  • как я могу предотвратить это?

этот пост предназначен для всестороннего Q&A о вхождениях NoSuchBeanDefinitionException в приложениях с использованием Spring.

1 ответов


на javadoc NoSuchBeanDefinitionException объясняется

исключение, выданное, когда BeanFactory запрашивается экземпляр bean для который он не может найти определения. Это может указывать на несуществующий bean, не уникальный bean или зарегистрированный вручную одноэлементный экземпляр без связанного определения bean.

A BeanFactory в основном абстракция, представляющая инверсия пружины управления контейнер. Он подвергает фасоли внутренне и внешне, к вашему применению. Когда он не может найти или получить эти бобы, он бросает NoSuchBeanDefinitionException.

Ниже приведены простые причины, почему a BeanFactory (или связанные классы) не смогут найти Боб и как вы можете убедиться, что это так.


Боб не существует, он не был зарегистрирован

в примере ниже

@Configuration
public class Example {
    public static void main(String[] args) throws Exception {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Example.class);
        ctx.getBean(Foo.class);
    }
}

class Foo {}   

мы не зарегистрировали определение bean для типа Foo через @Bean метод @Component сканирование, определение XML, или любым другим способом. The BeanFactory управляет AnnotationConfigApplicationContext поэтому не имеет указания, где получить Боб, запрошенный getBean(Foo.class). Фрагмент выше бросает

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException:
    No qualifying bean of type [com.example.Foo] is defined

аналогично, исключение могло быть брошено при попытке удовлетворить @Autowired зависимость. Например,

@Configuration
@ComponentScan
public class Example {
    public static void main(String[] args) throws Exception {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Example.class);
    }
}

@Component
class Foo { @Autowired Bar bar; }
class Bar { }

здесь, определение bean зарегистрировано для Foo через @ComponentScan. Но весна ничего не знает о Bar. Поэтому он не может найти соответствующий боб при попытке autowire