2017-10-22 5 views
0

저는 스프링 프레임 워크에 새로운 기능이 있습니다. @Component 내에 @Bean 어노테이션으로 2 개의 빈을 설정하려고합니다. 그 후, getBean (이름으로)을 얻으려고하면 NoSuchBeanDefinitionException이 발생합니다. 문제를 해결하도록 도와주세요. 구성 요소 - :스프링 : @Component와 @Bean을 사용하여 빈을 가져올 수 없습니다.

package com.example.component; 

@Component 
public class FactoryMethodComponent { 

private static int i; 

@Bean 
@Qualifier("public") 
public TestBean publicInstance() { 
    return new TestBean("publicInstance"); 
} 

@Bean 
@Qualifier("tb1") 
public TestBean1 publicInstanceTB1() { 
    return new TestBean1(publicInstance()); 
} 
} 

- XML 구성 파일 : 앱의 context.xml

다음은 내 코드입니다.

<beans ...> 
    <context:component-scan base-package="com.example.*" /> 
</beans> 

- 테스트 코드 :

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:app-context.xml" }) 
public class ComponentBeanTest { 
@Test 
public void test() { 
    System.out.println(((TestBean1)context.getBean("tb1")).getTestBean().getMethodName()); 
    System.out.println(publicTestBean.getMethodName()); 
} 
} 

- 예외 :

org.springframework.beans.factory.NoSuchBeanDefinitionException '(TB1)'라는 이름의 콩 정의 됨 at org.springframework.beans.factory.support org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean에서 org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition (AbstractBeanFactory.java:1111) 에서 .DefaultListableBeanFactory.getBeanDefinition (DefaultListableBeanFactory.java:577) (AbstractBeanFactory 된 .java : 276) org.springframework.context.support.AbstractApplicationContext.getBean (AbstractApplicationContext.java:1127) 에서 org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:191) 에서 닷컴에서 .example.proxy.ComponentBeanTest.test (ComponentBeanTest.java:38)

답변

1

을로 바꿉니다.은 하나 이상의 클래스가 하나 이상의 @Bean 메소드를 선언하고 Spring 컨테이너에 의해 처리되어 런타임시 해당 빈에 대한 bean 정의와 서비스 요청을 생성 할 수 있음을 나타냅니다.

@Configuration 
public class FactoryMethodComponent { 

private static int i; 

@Bean 
@Qualifier("public") 
public TestBean publicInstance() { 
    return new TestBean("publicInstance"); 
} 

@Bean 
@Qualifier("tb1") 
public TestBean1 publicInstanceTB1() { 
    return new TestBean1(publicInstance()); 
} 
} 
+0

지원해 주셔서 감사합니다. 잘 작동합니다. 구성 요소 주석을 유지하면 Autowired에서는 제대로 작동하지만 context.getBean ("tb1")은 사용할 수 없습니다. 이 메커니즘을 이해하지 못합니다. – BinhLe

+0

Component를 사용하는 경우 Bean으로 표시된 메소드가 정상 메소드 선언으로 처리되고 Bean이 생성되지 않으므로 클래스는 autowire의 유효한 후보입니다. 그러나 Configuration을 사용할 때 Bean으로 표시된 메소드는 스프링 빈을 생성하는 것으로 처리되고 Bean이 생성됩니다. – mhshimul

+0

감사합니다. 나는이 문제에 대해 더 자세히 알고 싶다. 연구를위한 문서 나 열쇠를 나에게 줄 수 있습니까? – BinhLe