1. @SpringBootApplication 주석을 사용하여 자동 구성을 달성 할 수있는 이유는 무엇입니까?
답 : @SpringBootApplication에서는 실제로 3 개의 내부 주석이 있습니다. @enableautoconfiguration, @componentscan, @configuration. 이 기사는 주로 @enablexx 주석을 설명합니다
2. @enableautoconfiguration이 왜 사용됩니까? @ConfigurationProperties를 사용하면 .yml 또는 .properties의 구성 항목을 자동으로 가져올 수 있습니까?
답변 : @EnableAutoConfiguration 내부에서 @Import 주석이 사용됩니다. AutoConfigurationImportSelector 가져 오기 SpringBoot가 적격 구성을 IOC 컨테이너에로드 할 수 있도록 도와줍니다. 그러나 SpringFactoriesloader의 내부 사용은이를 완료하는 데 사용됩니다. Java SPI와 유사합니다.
@TARGET ({ElementType.type})@retention (retentionpolicy.runtime)@documented@inherited@autoconfigurationpackage@import ({autoconfigurationimportselector.class}) public @interface enableautoconfiguration@Import에서는 AutoConfigurationImportSelector 클래스가 실제로 가져 오는 것을 볼 수 있습니다. 가장 중요한 것은이 클래스가 인터페이스 importselector를 구현한다는 것입니다.
public interface importselector { /** * importing@{@link configuration} 클래스의 {@link annotationmetadata}를 기반으로 클래스 (ES)의 이름을 선택하고 반환합니다. */ string [] selectImports (AnnotationMetadata importingClassMetadata);}이것은 importselector의 설명입니다.이 방법은이 방법으로 반환 된 Bean이 스프링에 의해 자동으로 주입되고 관리되는 것을 의미합니다.
다음으로 AutoConfigurationImportSelector에서 SELECTIMPORTS 구현을 살펴 보겠습니다.
public String [] selectImports (AnnotationMetadata AnnotationMetadata) {if (! this.isenabled (annotationmetadata)) {return no_imports; } else {autoconfigurationMetadata autoconfigurationMetadata = autoconfigurationMetAdataloader.loadMetadata (this.BeanClassLoader); AnnotationAttributes 속성 = this.getAttributes (AnnotationMetadata); list <string> configurations = this.getCandidAteConfigUrations (AnnotationMetadata, Attributes); 구성 = this.removedUplicates (구성); set <string> 제외 = this.getexClusions (AnnotationMetadata, Attributes); this.CheckExCludedClasses (구성, 제외); configurations.removeall (제외); 구성 = this.filter (구성, AutoConfigurationMetadata); this.fireautoconfigurationImportevents (구성, Excclusions); Return StringUtils.toStringArray (구성); }}코드는 매우 명확하게 작성됩니다. 나는 그것을 설명하지 않을 것이다.
@Import에서는 링크가 importBeanDefinitionRegistrar를 가리키는 것을 알 수 있습니다. 이것은 또한 인터페이스이며 그 기능은 importselector와 동일합니다.
공개 인터페이스 importBeanDefinitionRegistrar {public void RegisterBeanDefinitions (AnnotationMetadata importingclassmetadata, beandefinitionregistry 레지스트리);}RegisterBeendeFinitions 방법에서는 BeanDefinitionRegistry를 사용하여 주입하려는 Bean을 주입 할 수 있습니다.
Code example:
@Import를 사용하여 나만의 @enable을 작성하십시오
1. 2 개의 테스트 빈을 만듭니다
공개 클래스 역할 {} 공개 클래스 사용자 {}2. 사용 주석 활성화를 사용자 정의하십시오
@TARGET ({ElementType.type})@retention (retentionpolicy.runtime)@documented@import (myenableautoconfig.class) public @interface enablebean {}3. 자신의 enableautoconfiguration 클래스를 구현하십시오
공개 클래스 MyEnableAutoConfig importSelector {@Override public String [] selectImports (annotationMetAdata importingClassMetadata) {return new String [] { "com.xhn2.role", "com.xhn2.user"}; }}4. 시작 클래스를 작성하십시오
@enablebean@componentscan ( "com.xhn2") public class main {public static void main (string [] args) {configurableApplicationContext context = springApplication.run (main.class, args); System.out.println (context.getBean (user.class)); System.out.println (Context.getBean (역할 .class)); }}5. 운영 결과
com.xhn2.user@496bc455
com.xhn2.role@59402b8f
콘솔은 성공적으로 인쇄합니다.
코드 예제 2, 타사 항아리 패키지의 자동 조립품
새로운 Maven 프로젝트
1. pom.xml
<modeversion> 4.0.0 </modelversion> <groupid> org.csp </groupid> <artifactid> hello </artifactid> <bersion> 1.0.0 </version> <properties> <maven.compiler.source> 1.8 </maven.compiler.source> <maven.compiler> 1.8 </maven.tareter <project.build.sourceencoding> utf-8 </project.build.build.sourceencoding> </properties> <pectioniles> <pectionement> <groupid> org.springframework </groupid> <artifactid> spring-context </artifactid> <bersion> 4.3.17.release> </dependence>
2. 구성을 쓰십시오
@ConfigurationPublic Class MyTest {@Bean Public Runnable Runnable () {return ()-> {}; }}리소스 아래에 새 메타 -inf/spring.cring.factories 파일을 만들고 다음 구성을 추가하십시오.
org.springframework.boot.autoconfigure.enableautoconfiguration = com.edu.mytest
3. 프로젝트 설치 로컬 Maven 저장소 : MVN 설치
4. 주요 프로젝트는 방금 해당 지역에 설치된 항아리를 소개합니다.
<pectionency> <groupid> org.csp </groupid> <trifactid> hello </artifactid> <bersion> 1.0.0 </version> </fectionency>
5. 지금 런닝 가능한 구성을 받으십시오
@SpringBootApplicationPublic Class Main {public static void main (String [] args) {SpringApplication Application = New SpringApplication (main.class); configurableApplicationContext context = application.run (args); System.out.println (context.getBean (runnable.class)); }}6. 콘솔 인쇄
com.edu.mytest$$ lambda$153/284686302@2c07545f
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.