서로 다른 메이븐 모듈의 구성 요소 스캔/JSpring Boot 어플리케이션의 AR
메이븐 2번「이라고 불리는 첫 「어플리케이션」이라고 불리는 것으로, 「어플리케이션」에는, 「어플리케이션」이 .spring boot
다음 행만 포함하는 응용 프로그램클래스
package org.example.application;
@SpringBootApplication
@ComponentScan({"org.example.model", "org.example"})
public class Application {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Application.class, args);
}
}
및 「」를 참조해 주세요.org.example.application
, , , , , , , , , 。RestController
쓰입니다.Component
다음에 설명된 다른 Maven 모듈의 구성 요소를 사용합니다.
다른 모듈에는 '이 포함되어 있습니다.spring boot
이러한 첫 모듈과 있습니다(Maven 모듈).org.example
그 에서는 (「」와 org.example.model.entities
,org.example.model.repositories
syslog.
흐름은 다음과 같습니다.
모듈 " " "application
org.package:
SpringBootApplication -> RestController -> MyComponent
해야 할 .MyComponent
에 있는 사람들입니다.model
"" ( 내)org.example.model
그러나 응용 프로그램을 시작할 때 다음과 같은 오류가 발생합니다.
***************************
APPLICATION FAILED TO START
***************************
Description:
Field myRepository in org.example.MyComponent required a bean of type 'org.example.model.repositories.MyRepository' that could not be found.
Action:
Consider defining a bean of type 'org.example.model.repositories.MyRepository' in your configuration.
org.example.model.repositories.MyRepository
「Maven」 「model」 「Spring Boot Application」 「Maven」(스프링·부트·애플리케이션」
것처럼 컴포넌트를 하려고 했습니다 」 「 」 「 」 「 」 「 」 「 」@ComponentScan({"org.example.model", "org.example"})
지지 、 움움움도도도 。
그래서 내가 뭘 잘못했나요?
「왜, 「」라고 하는가?」입니다.@ComponentScan
의 목적의 @SpringBootApplication
컴포넌트 스캔을 유효하게 하는 것이 있습니까?
Spring Boot 매뉴얼에서 :
@SpringBootApplication
은 '주석'을 사용하는 것과 .@Configuration
,@EnableAutoConfiguration
★★★★★★★★★★★★★★★★★」@ComponentScan
Application 에서 Spring Boot Application을 에 유의하십시오.@ComponentScan
을 basePackages
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .basePackages
로는 " " 가 합니다.@SpringBootApplication
이 패키지는 클래스가 상주하는 현재 패키지입니다.따라서 Spring Boot Application 클래스의 패키지와 누락된 추가 패키지를 모두 기본 패키지로 사용하려면 이러한 패키지를 명시적으로 설정해야 합니다.
말고.basePackages
재적 so so so so so so so so locating locating locating locating locating locating locating locating locating locating locating에 있는 클래스에 대해 ."org.example"
★★★★★★★★★★★★★★★★★」"org.example.model"
"" 지정, """org.example"
"org.example.model"
그 하위 항목입니다.
시험해 보세요.
@SpringBootApplication(scanBasePackages={"org.example"})
또는 다음 중 하나:
@SpringBootApplication
@ComponentScan("org.example")
스프링 부트 응용 프로그램에서 @EnableJpaReposities/@ComponentScan/scanBasePackages를 지정하는 경우
Spring Boot 어플리케이션 레이아웃을 설계할 때는 다음 두 가지 경우가 있습니다.
1) Spring Boot의 자동 구성을 제공하는 패키지 레이아웃을 사용하는 경우(필요한 경우).
요약하면: 당신의 수업에 스프링빈 고정관념이 있는 경우:@Component
,@Repositories
,@Repositories
,...는 Spring Boot Application 클래스의 같은 패키지 또는 서브패키지에 있으며 선언만 합니다.@SpringBootApplication
필요한 건 이것뿐이에요
2) Spring Boot의 자동 구성을 제로 구성으로 제공하는 패키지 레이아웃을 사용하지 않는 경우(피해야 함).
이는 일반적으로 검색 대상 클래스가 해당 클래스의 패키지(또는 하위 패키지)에 포함되지 않은 것을 의미합니다.@SpringBootApplication
.
이 경우,scanBasePackages
속성 또는 추가@ComponentScan
검색할 패키지를 지정합니다.
또한 저장소가 클래스의 패키지 또는 하위 패키지에 포함되지 않은 경우,@SpringBootApplication
, 다음과 같은 다른 사항을 선언해야 합니다.@EnableJpaRepositories(="packageWhereMyRepoAreLocated")
다음은 이 부품에 대한 문서입니다(강조사항은 제 것입니다).
80.3 스프링 데이터 저장소 사용
Spring Data는 다양한 종류의 @Repository 인터페이스를 구현할 수 있습니다.이러한 @Repository가 @Enable의 동일한 패키지(또는 서브 패키지)에 포함되어 있는 한 스프링 부트에서는 이 모든 것이 처리됩니다.AutoConfiguration 클래스
많은 어플리케이션에서 필요한 것은 클래스 패스에 적절한 Spring Data 의존관계를 설정하고(JPA의 경우 spring-boot-starter-data-jpa, Mongodb의 경우 spring-boot-starter-data-mongodb), @Entity 객체를 처리하는 저장소 인터페이스를 만드는 것입니다.예를 들어 JPA 샘플과 Mongodb 샘플에 있습니다.
Spring Boot은 @Enable을 기반으로 @Repository 정의 위치를 추측을 시도합니다.검출된 AutoConfiguration.제어력을 높이려면 스프링 데이터 JPA에서 @EnableJpaRepository 주석을 사용하십시오.
예
1) Spring Boot의 자동 구성을 제공하는 패키지 레이아웃을 사용하는 경우(필요한 경우).
Spring Boot org.example
, and classs included가 같은 되어 있습니다.org.example
Boot 으로 충분합니다.Spring Boot 。
package org.example;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Application.class, args);
}
}
저장소는 다음 위치에 있을 수 있습니다.org.example.repository
such음음 package package package 。
package org.example.repository;
@Repository
public interface FooRepository extends JpaRepository<Foo, Long>, { }
그리고.
package org.example.repository;
@Repository
public interface BarRepository extends JpaRepository<Bar, Long>, { }
는 트음음음음음음음음음음 the the the the the 에 있을 수 .org.example.controller
패키지:
package org.example.controller;
@RestController
@RequestMapping("/api/foos")
public class FooController {...}
그래서...
2) Spring Boot의 자동 구성을 제로 구성으로 제공하는 패키지 레이아웃을 사용하지 않는 경우(피해야 함).
Spring Boot org.example.application
package 콩 포함)가로 선언되는 것은 .org.example.application
Boot과 같은 선언이 필요합니다.Spring Boot 어음음 、 Spring Boot 。
package org.example.application;
@SpringBootApplication(scanBasePackages= {
"org.example",
"org.thirdparty.repository"})
@EnableJpaRepositories("org.thirdparty.repository")
public class Application {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Application.class, args);
}
}
그리고 콩 클래스는 다음과 같을 수 있습니다.
수 는 "JAR"에 .org.thirdparty.repository
such음음 package package package 。
package org.thirdparty.repository;
@Repository
public interface FooRepository extends JpaRepository<Foo, Long>, { }
그리고.
package org.thirdparty.repository;
@Repository
public interface BarRepository extends JpaRepository<Bar, Long>, { }
는 트음음음음음음음음음음 the the the the the 에 있을 수 .org.example.controller
패키지:
package org.example.controller
@RestController
@RequestMapping("/api/foos")
public class FooController {...}
그래서...
결론: Spring Boot 어플리케이션을 네임스페이스의 기본 패키지에 정의하면 Spring Boot 설정을 최대한 단순화할 수 있습니다.
언급URL : https://stackoverflow.com/questions/41430051/scan-components-of-different-maven-modules-jars-in-a-spring-boot-application
'programing' 카테고리의 다른 글
selectOneMenu ajax 이벤트 (0) | 2023.03.25 |
---|---|
Angularjs - 인수를 디렉티브로 전달합니다. (0) | 2023.03.25 |
SQL Server 2016에서 json 어레이 길이를 가져옵니다. (0) | 2023.03.25 |
새로 고치지 않고 페이지의 데이터 업데이트 (0) | 2023.03.25 |
AngularJS - 지시사항을 지정하는 요소를 동적으로 작성합니다. (0) | 2023.03.25 |