Spring Boot 2 자동 구성 원리

목차

1. @AutoConfigurationPackage 주석의 기능은 무엇입니까?

2. @Import(AutoConfigurationImportSelector.class)는 무엇을 하나요?

3. Spring MVC는 Spring Boot에서 자동 구성을 어떻게 구현합니까?


Spring Boot를 사용하고 잘 생긴 사람 이라면 애플리케이션의 시작 클래스에 @SpringBootApplication 주석 이 있는 한 Spring Boot 애플리케이션이며 필요한 bean이 자동으로 구성된다는 것을 알고 있습니다 . 넌 어떻게 그걸 했니?

유일한 단서는 @SpringBootApplication 주석 자체입니다. Ctrl + 클릭하여 이 주석을 열면 3개의 다른 주석이 첨부된 것을 볼 수 있습니다(@Target 및 기타 메타 주석 제외). 그 중 하나는 @EnableAutoConfiguration이 연구하려는 자동 구성과 관련되어 있으며 자동 전체 프로젝트 스위치의 구성.

이 주석은 자동 구성을 어떻게 활성화합니까? 계속해서 Ctrl + 클릭하여 @EnableAutoConfiguration 주석을 열면 두 개의 주석이 첨부된 것을 볼 수 있습니다.

그 안에 비밀이 있는 것 같으니 이 두 주석을 주의 깊게 연구해야 합니다 . 첫 번째 것을 확인하십시오!

1. @AutoConfigurationPackage 주석의 기능은 무엇입니까?

이 주석을 클릭하면 그 위에 아무것도 없지만 AutoConfigurationPackages.Registrar라는 내부 클래스를 가져오는 것을 볼 수 있습니다.

Registrar 클래스를 클릭하고 Spring 프레임워크의 ImportBeanDefinitionRegistrar 인터페이스를 구현하는 것을 찾으십시오. 그런 다음 구현하는 registerBeanDefinitions()는 시작 시 Spring에 의해 호출됩니다. register() 메소드는 registerBeanDefinitions()에서 호출되어 메소드 이름이 무엇을 등록하는지 확인합니다. >_>

register() 메서드의 까다로운 작업을 살펴보세요. 이 코드를 이해할 수 없습니까? 디버그하려면 여기에 중단점을 만들어야 합니다.

이 코드를 보고 코드를 통해 Bean을 생성하고 Type은 BasePackage(기본 패키지)이고 이 프로젝트의 기본 패키지 이름을 cn.itrip으로 설정하고 마지막으로 Bean을 Spring IoC 컨테이너에 등록하면 해당 Bean의 이름은 org입니다. .springframework.boot.autoconfigure.AutoConfigurationPackages. 사실 이것은 Spring에서 Bean을 IoC 컨테이너에 등록하는 또 다른 방법으로 클래스에 @Service 및 @Component 주석을 추가하는 것과 동일한 효과가 있습니다.

요약하면 @AutoConfigurationPackage 주석의 주요 목적은 자동 구성이 필요한 패키지 모음에 cn.itrip 패키지를 추가하는 것입니다. Spring Boot 프로젝트의 시작 클래스가 있는 동일한 수준의 패키지가 여기에 추가된 항목인 Bean을 자동으로 구성하는 것은 놀라운 일이 아닙니다.

2. @Import(AutoConfigurationImportSelector.class)는 무엇을 하나요?

먼저 Spring 프레임워크에서 제공하는 ImportSelector 인터페이스가 @Configuration 주석이 달린 클래스를 선택적으로 가져오기 위해 사용된다는 것을 이해해야 합니다. 여기에서 가져온 AutoConfigurationImportSelector 클래스는 ImportSelector 인터페이스를 구현하므로 해당 process()는 시작 시 Spring 프레임워크에 의해 호출됩니다.

