외부 항아리에서 만든 봄콩을 @자동 배선하려면 어떻게 해야 합니까?
유틸리티 라이브러리로 생성하여 사용 중인 모듈/병이 있습니다.나는 거기서 다음과 같은 서비스를 만들었습니다.
@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
'programing' 카테고리의 다른 글
| 어떻게 CSS가 (자바스크립트가 아닌) 문자열로 시작하는 ID를 선택하도록 합니까? (0) | 2023.08.06 |
|---|---|
| Powershell의 람다 식 (0) | 2023.08.06 |
| 검색 엔진 - Lucene 또는 Solr (0) | 2023.08.06 |
| '서버를 사용할 수 없습니다' 서버의 MSDTC (0) | 2023.08.06 |
| 테이블에 값 삽입 Oracle SQL (0) | 2023.08.06 |