1. ทำไมฉันถึงได้รับการกำหนดค่าอัตโนมัติโดยใช้คำอธิบายประกอบ @SpringBootapplication?
คำตอบ: @springbootapplication มีคำอธิบายประกอบภายใน 3 คำ @enableautoconfiguration, @componentscan, @configuration บทความนี้ส่วนใหญ่จะอธิบายคำอธิบายประกอบ @enablexx
2. ทำไม @enableautoconfiguration จึงใช้? เมื่อใช้ @ConfigurationProperties รายการการกำหนดค่าใน. yml หรือ. properties สามารถนำเข้าโดยอัตโนมัติได้หรือไม่?
คำตอบ: ภายใน @enableautoconfiguration ใช้คำอธิบายประกอบ @import นำเข้า AutoconFigurationImportSelector ช่วยให้สปริงบูตโหลดการกำหนดค่าที่ผ่านการรับรองลงในคอนเทนเนอร์ IOC แต่การใช้งานภายในของ SpringFactoriesLoader นั้นใช้เพื่อทำให้เสร็จสมบูรณ์ คล้ายกับ Java SPI นั่นคือการโหลดการกำหนดค่าจาก /meta-inf/spring.factories
@target ({elementType.type})@retention (RetentionPolicy.runtime)@documented@สืบทอด@autoconFigurationPackage@import ({AutoconFigurationImportSelector.class}) publicคุณจะเห็นได้ว่าใน @IMPORT คลาส AutoconFigurationImportSelector จะถูกนำเข้าจริง สิ่งที่สำคัญที่สุดคือคลาสนี้ใช้อินเทอร์เฟซ ImportSelector
อินเทอร์เฟซ Public ImportSelector { /** * เลือกและส่งคืนชื่อของคลาสที่ควรนำเข้าตาม * {@link AnnotationMetadata} ของคลาสการนำเข้า@{@Link Configuration} */ String [] SelectImports (AnnotationMetadata ImportingClassMetadata);}นี่คือคำอธิบายของ ImportSelector ซึ่งหมายความว่าถั่วที่ส่งคืนโดยวิธีนี้จะถูกฉีดและจัดการโดยอัตโนมัติในฤดูใบไม้ผลิ
ถัดไปให้ดูที่การใช้งาน SelectImports ใน AutoConfigurationImportSelector
สตริงสาธารณะ [] SelectImports (AnnotationMetadata AnnotationMetadata) {ถ้า (! this.isenabled (AnnotationMetadata)) {return no_imports; } else {autoconfigurationMetadata autoconfigurationMetadata = autoconfigurationMetAdataloader.loadMetAdata (this.beanclassloader); AnnotationAttributes แอตทริบิวต์ = this.getAttributes (AnnotationMetadata); รายการ <String> การกำหนดค่า = this.getCandidateConfigurations (AnnotationMetadata, แอตทริบิวต์); การกำหนดค่า = this.removeduplicates (การกำหนดค่า); ตั้งค่า <string> การยกเว้น = this.getExclusions (AnnotationMetadata, แอตทริบิวต์); this.ChecKexCludedClasses (การกำหนดค่า, ยกเว้น); configurations.removeall (การยกเว้น); การกำหนดค่า = this.filter (การกำหนดค่า, autoconfigurationMetadata); this.fireautoconfigurationImportEvents (การกำหนดค่า, excclusions); ส่งคืน StringUtils.toStringArray (การกำหนดค่า); -รหัสถูกเขียนอย่างชัดเจน ฉันจะไม่อธิบาย
ใน @Import คุณจะเห็นว่าลิงค์ชี้ไปที่ ImportBeanDefinitionRegistrar นี่คืออินเทอร์เฟซและฟังก์ชั่นของมันก็เหมือนกับ ImportSelector
อินเทอร์เฟซสาธารณะ ImportBeanDefinitionRegistrar {Public Void RegisterBeanDefinitions (AnnotationMetadata ImportingClassMetadata, BeanDefinitionRegistry Registry);}ในเมธอด registerBeanDefinitions คุณสามารถใช้ beandefinitionRegistry เพื่อฉีดถั่วที่เราต้องการฉีด
ตัวอย่างรหัส:
เขียน @enable ของคุณเองโดยใช้ @import
1. สร้างถั่วทดสอบ 2 ชิ้น
บทบาทระดับสาธารณะ {} ผู้ใช้ระดับสาธารณะ {}2. ปรับแต่งการเปิดใช้งานคำอธิบายประกอบ
@Target ({ElementType.type})@retention (RetentionPolicy.runtime)@document@import (myenableautoconfig.class) public @interface enableBean {}3. ใช้คลาส enableautoconfiguration ของคุณเอง
คลาสสาธารณะ MyEnableAutoconFig ใช้ ImportSelector {@Override สตริงสาธารณะ [] SelectImports (คำอธิบายประกอบ importingclassMetadata) {ส่งคืนสตริงใหม่ [] {"com.xhn2.role", "com.xhn2.user"}; -4. เขียนคลาสเริ่มต้น
@enableBean@ComponentScan ("com.xhn2") คลาสสาธารณะหลัก {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {configurableapplicationContext บริบท = SpringApplication.run (main.class, args); System.out.println (context.getBean (user.class)); System.out.println (context.getBean (role.class)); -5. ผลการดำเนินงาน
com.xhn2.user@496bc455
com.xhn2.role@59402b8f
คอนโซลพิมพ์สำเร็จ
รหัสตัวอย่างที่ 2 การประกอบอัตโนมัติของแพ็คเกจ Jar บุคคลที่สาม
โครงการ Maven ใหม่
1. pom.xml
<SodelVersion> 4.0.0 </Streversion> <roupId> org.csp </groupId> <ratifactid> สวัสดี </artifactid> <cersion> 1.0.0 </version> <properties> <maven.compiler.source> <maven.compiler.target> 1.8 </maven.compiler.target> <project.build.sourceencoding> UTF-8 </project.build.sourceencoding> </properties> <Sersion> 4.3.17.Release </เวอร์ชัน> </การพึ่งพา> </การพึ่งพา>
2. การกำหนดค่าการเขียน
@ConfigurationPublic คลาส mytest {@bean สาธารณะ runnable runnable () {return ()-> {}; -สร้างไฟล์ meta-inf/spring.factories ใหม่ภายใต้ทรัพยากรและเพิ่มการกำหนดค่าต่อไปนี้
org.springframework.boot.autoconfigure.enableautoconfiguration = com.edu.mytest
3. ติดตั้งโครงการไปยังที่เก็บ Maven ในพื้นที่: MVN Install
4. โครงการหลักแนะนำขวดที่เพิ่งติดตั้งไปยังพื้นที่ท้องถิ่น
<Effercing> <roupId> org.csp </groupId> <ratifactid> สวัสดี </artifactId> <version> 1.0.0 </SerfiS
5. รับการกำหนดค่าที่เรียกใช้งานได้แล้วตอนนี้
@springbootaplapplicationPublic คลาสหลัก {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {แอปพลิเคชัน SpringApplication = 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 มากขึ้น