>  기사  >  Java  >  Spring 프레임워크 지식 요약 - Bean에 주입된 다양한 예외

Spring 프레임워크 지식 요약 - Bean에 주입된 다양한 예외

高洛峰
高洛峰원래의
2016-11-22 15:58:291313검색

최근 Spring 및 Hibernate 프레임워크를 통합할 때 일련의 예외가 발생했습니다. 이 문서에서는 주로 Spring 프레임워크에서 가능한 예외와 해결 방법을 설명합니다.

우리는 BeanFactory를 통해 javabean의 라이프사이클 관리를 쉽게 구현하기 위해 sping의 강력한 빈 컨테이너 관리 메커니즘을 사용합니다. 그러나 구성 관리 중에 필연적으로 몇 가지 예외가 발생합니다.

예외 1: 아니요 종속성

에 대해 발견된 […] 유형의 한정 Bean예를 들어 BeanB는 BeanA

@Component
public class BeanA {

@Autowiredprivate BeanB dependency;

}

이 시점에서 BeanB가 sping의 Cntextl에 정의되어 있지 않으면 시작 시 예외가 발생합니다. 해당 빈 정의 예외는 없습니다:

org.springframework.beans.factory.NoSuchBeanDefinitionException:

종속성에 대해 [org.baeldung.packageB.BeanB] 유형의 적격 Bean이 없습니다.
이 종속성에 대한 자동 와이어 후보로 적격한 최소 1개의 Bean이 필요합니다.
종속성 주석: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

문제의 원인은 간단합니다. 이에 대한 자동 와이어 후보 자격을 갖춘 최소 1개의 Bean이 예상됩니다. 종속성 주입에는 최소한 하나의 정의된 Bean이 필요합니다. 물론 또 다른 가능한 이유는 주석을 사용하고 주석 검색을 구성할 때 패키지 검색을 위한 경로를 설정하지 않았기 때문입니다. 그렇지 않으면 빈이 정의되지 않아야 합니다.

예외 2: […] 유형의 적합한 Bean이 정의되지 않았습니다.

이 예외는 유형의 적합한 Bean이 없음을 의미합니다. 그 이유는 두 개 이상의 동일한 Bean을 정의했기 때문입니다. 예를 들어, 인터페이스 IBeanB가 있고 두 개의 구현 클래스 Bean1과 Bean2

@Component

공용 클래스 BeanB1이 IBeanB를 구현합니다. {
//
}
@Component
public class BeanB2는 IBeanB를 구현합니다. {
//
}

이때 BeanA가 IBeanB 인터페이스를 주입하면 Spring은 어떤 구현 클래스를 사용해야 할지 알 수 없습니다. inject

@Component

public class BeanA {

@Autowired

private IBeanB dependency;

}

이때 BeanFactory는 예외가 발생합니다. NoSuchBeanDefinitionException

원인: org.springframework.beans.factory.NoUniqueBeanDefinitionException:

[org.baeldung.packageB.IBeanB] 유형의 정규 Bean이 정의되지 않았습니다.
예상되는 단일 일치 bean을 찾았지만 2: beanB1, beanB2

"예상했던 단일 일치하는 bean을 찾았지만 2"라는 예외에서 유일한 bean을 찾지 못한 것을 알 수 있습니다.

그러면 해결됩니다. 다음 방법으로

@Component

public class BeanA {

@Autowired

@Qualifier(“beanB2”)
private IBeanB 종속성;

}

sping은 어떤 Bean이 주입 대상으로 사용되는지 명확하게 알 수 있습니다.

예외 3: [...]라는 이름의 Bean이 정의되지 않습니다

이 예외가 발생하면 Sping 컨텍스트로 이동하여 이름으로 Bean을 찾으면 예외가 발생할 수 있습니다. NoSuchBeanDefinitionException

@Component

public class BeanA는 초기화Bean {

@Autowired

private ApplicationContext 컨텍스트를 구현합니다. ;

@Override

public void afterPropertiesSet() {
context.getBean("someBeanName");
}
}

여기서 검색하면 다음이 있습니다. someBeanName이라는 이름의 정의가 없어 예외가 발생함

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:

'someBeanName'이라는 이름의 Bean이 정의되지 않았습니다

명확하게 지적되어 있습니다. 이 이름을 가진 Bean 정의가 없습니다.

예외 4: 프록시 빈

빈이 스프링 컨텍스트에서 JDK 동적 프록시 메커니즘을 사용하는 경우 프록시 클래스는 대상 객체를 상속하지 않지만 이에 대해 동일한 인터페이스를 구현합니다. 이유는 Bean이 인터페이스에 주입되면 문제가 없지만 구현 클래스인 경우 프록시 클래스가 대상을 상속하지 않기 때문에 Sping 컨테이너가 이때 Bean을 찾을 수 없게 됩니다. 수업. Bean이 프록시되는 매우 일반적인 시나리오는 Spring의 트랜잭션 지원 기능을 사용하는 것입니다. @Transactional 주석을 사용하여 트랜잭션을 나타내거나 구성 파일에서 설정할 수 있습니다.

예를 들어 ServiceA가 ServiceB를 주입하고 두 서비스 모두 트랜잭션으로 구성되면 클래스 주입으로 인해 문제가 발생합니다.

@Service

@Transactional
공용 클래스 ServiceA는 IServiceA를 구현합니다.{

@Autowired

private ServiceB serviceB;

}

@Service

@Transactional
public class ServiceB는 IServiceB를 구현합니다{

}

인터페이스 주입을 사용하면 동일한 두 서비스가 정상적으로 실행됩니다.

@Service

@Transactional
공용 클래스 ServiceA가 IServiceA를 구현합니다.{

@Autowired

private IServiceB serviceB;

}

@Service

@Transactional
공용 클래스 ServiceB는 IServiceB를 구현합니다{

}


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.