2013-06-07 2 views
1

으로 기본 생성자를 호출하려고하므로 Bean을 Spring과 함께 사용하는 데 문제가 있습니다.@Resource

이것은 Bean을 구성하는 방법입니다.

@Configuration 
@ComponentScan("com.mypackage") 
public class BeanConfig { 
    @Bean 
    public Redis redisService() { 
     return new Redis(
      config().getString("redis.master.host"), 
      config().getInt("redis.master.port") 
     ); 
    } 
} 

이것은 내가 내 주요 응용 프로그램 클래스에서 사용하는 방법입니다

@Component 
public class App { 
    @Resource 
    private Redis redisService; 

    public static void main(String args[]) { 
     AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class); 

     App app = applicationContext.getBean(App.class); 
     app.start(); 
    } 
} 

그리고 이것은 내가 설명서를 참조하면 내 프로그램

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'redis' defined in file [Redis.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [Redis]: No default constructor found; nested exception is java.lang.NoSuchMethodException: Redis.<init>() 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1007) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:953) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:487) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) 
    at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:73) 
    at App.main(App.java:33) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [Redis]: No default constructor found; nested exception is java.lang.NoSuchMethodException: Redis.<init>() 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:83) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1000) 
    ... 17 more 
Caused by: java.lang.NoSuchMethodException: Redis.<init>() 
    at java.lang.Class.getConstructor0(Class.java:2730) 
    at java.lang.Class.getDeclaredConstructor(Class.java:2004) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:78) 
    ... 18 more 

를 시작할 때 내가 얻을 예외 @Resource는 필드의 이름을 사용하여로드 할 Bean을 결정하므로 내 bean "redisService"를 찾아야합니다.

나는 분명한 뭔가를 놓치고 있습니까?

감사합니다.

+0

('main' 메소드로 클래스로 다른 클래스를 사용하여) 스프링 빈에서 애플리케이션을 실행하지 않으려 고 시도 했습니까? –

+0

방금 ​​시도했는데, main 메소드를'Main' 클래스로 옮겼습니다. 차이점은 없습니다. –

답변

1

좋아, 알았다. Redis 클래스에서 @Component 주석을 제거했으며 올바르게 작동합니다. 내가하는 일을 더 잘 이해하기 위해 주석에 대해 다시 읽어야 할 필요가 있다고 생각합니다.

0

예외에서 그것은 명시 적으로 기본 생성자 또는 init() 중 하나가 필요하다고 말하는 것입니다. 추가해 주시면 작동합니다.

"main"스레드에서 예외가 발생했습니다. org.springframework.beans.factory.BeanCreationException : [Redis.class] 파일에 이름 'redis'가 정의 된 Bean을 생성하는 중 오류가 발생했습니다. Bean의 인스턴스화에 실패했습니다. 중첩 예외는 org.springframework.beans.BeanInstantiationException : Bean 클래스 [Redis]를 인스턴스화 할 수 없습니다 : 기본 생성자가 없습니다. 중첩 예외는 java.lang.NoSuchMethodException : Redis입니다.