SpringBoot 시작 클래스 의 스 캔 주해 의 용법 및 충돌 원칙 을 자세히 설명 합 니 다.

배경
SpringBoot 시작 클래스 에서 스 캔 패키지 경 로 를 설정 하 는 데 세 가지 방법 이 있 습 니 다.최근 에 한 응용 프로그램 에서 세 가지 주 해 를 모두 사용 하 는 것 을 보 았 습 니 다.코드 는 다음 과 같 습 니 다.

@SpringBootApplication(scanBasePackages ={"a","b"})
@ComponentScan(basePackages = {"a","b","c"})
@MapperScan({"XXX"})
public class XXApplication extends SpringBootServletInitializer 
}
그렇다면 의문 이 생 겼 다.SpringBoot 에서 이 세 가지 주 해 는 발효 우선 순위 가 어 떻 습 니까?첫 번 째 와 두 번 째 는 차이 가 있 습 니까?본문 은 이 세 개의 주해 의 주의사항 을 정리 하 였 다.
SpringBootApplication 주석
이것 은 SpringBoot 의 주해 이 며,본질은 세 개의 Spring 주해 의 합 이다.
  • @Configuration
  • @EnableAutoConfiguration
  • @ComponentScan
  • 이것 은 기본적으로 시작 클래스 가 있 는 패키지 와 모든 하위 패 키 지 를 검색 하지만 제3자 jar 패키지 의 다른 디 렉 터 리 는 포함 되 지 않 습 니 다.scanBasePackages속성 을 통 해 패키지 경 로 를 다시 설정 할 수 있 습 니 다.
    메모:jar 패키지 에 의존 하 는 주 해 를 스 캔 해 야 합 니 다.가방 에 의존 하 는 경로 와 SpringBoot 시작 경로 에 포함 되 지 않 으 면 제3자 패 키 지 를 스 캔 하 는 주 해 를 단독으로 사용 해 야 합 니 다.이 주석 이 있 으 면 기본 스 캔 패키지 가 효력 을 잃 기 때문에 이 프로젝트 의 스 캔 경 로 를 지정 해 야 합 니 다.
    예 를 들 어 이 프로젝트:
     
    SpringBoot 시작 클래스 의 프로젝트 디 렉 터 리 는@ComponentScan이 며,인 용 된 제3자 공공 패키지cn.com.a.b의 디 렉 터 리 도xxx.common.jar입 니 다.그러면 제3자 jar 패키지 의 주 해 는 천연 적 으로 스 캔 될 수 있 습 니 다.다른 jar 가방 에 주석 이 있 으 면 검색 할 수 없습니다.
    ComponentScan 주석
    이것 은 Spring 프레임 워 크 의 주석 입 니 다.구성 요소 스 캔 경 로 를 지정 하 는 데 사 용 됩 니 다.이 주석 을 사용 하면 전체 프로젝트 에서 스 캔 해 야 할 경 로 를 모두 포함 해 야 합 니 다.기본 검색 경 로 를 덮어 쓰기 때문에 효력 을 잃 습 니 다.
    실효 표현 은 두 가지 가 있 습 니 다.
    첫째,cn.com.a.b한 값 만 포함 하고 기본 시작 클래스 디 렉 터 리 입 니 다.SpringBootApplication효력 이 발생 하면ComponentScan주석 이 효력 을 잃 고 오 류 를 보고 합 니 다.
     
    둘째,SpringBootApplication여러 개의 구체 적 인 하위 디 렉 터 리 를 지정 하면 이때ComponentScan가 효력 을 잃 고,Spring 은 지정 한 디 렉 터 리 의 주석 만 스 캔ComponentScan합 니 다.디 렉 터 리 밖의 Controller 류 가 있 으 면 안 타 깝 게 도 이 컨트롤 러 들 은 접근 할 수 없습니다.
    시작 코드 로 돌아 가기:
    
    @SpringBootApplication(scanBasePackages ={})
    @ComponentScan(basePackages = {})
    여기에SpringBootApplication주 해 를 지정 하면ComponentScan효력 을 잃 는 다.따라서ComponentScanscanBasePackages값 이ComponentScan즉 시작 클래스 가 있 는 가방 을 포함 하지 않 고 제3자 jar 의 디 렉 터 리 만 지정 하면 이 프로젝트 의 어떠한 주해 도 스 캔 할 수 없습니다.
    MapperScan 주석
    이것 은 MyBatis 의 주해 입 니 다.지 정 된 디 렉 터 리 에 있 는 모든 DAO 클래스 를 MyBatisbasePackages클래스 로 봉 한 다음 Spring 용기 에 주입 합 니 다.추가 주해 없 이 주입 이 완 료 됩 니 다.
    계시 록
    SpringBoot 패키지 스 캔 경로,두 주해 의 충돌 행 위 를 반복 적 으로 검 증 했 지만 합 리 적 인 해석 을 찾 지 못 했 습 니 다.이 글 은 초고 함 에서 거의 2 주 동안 준비 되 어 줄곧 방치 되 어 있다.
    오늘 두 사람 이 동시에 사용 할 때cn.com.a.b효력 을 잃 는 다 는 글 을 찾 아 봄 부 트 스 캔 경로 에 대한 의혹 이 사 라 졌 다.
    여기 서 SpringBoot 시작 류 의 스 캔 주 해 를 상세 하 게 설명 하 는 용법 과 충돌 원칙 에 관 한 글 은 여기까지 입 니 다.더 많은 SpringBoot 시작 류 스 캔 주 해 는 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 관심 을 가 져 주 십시오!

    좋은 웹페이지 즐겨찾기