위의 디버깅 스크린샷을 보면 왼쪽 하단이 스레드 스택의 호출 경로이고 호출 순서는 process() -> getAutoConfigurationEntry() -> getCandidateConfigurations()입니다. 우리는 중간에 무슨 일이 일어나든 상관하지 않지만 getCandidateConfigurations() 메서드에 도달하면 여기에 Assert 어설션이 있음을 볼 수 있고 오류 메시지는 자동 구성 클래스를 META에서 찾을 수 없다고 말합니다. INF/spring.factories 파일.

이 메서드를 더 추적하면 SpringFactoriesLoader.loadFactoryNames() -> loadSpringFactories()를 호출하고 실제로 META-INF/spring.factories에 로드합니다. 이 파일 안에 있는 보물은 무엇입니까? 이 파일을 열고 살펴보십시오. Spring Boot의 자동 구성 jar 패키지에 있습니다.

spring.factories 파일에는 Spring이 통합할 수 있는 다양한 모듈, 타사 프레임워크 또는 미들웨어의 자동 구성 클래스가 나열되어 있고 클래스 이름이 모두 Xxx AutoConfiguration 형식임을 알 수 있습니다 . 이러한  Xxx 자동 구성은 실제로 동일한 jar 패키지에 있으며 가져온 모듈 및 타사 프레임워크에 대한 bean의 자동 구성을 담당합니다.

이를 수행하는 방법은 웹 프로젝트에서 일반적으로 사용되는 SpringMVC 프레임워크를 예로 들어 보겠습니다.

3. Spring MVC는 Spring Boot에서 자동 구성을 어떻게 구현합니까?

Spring Boot에서 Spring MVC 프레임워크를 사용하려면 spring-boot-starter-web starter만 가져오면 됩니다. 기존의 Spring XML은 너무 많은 bean을 구성해야 하고 더 이상 구성할 필요가 없으므로 자동 구성의 이유입니까? 이전 섹션에 따르면 먼저 spring.factories 파일에서 웹의 자동 구성과 나열된 자동 구성 클래스를 살펴보십시오.

경험에 따르면 이름을 보고 먼저 추측해 보면 Spring MVC의 프런트 엔드 컨트롤러 DispatcherServlet은 위의 빨간색 상자에 있는 첫 번째 DispatcherServletAutoConfiguration 클래스에 의해 생성되어야 합니다. 확인하려면 DispatcherServletAutoConfiguration 클래스를 열고 살펴보십시오.

가장 먼저 보게 되는 것은 클래스에 대한 몇 가지 주석입니다.

  • @AutoConfigurationOrder 주석은 먼저 실행되는 실행 순서를 지정합니다.
  • @Configuration 어노테이션은 이 클래스가 @Bean으로 다양한 팩토리 메소드를 정의하는 데 사용될 수 있음을 나타냅니다.
  • @ConditionOnWebApplication 주석은 이 클래스의 Bean이 웹 프로젝트 환경에서만 구성됨을 나타냅니다.
  • @ConditionOnClass(DispatcherServlet.class)는 이 클래스의 Bean이 Spring MVC 패키지의 종속성을 가져오는 경우에만 구성됨을 나타냅니다(DispatcherServlet 클래스는 클래스 경로에서 검색할 수 있음).
  • @AutoConfigureAfter 주석은 이 클래스의 Bean을 구성하기 위해 먼저 ServletWebServerFactoryAutoConfiguration 클래스의 Bean을 생성해야 함을 지정합니다.

위 코드의 상수에서 알 수 있듯이 자동으로 구성된 전면 컨트롤러, IoC 컨테이너의 Bean 이름을 dispatcherServlet이라고도 합니다.

물론  WebMvcAutoConfiguration 클래스인 Spring MVC의 자동 구성에 대해 언급해야 할 또 다른 클래스가 있습니다. 기존 Spring MVC가 xml에서 구성해야 하는 뷰 파서 및 메시지 변환기와 같은 빈은 모두 이 자동 구성 클래스에서 생성됩니다.

매일 코드를 작성하는 것은 지루합니다. WeChat 비디오 계정으로 함께 놀자!

 

추천

출처blog.csdn.net/liudun_cool/article/details/108193207