1. Почему я могу достичь автоматической конфигурации с помощью аннотации @springbootapplication?
Ответ: @springbootapplication, на самом деле есть 3 внутренних аннотации. @Enableautoconfiguration, @componentscan, @configuration. Эта статья в основном объясняет аннотацию @enablexx
2. Почему используется @enableautoconfiguration? Когда используются @ConfigurationProperties, элементы конфигурации в .yml или .properties могут быть автоматически импортированы?
Ответ: Внутри @enableautoconfiguration используется аннотация @import. Import AutoConfigurationImportSelector помогает Springboot загрузить квалифицированную конфигурацию в контейнер IOC. Но внутреннее использование SpringFactorioryloarder используется для его завершения. Подобно Java SPI, то есть загрузка конфигурации из /мета-inf/spring.factories
@Target ({elementtype.type})@hareveration (armentpolicy.runtime)@документирован@enhorited@autoconfigurationpackage@import ({autoconfigurationimportectorector.class}) public @Interface enableAutoConfigurationВы можете видеть, что в @Import класс AutoConfigurationImportector фактически импортируется. Самое главное, что этот класс реализует интерфейс Importselector
Public Interface ImportSelector { /** * Выберите и верните имена, из которых класс (ES) должен быть импортирован на основе * {@link AnnotationMetadata} класса Importing@{@Link}. */ String [] selectImports (AnnotationMetAdata ImportingClassMetadata);}Это описание импортатора, что примерно означает, что боб, возвращаемый этим методом, будет автоматически введен и управляется весной.
Далее, давайте посмотрим на реализацию SelectImports в AutoConfigurationImportectorector
public String [] SelectImports (AnnotationMetadata AnnotationMetadata) {if (! this.iseSemabled (AnnotationMetadata)) {return no_imports; } else {autoConfigurationMetAdata autoConfigurationMetAdata = autoConfigurationMetAdataloader.LoadMetAdata (this.beanClassloader); Annotationattributes attributes = this.getattributes (AnnotationMetadata); List <string> configurations = this.getCandidateConfigurations (AnnotationMetadata, Attributes); Configurations = this.Removeduplicates (configurations); SET <String> explusions = this.getExclusions (AnnotationMetadata, Attributes); this.checkexcludedclasses (configurations, Excus); configurations.removeall (исключения); configurations = this.filter (Configurations, AutoConfigurationMetadata); this.fireAutoConfigurationImportEvents (Configurations, Excclusions); return stringutils.tostringarray (configurations); }}Код написан очень четко. Я не объясню это.
В @Import вы можете видеть, что ссылка указывает на ImportBeanDefinitionRegistrar. Это также интерфейс, и его функция такая же, как импортор.
Общедоступный интерфейс ImportBeanDefinitionRegistrar {public void RegistersBeandefinitions (AnnotationMetadata ImportingClassMetadata, реестр BeandefinitionRegistry);}В методе RegisterBeandefinitions вы можете использовать BeandefinitionRegistry для внедрения бобов, которые мы хотим ввести.
Пример кода:
Напишите свой собственный @Enable с помощью @Import
1. Создать 2 тестовых боба
Роль открытого класса {} Пользователь открытого класса {}2. Настройка включить аннотации
@Target ({elementType.type})@hareveration (armentpolicy.runtime)@Doctiped@import (myenableautoconfig.class) public @Interface enableBean {}3. Внедрить свой собственный класс EnebleAutoConfiguration
открытый класс myenableAutoconfig реализует importSelector {@Override public String [] selectImports (AnnotationMetAdata ImportingClassMetadata) {return New String [] {"com.xhn2.role", "com.xhn2.user"}; }}4. Напишите класс стартапов
@Enablebean@componentscan ("com.xhn2") открытый класс 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 (role.class)); }}5. Результаты работы
com.xhn2.user@496bc455
com.xhn2.role@59402b8f
Консоль успешно печатает.
Пример кода 2, автоматическая сборка стороннего пакета JAR
New Maven Project
1. Pom.xml
<dolidyVersion> 4.0.0 </modelVersion> <groupId> org.csp </GroupId> <straCactId> hello </artifactid> <serse> 1.0.0 </version> <properties> <maven.compiler.source> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 <project.build.sourceencoding> utf-8 </project.build.sourceencoding> </properties> <Depertiencies> <deyedency> <groupid> org.springframework </GroupId> <ratifactid> spring-context </artifactid> <serse> 4.3.17.releasease </ression> </artifactid> <serse> 4.3.17.Releasease> </artifactid> <serse> 4.3.17.Releaseess> </artifactid> <serse> 4.
2. Напишите конфигурацию
@ConfigurationPublic Class MyTest {@bean public runnable runnable () {return ()-> {}; }}Создайте новый файл meta-inf/spring.factories под ресурсами и добавьте следующую конфигурацию
org.springframework.boot.autoconfigure.enableautoconfiguration = com.edu.mytest
3. Установите проект в местный репозиторий Maven: MVN Install
4. Основной проект представляет только что JAR, которая была только что установлена в местном районе.
<Depective> <groupid> org.csp </GroupId> <ArtifactId> hello </artifactid> <sersion> 1.0.0 </version> </depervice>
5. Получите настройку запуска только сейчас
@Springbootapplicationpublic class main {public static void main (string [] args) {springapplication application = new SpressApplication (main.class); ConfigurableApplicationContext context = Application.Run (args); System.out.println (context.getbean (runnable.class)); }}6. Консольная печать
com.edu.mytest$$nlambda$153/284686302@2c07545f
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.