>  기사  >  Java  >  SpringBoot 자동 구성의 구현 원리는 무엇입니까?

SpringBoot 자동 구성의 구현 원리는 무엇입니까?

WBOY
WBOY앞으로
2023-05-15 15:58:065238검색

1. springboot 자동 구성이란 무엇입니까?

SpringBoot는 @EnableAutoConfiguration 주석을 통해 자동 구성을 활성화하고 jar 패키지 아래의 spring.factories 파일을 검색합니다. 이 파일에는 @Condition 주석이 충족될 때 자동으로 구성될 수 있는 클래스가 포함되어 있습니다. , 조건이 충족되면 종속성 지원을 통해 인스턴스화되고 Spring 컨테이너에 등록됩니다.

평론적으로 말하자면, 이전에 ssm 프로젝트를 작성할 때 프로젝트 개발에서 환경 설정 과정에 많은 시간이 걸렸다는 점입니다. 다양한 xml 구성 콘텐츠를 단순화합니다. 따라서 springboot의 자동 구성은 주석을 사용하여 일부 공통 구성에 대한 기본 구성을 만들고 xml 구성 콘텐츠를 단순화하여 프로젝트를 빠르게 실행할 수 있습니다.

springboot 핵심 구성 원칙:

  • 자동 구성 클래스는 spring-boot-autoconfigure-version number.jar 아래 org.springframework.boot.autoconfigure에 저장됩니다.jar

  • application.properties =true에서 디버그를 구성할 때 그리고 컨테이너를 시작합니다. 서버 초기화의 초기 구성을 볼 수 있습니다

  • DispatcherServletAutoConfigratio 프런트엔드 컨트롤러 등록

  • EmbeddedServletContainerAutoConfiguration 컨테이너 유형 등록

  • HttpMessageConvertersAutoConfiguration json 또는 xml 프로세서 등록

  • Jack sonAutoConfiguration은 json 객체 파서를 등록합니다

  • 다른 기능에 종속성을 추가하면 springBoot는 이러한 기능의 자동 구성도 구현합니다

SpringBoot 자동 구성의 구현 원리는 무엇입니까?

2. Starter 컴포넌트

Starter 컴포넌트는 애플리케이션에 로드할 수 있는 Maven 종속성 항목입니다. Maven 구성에 해당 종속성 구성을 추가해야만 해당 Starter 구성 요소를 사용할 수 있습니다. 예를 들어, spring-boot-starter-web 종속성을 추가하면 Spring MVC 및 Tomcat 내장 컨테이너를 포함하는 REST API 서비스를 구축하는 데 사용할 수 있습니다.

완전한 Starter 컴포넌트에는 다음 두 가지 사항이 포함됩니다.

  • 자동 구성 기능을 제공하는 자동 구성 모듈

  • 컴포넌트의 모든 기능을 캡슐화하고 종속성 관리 기능을 제공하는 컴포넌트 모듈 즉시 사용할 수 있습니다.

spring-boot-starter-web은 소스 코드

package org.springframework.boot.autoconfigure.web.servlet;
@Configuration
@ConditionalOnClass({ServletRequest.class})
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@EnableConfigurationProperties({ServerProperties.class})
@Import({ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class})
public class ServletWebServerFactoryAutoConfiguration {
    ......
}
@

에 따라 다릅니다. 3. 세 가지 주요 주석

@SpringBootConfiguration: 구성에서 상속되며 구성을 위해 JavaConfig를 지원합니다.

@EnableAutoConfiguration: 이 글은 주로 자동 구성을 활성화하는 데 사용되는 설명에 중점을 둡니다.

@ComponentScan: 기본적으로 클래스의 패키지 및 하위 패키지 아래에 지정된 주석이 있는 모든 클래스를 검색하고 자동으로 조합되는 주석에는 @Controller가 포함됩니다. @Service, @Component, @Repository 등 스캔 경로도 지정할 수 있습니다.

4. @EnableAutoConfiguration

이 주석은 기본 구성을 자동으로 로드하는 데 도움이 됩니다. 여기에는 @AutoConfigurationPackage 및 @Import 주석에 대해 자세히 알아 보겠습니다.

@Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
		//检查自动配置功能是否开启,默认开启
		if (!isEnabled(annotationMetadata)) {
			return NO_IMPORTS;
		}
		//加载自动配置的元信息
		AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
				.loadMetadata(this.beanClassLoader);
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
		//获取候选配置类
		List<String> configurations = getCandidateConfigurations(annotationMetadata,
				attributes);
		//去掉重复的配置类
		configurations = removeDuplicates(configurations);
		//获得注解中被exclude和excludeName排除的类的集合
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		//检查被排除类是否可实例化、是否被自动注册配置所使用,不符合条件则抛出异常
		checkExcludedClasses(configurations, exclusions);
		//从候选配置类中去除掉被排除的类
		configurations.removeAll(exclusions);
		//过滤
		configurations = filter(configurations, autoConfigurationMetadata);
		//将配置类和排除类通过事件传入到监听器中
		fireAutoConfigurationImportEvents(configurations, exclusions);
		//最终返回符合条件的自动配置类的全限定名数组
		return StringUtils.toStringArray(configurations);

@Import(AutoConfigurationImportSelector.class) 주석을 사용하려면 여기에서 AutoConfigurationImportSelector 클래스를 가져오세요. 이 클래스에는 매우 중요한 메소드인 selectImports()가 있는데, 이는 후보 구성 클래스 획득, 구성 클래스 중복 제거, 불필요한 구성 클래스 제외, 필터링 등을 포함하여 구성 요소 자동 조립의 거의 모든 처리 논리를 다루고 있습니다. 정규화된 자동 구성 클래스의 정규화된 이름이 반환됩니다.

5. SpringFactoriesLoader

SpringFactoriesLoader 클래스는 spring-core 패키지에 정의되어 있으며 META-INF/spring.factories 파일을 검색하고 지정된 인터페이스의 구성을 가져오는 기능을 구현합니다. 이 클래스에는 두 개의 외부 메소드가 정의되어 있습니다.

  • loadFactories는 인터페이스 클래스를 기반으로 구현 클래스의 인스턴스를 가져옵니다. 이 메소드는 객체 목록을 반환합니다.

  • loadFactoryNames는 인터페이스를 기반으로 인터페이스 클래스의 이름을 가져옵니다. 이 메서드는 클래스 이름 목록을 반환합니다.

위 두 가지 방법의 핵심은 지정된 ClassLoader에서 spring.factories 파일을 얻고 이를 구문 분석하여 클래스 이름 목록을 얻는 것입니다. 구체적인 코드는 다음과 같습니다.

public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
    String factoryClassName = factoryClass.getName();
    try {
        Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
                ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
        List<String> result = new ArrayList<String>();
        while (urls.hasMoreElements()) {
            URL url = urls.nextElement();
            Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
            String factoryClassNames = properties.getProperty(factoryClassName);
            result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
        }
        return result;
    }
    catch (IOException ex) {
        throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +
                "] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
    }
}

코드에서 볼 수 있습니다. , 전체 ClassLoader는 모든 jar 패키지 아래의 spring.factories 파일 메서드에서 탐색됩니다. 즉, 다른 장소의 구성에 영향을 주거나 다른 사람의 구성으로 덮어쓰지 않고 우리 자신의 jar에서 spring.factories 파일을 구성할 수 있습니다.

spring.factories는 속성을 통해 구문 분석되므로 우리가 작성하는 파일의 내용은 다음과 같은 방식으로 설치 및 구성됩니다.

com.xxx.interface=com.xxx.classname

위 내용은 SpringBoot 자동 구성의 구현 원리는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제