본문 바로가기
자바,스프링 - Java,Spring Framework

spring에서 xml에 등록된 bean 사용하기, org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'xxx' available 문제 해결

by devscb 2023. 4. 15.
반응형

spring에서 xml에 등록된 bean 사용하기, org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'xxx' available 문제 해결


참고 : spring bean이란?
https://devscb.tistory.com/116


spring에서 xml에 등록된 bean 사용방법


spring에서 xml에 등록된 bean을 사용하려면 아래와 같습니다.
1) bean등록하려는 class 생성
2) xml에 bean 등록
3) bean을 사용하려는 class에서 의존성주입


자세한 방법을 살펴보겠습니다.

1) bean등록하려는 class 생성
일반적인 class파일을 만듭니다. 이 예제에서는 아래와 같은 클래스를 사용해보겠습니다.


public class TestService{
int a;

public void update(int a){
  this.a = a;
}
}




2) xml에 bean 등록
보통, resource에 포함된 xml 내용중 <beans></beans> 태그사이에 아래와 같이 내용을입력해줍니다.


<bean id="testService" class="com.test.TestService"/>


id에는 bean의 고유한 이름을 적어주고, class에는 bean으로 등록할 class를 패키지명 포함하여 작성해줍니다.


3) bean을 사용하려는 class에서 의존성주입
TestController라는 다른 class에서 testService라는 bean을 사용하려고 합니다.
그러려면, 아래와 같이 TestService를 선언해주고, @Autowired 어노테이션(annotation)을 선언해줍니다.


public class TestController{
@Autowired
TestService testService;

public void update(int a){
  testService.update(a);
}
}



내가 지정하고 싶은 bean이 특정되어 있다면, @Inject와 @Qualifier 어노테이션을 사용하여
아래와 같이 사용할 수도 있습니다.


@Controller //@Controller는 bean으로 등록하기 위한 annotation 중 하나 입니다.
public class TestController{
@Autowired
@Qualifier("testService")
TestService testService;

public void update(int a){
  testService.update(a);
}
}


@Qualifier는 일치하는 id에 대해 의존성을 주입하겠다고 명시하는 어노테이션입니다.
@Autowired만 써주면, bean을 자동으로 의존성 주입을 해줍니다.
적절한 class에 대해 의존성 주입을 해줍니다.


org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'xxx' available 문제 해결


저의 경우는 위와 같이 하였으나, NoSuchBeanDefinitionException 이 발생하였었습니다.
해결책은 다음과 같은 것들이 제시되었었습니다.
1) Bean으로 설정할 클래스에 대해서는 @Component, @Repositor를 선언해주지 않았다.
--> XML 로 Bean 을 등록하였기 때문에 저의 경우는 올바른 선택지가 아니였습니다.

2) Component scan을 하지 않았다.
--> 이미 XML에 아래와 같이 component scan이 지정되어 있었습니다.
<context:component-scan base-package="com.test" />

3) component-scan에 해당하지 않는 package 이다
--> component-scan 에 base-package가 정의 되어 있고,
com.test에 해당하는 곳에 테스트하려는 클래스가 분명있었습니다.

4) 제 경우의 정답은 component-scan의 위치를 바꾸는것이였습니다.
xml 파일에 component scan 이후, testService bean을 등록하는 식으로 되어있었습니다.
아래와 같이 말이지요


<beans>
<context:component-scan base-package="com.test" />
<bean id="testService" class="com.test.TestService"/>
</beans>


로그 모드를 debug하여 확인해보니 다른 component들은 bean으로 등록이 잘 되는것을 확인하고,
TestController가 bean으로 등록을 하려는것까지 확인이 되었는데,
TestController를 등록을 하면서 의존된 testService에 no such bean 에러가 뜨는것을 확인하였었습니다.
이를 근거로 bean 등록하는 순서가 문제일수 있겠구나 하는 생각을 해보고 xml 순서를 바꾸었더니 동작하였습니다.


#NoSuchBeanDefinitionException,#spring,#springframework,#framework,#autowired,#component,#스프링,#프레임워크,#스프링프레임워크

 

https://devscb.com/post/168

 

Using beans registered in xml in spring, solving org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named

Using beans registered in xml in spring, solving org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named ‘xxx’ available issue Note: What is a spring bean?https://devscb.com/po

devscb.com

 

728x90
반응형

댓글