복붙노트

[SPRING] @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

SPRING

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

나는 내가 만든 모듈과 util 라이브러리를 사용하고있다. 나는 거기에 이렇게 서비스를 만들었습니다 :

@Service
public class PermissionsService { ... }

... 여기에 패키지에있는 곳 : com.inin.architect.permissions와 내 주요 응용 프로그램에서이 항아리를 참조 /로드하고 있습니다 (예 : 응용 프로그램의 Maven POM.xml 파일에 종속성으로 설정). 그래서:

<dependency>
        <groupId>com.inin.architect</groupId>
        <artifactId>permissions</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

응용 프로그램 내에서 다음과 같은 서비스를 사용하고 싶습니다.

@Autowired
PermissionsService permissions

응용 프로그램의 봄 설정에서, 나는 이것을 가지고있다 :

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.inin.generator", "com.inin.architect.permissions" })
public class WebConfig extends WebMvcConfigurerAdapter implements ServletContextAware { }

그러나 Tomcat에서 응용 프로그램을 실행할 때 PermissionsService에 대한 bean이 없다는 오류가 발생합니다. "org.springframework.beans.factory.NoSuchBeanDefinitionException : 유형의 정규화 된 Bean 없음 ..."

그렇다면 lib에서 응용 프로그램으로 Bean을 가져 오는 방법은 무엇입니까? 분명히 방법이 있습니다. 이 라이브러리가 완전히 작동하는 스프링 MVC 애플리케이션으로 설정해야합니까? 즉 lib에 @Configuration과 @ComponentScan 설정이 있어야합니까?

해결법

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

    1.적어도 주사하고자하는 클래스가 들어있는 패키지를 스캔해야합니다. 예를 들어, Spring 4 주석 :

    적어도 주사하고자하는 클래스가 들어있는 패키지를 스캔해야합니다. 예를 들어, Spring 4 주석 :

    @Configuration
    @ComponentScan("com.package.where.my.class.is")
    class Config {
    ...
    }
    

    XML 구성에서도 마찬가지입니다.

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

    2.이것에 대한 메모 만 있지만, 봄부터 의존성을 분리 할 수 ​​있습니다. @Configuration 클래스에서 create

    이것에 대한 메모 만 있지만, 봄부터 의존성을 분리 할 수 ​​있습니다. @Configuration 클래스에서 create

    @Bean public PermissionsService  permissionsService(){
       return new PermissionsService()
    }
    

    이것은 또한 주입 될 수 있습니다. 스프링 애노테이션을 삭제해야하는 것은 아니며, 스프링 외부에서 잠재적으로 사용할 수있는 옵션 일뿐입니다.

  3. ==============================

    3.주 응용 프로그램 내부에서 다음과 같은 방식으로 com.inin.architect.permissions에 대한 application-context.xml을 가져올 수 있습니다.

    주 응용 프로그램 내부에서 다음과 같은 방식으로 com.inin.architect.permissions에 대한 application-context.xml을 가져올 수 있습니다.

    <import resource="classpath:/permissionApplicationContext.xml" />
    

    이렇게하면 정의한 com.inin.architect.permissions에서 bean을 autowire 할 수 있습니다.

  4. ==============================

    4.좋아, 나는 똑같은 문제가 있었다. 나는 외부 항아리로부터 mongodb 저장소 인터페이스를 autowire하고 싶었다.

    좋아, 나는 똑같은 문제가 있었다. 나는 외부 항아리로부터 mongodb 저장소 인터페이스를 autowire하고 싶었다.

    그러나 인터페이스는 가져올 수있는 콩과 같은 패키지에 있습니다. mongo db 인터페이스를 검색하는 것은 @SpringBootApplication에서 scanBasePackages를 고려하지 않는 것으로 나타났습니다!

    를 통해 명시 적으로 구성되어야합니다.

    @EnableMongoRepositories(basePackages = {"com.myrootpackage"})
    

    또는 mongo 인터페이스에서도 기본 검색이 작동하도록 기본 클래스를 "위로"이동할 수 있습니다. 그래서 문제를 이해하고 해결책을 찾았습니다. 그러나 나는 동일한 조회 경로를 두 번 구성해야하기 때문에 여전히 불행하다. 솔직히 바보 같아.

  5. from https://stackoverflow.com/questions/29571304/how-can-i-autowire-a-spring-bean-that-was-created-from-an-external-jar by cc-by-sa and MIT license