복붙노트

[SPRING] Spring은이 종속성에 대한 autowire 후보가 될 수있는 적어도 하나의 bean을 예상했다.

SPRING

Spring은이 종속성에 대한 autowire 후보가 될 수있는 적어도 하나의 bean을 예상했다.

이 Autowire에 문제가 있습니다.

@Controller
public class ChiusuraController {

    @Autowired
    private ChiusuraProvider chiusuraProvider;
}

이 콩과 함께 :

@Service @Transactional
public class ChiusuraProvider extends ThreadProvider {


    public void run() {}
}

확장

public abstract class ThreadProvider extends Thread implements InitializingBean, Runnable, DisposableBean {
...
}

이 오류가 발생합니다.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'chiusuraController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.cinebot.service.ChiusuraProvider com.cinebot.web.controller.ChiusuraController.chiusuraProvider; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.cinebot.service.ChiusuraProvider] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

autowired 클래스의 ThreadProvider를 제거하면이 오류가 발생하지 않는다는 것을 알았지 만 실제로 ThreadProvider 추상 클래스가 필요합니다.

해결법

  1. ==============================

    1.ThreadProvider 계층 구조의 어느 곳에서나 인터페이스가 있다면 인터페이스의 이름을 서비스 제공자의 유형으로 넣으십시오. 이 구조를 말하면 :

    ThreadProvider 계층 구조의 어느 곳에서나 인터페이스가 있다면 인터페이스의 이름을 서비스 제공자의 유형으로 넣으십시오. 이 구조를 말하면 :

    public class ThreadProvider implements CustomInterface{
    ...
    }
    

    그런 다음 컨트롤러에서 다음을 시도하십시오.

    @Controller
    public class ChiusuraController {
    
        @Autowired
        private CustomInterface chiusuraProvider;
    }
    

    이것이 일어나고있는 이유는 처음에 ChiusuraProvider가 ThreadProvider를 확장하지 못했을 때입니다. Spring은 (@Transaction을 처리하기 위해) CGLIB 기반 프록시를 만드는 기본이 될 것입니다.

    당신이 ThreadProvider가 ThreadProvider가 어떤 인터페이스를 확장한다고 가정하고 ThreadProvider에서 확장했을 때, Spring은 ChisuraProvider 유형이 아닌 그 인터페이스의 구현 인 것으로 보이는 Java Dynamic Proxy 기반의 Proxy를 생성합니다.

    ChisuraProvider를 절대적으로 사용해야한다면 ThreadProvider를 사용하여 다음과 같이 CGLIB 기반 프록시를 대체하거나 강제로 AspectJ를 사용할 수있다.

    <aop:aspectj-autoproxy proxy-target-class="true"/>
    

    다음은 Spring Reference 사이트에서 좀 더 많은 참고 자료입니다 : http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/classic-aop-spring.html#classic-aop -pfb

  2. ==============================

    2.이 줄을 응용 프로그램 컨텍스트에 넣어야합니다.

    이 줄을 응용 프로그램 컨텍스트에 넣어야합니다.

    <context:component-scan base-package="com.cinebot.service" />
    

    문서에서 클래스 자동 검색 및 Bean 정의 등록에 대해 자세히 알아보십시오.

  3. from https://stackoverflow.com/questions/11332289/spring-expected-at-least-1-bean-which-qualifies-as-autowire-candidate-for-this-d by cc-by-sa and MIT license