Spring 과 SpringBoot 의 @ Component 와 @ Component Scan 주해 용법 소개 및 주의사항

9301 단어 자바 기술
본문 을 통 해 당신 은 배 울 것 입 니 다.
  • Component Scan 는 무엇 입 니까?
  • ComponentScan 가 중요 합 니까?
  • 프로젝트 중 Spring Boot 어떤 가방 에 대해 자동 으로 스 캔 Component Scan 을 실행 합 니까?
  • 스 캔 범 위 를 어떻게 정의 합 니까?
  • 프로젝트 시작 시 Spring Boot 에 대한 흔 한 오류
  • Component Scan
    이해 했다 면 @ComponentScan 이해 했다 ComponentScanSpring 는 주입 Spring 에 의존 하 는 프레임 이다.모든 내용 은 dependency injection 에 대한 정의 와 의존 관계 이다.
    정의 bean 의 첫 번 째 단 계 는 정확 한 주석 사용 Spring Beans 또는 @Component 또는 @Service하지만 @Repository 이 걸 어디서 찾 을 수 있 는 지 모 르 는 한 Springbean 하 는 일 은 바로 bean 어디서 찾 았 는 지 알려 주 는 것 이다 ComponentScan어떤 가방 이 스 캔 되 어야 하 는 지 정의 하 세 요.지정 하면 Spring 은 지 정 된 가방 과 하급 가방 Spring 에서 찾 습 니 다 bean.
    다음은 sub packages 프로젝트 와 비 bean 프로젝트 (예 를 들 어 간단 한 Spring Boot 또는 Spring Boot 응용) 에서 어떻게 정의 하 는 지 소개 한다 JSP/Servlet.Spring MVC 프로젝트 총화:
  • 만약 당신 의 다른 가방 이 Component Scan 주석 Spring Boot 이 있 는 가방 과 그 하급 가방 을 사용 하고 있다 면 당신 은 아무것도 하지 않 아 도 됩 니 다. @SpringBootApplication 자동 으로 다른 가방 을 모두 스 캔 해 줄 것 입 니 다
  • 만약 에 main 있 는 가방 이 있 고 app SpringBoot 없 는 가방 과 그 하급 가방 이 있다 면 수 동 으로 bean 주 해 를 달 고 그 main 있 는 가방
  • 을 지정 해 야 합 니 다.
    예 를 들 어 아래 에 정 의 된 종 류 를 보 세 요.
    package com.demo.springboot;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ConfigurableApplicationContext;
    
    @SpringBootApplication
    public class SpringbootApplication {
    
        public static void main(String[] args) {
            ApplicationContext applicationContext = 
                    SpringApplication.run(SpringbootApplication .class, args);
    
            for (String name : applicationContext.getBeanDefinitionNames()) {
                System.out.println(name);
            }
        }
    }
    

    클래스 app@ComponentScan 가방 에서 이 종 류 는 bean 주 해 를 사 용 했 습 니 다. 이 주 해 는 SpringbootApplication 자동 스 캔 가방 com.demo.springboot 과 그 하위 가방 @SpringBootApplication 을 정의 합 니 다.
    프로젝트 의 모든 클래스 가 Spring 가방 과 그 하위 가방 에 정의 된다 면 아무것도 할 필요 가 없습니다.
    그러나 만약 에 가방 com.demo.springboot 에 정 의 를 내린다 면 이 새 가방 도 스 캔 의 범위 에 포함 시 켜 야 한다. 두 가지 방안 이 이 목적 을 달성 할 수 있다.
    프로젝트 1 정의 bean이렇게 스 캔 하 는 범 위 는 전체 부모 가방 com.demo.springboot 으로 확대 된다.
    @ComponentScan(“com.demo”)
    @SpringBootApplication
    public class SpringbootApplication {
    

    방안 2 정의 각각 두 개의 가방 스 캔 com.demo.somethingelse
    @ComponentScan({"com.demo.springboot","com.demo.somethingelse"})
    @SpringBootApplication
    public class SpringbootApplication {
    

    특히 주의: 프로젝트 2 를 사용 하면 @CoponentScan(“com.demo”) 만 쓰 면 com.demo 가방 에 있 는 클래스 를 검색 할 수 없습니다. (프레임 워 크 원본 의 기본 스 캔 효과 가 잘못 되 었 습 니 다)
    @ComponentScan({“com.demo.springboot”,”com.demo.somethingelse”}) 프로젝트 는 비 @ComponentScan({"com.demo.somethingelse"}) 프로젝트 에서 스 캔 된 패 키 지 를 명시 적 으로 사용 해 야 합 니 다. com.demo.springboot 파일 을 통 해 응용 컨 텍스트 에서 정의 하거나 Spring Boot 코드 에서 응용 컨 텍스트 를 정의 할 수 있 습 니 다.
    자바 코드 방식
    @ComponentScan({"com.demo.package1","com.demo.package2"})
    @Configuration
    public class SpringConfiguration {
    

    XML 파일 방식
    <context:component-scan base-package="com.demo.package1, com.demo.package2"/>
    

    프로젝트 에서 흔히 볼 수 있 는 오류 Spring Boot 에 대한 오 류 는 프로젝트 시작 과정 에서 이러한 오 류 를 만난 적 이 있 습 니까?
    WARNING: No mapping found for HTTP request with URI [/spring-mvc/login] in DispatcherServlet with name ‘dispatcher’
    WARNING: No mapping found for HTTP request with URI [/list-todos] in DispatcherServlet with name ‘dispatcher’
    또는:
    ERROR:No qualifying bean of type [com.demo.springboot.jpa.UserRepository] found for dependency [com.demo.springboot.jpa.UserRepository]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}…
    잘못된 원인 은 모두 bean 이 Spring 에 의 해 발견 되 지 않 았 기 때 문 입 니 다. 이러한 오 류 를 만나면 검사 해 야 합 니 다.
    당신 은 클래스 에 정확 한 주석 @ComponentScan, XML, Java 또는 Component Scan 을 붙 였 습 니까?
    어떤 클래스 에 @Controller 주 해 를 사용 하면 클래스 를 만들어 야 할 때 이 주 해 된 클래스 는 후보 클래스 임 을 나타 낸다.마치 손 을 드 는 것 같다.@Repository 지정 한 가방 의 종 류 를 스 캔 하 는 데 사 용 됩 니 다.어떤 손 들 었 는 지 보 는 것 처럼.

    좋은 웹페이지 즐겨찾기