programing

외부 항아리에서 만든 봄콩을 @자동 배선하려면 어떻게 해야 합니까?

elecom 2023. 8. 6. 09:50
반응형

외부 항아리에서 만든 봄콩을 @자동 배선하려면 어떻게 해야 합니까?

유틸리티 라이브러리로 생성하여 사용 중인 모듈/병이 있습니다.나는 거기서 다음과 같은 서비스를 만들었습니다.

@Service
public class PermissionsService { ... }

여기서 com.in.architect.permissions라는 패키지에 위치하며 메인 애플리케이션에서 이 jar를 참조/로드합니다(즉, 앱의 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: "org.springframework"에 대한 빈이 없다고 불평합니다.콩 공장콩의 정의 없음예외:유형의 자격 있는 콩이 없습니다..."

그럼, 어떻게 하면 lib의 콩을 내 애플리케이션으로 가져올 수 있을까요?분명히 방법이 있습니다.라이브러리를 완전한 스프링 MVC 애플리케이션으로 설정해야 작동할 수 있습니까? 즉, lib에도 @Configuration 및 @ComponentScan 설정이 있어야 합니까?

주입할 클래스가 포함된 패키지 이상을 스캔해야 합니다.예를 들어 스프링 4 주석의 경우:

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

XML 구성과 동일한 원리입니다.

이것에 대한 메모일 뿐입니다. 하지만 당신은 봄과 당신의 의존성을 분리할 수 있습니다.당신의@Configuration클래스 만들기

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

이렇게 하면 주입할 수도 있습니다.스프링 주석을 제거해야 하는 것이 아니라 스프링 주석을 사용할 수 있는 옵션입니다.

네 - 저도 정확히 같은 문제가 있었습니다 - 저는 외부 jar에서 mongodb 저장소 인터페이스를 자동 배선하고 싶었습니다.

  • 나는 그 병에서 모든 콩을 자동 배선할 수 있습니다.

    @SpringBootApplication(scanBasePackages = {"com.myrootpackage"})

  • 그러나 - 인터페이스 자동 배선이 항상 "블라블라를 찾을 수 없습니다.."

하지만 인터페이스는 제가 가져올 수 있는 콩과 같은 패키지에 있었습니다.몽고드브 인터페이스를 검색하는 것은 @SpringBootApplication의 scanBasePackages를 고려하지 않는 것으로 나타났습니다!

다음을 통해 명시적으로 구성해야 합니다.

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

또는 기본 검색이 mongo 인터페이스에서도 작동하도록 main 클래스를 "up"으로 이동할 수 있습니다.그래서 저는 문제를 이해하고 해결책을 찾았습니다.하지만 동일한 룩업 경로를 두 번 구성해야 하기 때문에 여전히 조금 불만입니다.저는 솔직히 바보같습니다.

다른 프로젝트 종속성에서 다른 클래스를 검색하는 동안 동일한 문제가 발생했습니다. 검색 솔루션은 다음과 같이 검색해야 하는 클래스 유형에 따라 다릅니다.

정상인 경우 @Component, @Service 주석 사용

@ComponentScan({"com.mypackge1","com.mypackage2"})

클래스 유형이 엔티티에 기반한 도메인 개체인 경우 사용

@EntityScan("com.mypackge1.domain")

JPA 리포지토리 클래스인 경우

@EnableJpaRepositories(basePackages = {"com.mypackage.repository"})

Redis 리포지토리 클래스가 사용하는 경우

@EnableRedisRepositories(basePackages = {"com.mypackage.repository"})

Mongo 등도 마찬가지입니다.

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

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

이렇게 하면 사용자가 정의한 com.inin.architect.permissions에서 bone을 자동으로 연결할 수 있습니다.

언급URL : https://stackoverflow.com/questions/29571304/how-can-i-autowire-a-spring-bean-that-was-created-from-an-external-jar

반응형