To undertake the previous text springboot sentiment edify [email protected] annotation analysis, this article will be based on the above @SpringBootApplication annotation to make a simple analysis
@SpringBootApplication
This annotation is one of the most concentrated annotations in Springboot and the most widely used annotation. The official also use this note to start the Spring service, we look at the source code
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })public @interface SpringBootApplication { @AliasFor(annotation = EnableAutoConfiguration.class) Class<?>[] exclude() default {}; @AliasFor(annotation = EnableAutoConfiguration.class) String[] excludeName() default {}; @AliasFor(annotation = ComponentScan.class, attribute = "basePackages") String[] scanBasePackages() default {}; @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses") Class<?>[] scanBasePackageClasses() default {};}
The code above shows that it integrates @EnableAutoConfiguration
and @ComponentScan
two major annotations, which are specified by default.
Attributes exclude and excludename, whose default is null, and the specified words are eventually resolved by Enableautoconfiguration.class .
Attributes scanbasepackages and scanbasepackageclasses, whose default is null, and the specified words are eventually resolved by Componentscan.class .
By default, the @SpringBootApplication
package name of the class in which the annotation is located is used as the Beandefinition scan path.
Masking the org.springframework.boot.autoconfigure.EnableAutoConfiguration
class collection specified by attributes in the Meta-inf\spring.factories file during scanning
Support multiple @ComponentScan
annotations with annotations at the same time @SpringBootApplication
@ComponentScan Annotations have been understood in the previous article, the author here for the @EnableAutoConfiguration annotation For detailed analysis
@EnableAutoConfiguration
Simply from the English word is open automatic injection of the meaning, the specific words of the author or according to the source code to interpret. First look at the source code of the annotations
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class)public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; /** * Exclude specific auto-configuration classes such that they will never be applied. * @return the classes to exclude */ Class<?>[] exclude() default {}; /** * Exclude specific auto-configuration class names such that they will never be * applied. * @return the class names to exclude * @since 1.3.0 */ String[] excludeName() default {};}
It uses the @Import annotations We mentioned earlier, so we focus on the Autoconfigurationimportselector.class we've introduced.
Autoconfigurationimportselector
It is the implementation class of the Deferredimportselector.class interface, where we view the method of the replication directly selectimports ()
@Override public string[] Selectimports (annotationmetadata annotationmetadata) {//Spring.boot.enableautoco Nfiguration property Read, default to True if (!isenabled (Annotationmetadata)) {return no_imports; }//Read all meta-inf\spring-autoconfigure-metadata.properties files Autoconfigurationmetadata Autoconfigur Ationmetadata = Autoconfigurationmetadataloader. Loadmetadata (This.beanclassloader); Gets the property corresponding to the @enableautoconfiguration on the corresponding class annotationattributes attributes = GetAttributes (annotationmetadata); Read all <org.springframework.boot.autoconfigure.EnableAutoConfiguration> properties from META-INF\SPR Ing.factories list<string> configurations = getcandidateconfigurations (Annotationmetadata, att Ributes); Configurations = removeduplicates (configurations); Read Exclude/excludename property or Spring.autoconfigure.exclude property Set<string> exclusions = getexclusions (annotationmetadata, attributes); Make sure the assignable exclusions is present in classpath and configurations collection, or would throw exception Checkexcludedclasses (configurations, exclusions); Configurations.removeall (exclusions); Filter the present Configurations configurations = filter (configurations, autoconfigurationmetadata); Fire the autoconfigurationimportevent by Autoconfigurationimportlistener.class fireautoconfigurationimportevents (configurations, exclusions); return Stringutils.tostringarray (configurations); }
The above steps are summarized here
The environment variable spring.boot.enableautoconfigurationis prioritized and no class is introduced if it is specified as false. Default is True
Read all the meta-inf\spring-autoconfigure-metadata.properties files in the CLASSPATH environment, Load all of the properties in the save to Autoconfigurationmetadata
Gets the @enableautoconfiguration corresponding property on the corresponding class, which is actually the exclude property and the excludename property
Read the properties of all the meta-inf\spring.factories files in the CLASSPATH environment org.springframework.boot.autoconfigure.EnableAutoConfiguration
and get the Configurations collection
The exclusions collection is obtained based on the configuration read in the third step and the spring.autoconfigure.exclude
configuration specified by the environment variable
Make sure that the exclusions collection is a subset of the configurations collection, and that the class in the Exclusions collection is present in the CLASSPATH environment. Otherwise the exception is thrown
Filters out unfiltered configurations collections based on the exclusions set above.
Based on the 7th Filter Configurations collection, and then on the basis of Autoconfigurationmetadata for the ConditionalOnClass
property filter round
For example: org.springframework.boot.autoconfigure.cache.cacheautoconfiguration.conditionalonclass= Org.springframework.cache.CacheManager
Indicates that if you want to apply cacheautoconfiguration, you have to ensure that the Org.springframework.cache.CacheManager class exists
Triggering autoconfigurationimportevent Events
Returns the configurations collection after filtering
The author here lists the enableautoconfiguration default attributes in the Spring-boot-autoconfigure-2.0.3.realease package, the spring.factories
attributes are too many, the following excerpt
# Auto Configureorg.springframework.boot.autoconfigure.enableautoconfiguration= Org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration, Org.springframework.boot.autoconfigure.aop.AopAutoConfiguration, Org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration, Org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration, Org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, Org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, Org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration, Org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration, Org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, Org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,... Org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration, Org.springframework.boot.autoconfigure.jms.jndiconnectionfactoryautoconfiguration,org.springframework.boOt.autoconfigure.jms.activemq.ActiveMQAutoConfiguration, Org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,... Org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration, Org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,... Org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration, Org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration, Org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, Org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, Org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration, Org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, Org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration, Org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration, Org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration, Org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
Of course, users can also customize to implement the configuration classes that need to be injected automatically.
Summarize
@SpringBootApplication annotations contain @EnableAutoConfiguration annotations and @ComponentScan annotations, so the two annotations are combined to match the @Configuration Annotations will enable the Springboot to function.
In this, the@EnableAutoConfiguration annotation is the most important, its extensibility is very good, convenient springboot seamlessly docking different plug-ins (NoSQL plug-ins, web plugins, JMX protocol plug-ins, etc.), the reader needs to analyze well.
Next section Trailer
By referring to the above-mentioned automatic annotations, it is found that @Conditional and autoconfigureafter annotations are conditional judgments, and before they are thoroughly understood Springboot integrate other plugins, You must have a deep understanding of the two annotations.
Springboot sentiment edify [email protected] annotation Analysis