SpringBoot实战之SpringBoot自动配置原理 ゝ一纸荒年。 2022-04-13 11:25 183阅读 0赞 > SpringBoot 自动配置主要通过 `@EnableAutoConfiguration`, `@Conditional`, `@EnableConfigurationProperties` 或者 `@ConfigurationProperties` 等几个注解来进行自动配置完成的。 > > `@EnableAutoConfiguration` 开启自动配置,主要作用就是调用 `Spring-Core` 包里的 `loadFactoryNames()`,将 `autoconfig` 包里的已经写好的自动配置加载进来。 > > `@Conditional` 条件注解,通过判断类路径下有没有相应配置的 `jar` 包来确定是否加载和自动配置这个类。 > > `@EnableConfigurationProperties` 的作用就是,给自动配置提供具体的配置参数,只需要写在 `application.properties` 中,就可以通过映射写入配置类的 `POJO` 属性中。 ### @EnableAutoConfiguration ### @Enable\*注释并不是`SpringBoot`新发明的注释,Spring 3框架就引入了这些注释,用这些注释替代XML配置文件。比如: `@EnableTransactionManagement`注释,它能够声明事务管理 `@EnableWebMvc`注释,它能启用Spring MVC `@EnableScheduling`注释,它可以初始化一个调度器。 **这些注释事实上都是简单的配置,通过`@Import`注释导入**。 从启动类的@SpringBootApplication进入,在里面找到了@EnableAutoConfiguration, ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70 1][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70 2][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70 3][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70 4][] org.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.couchbase.CouchbaseAutoConfiguration,\\ org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\\ org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\\ ### 下面我们来看自动配置redis的细节,RedisAutoConfiguration: ### ### RedisAutoConfiguration ### ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70 5][] 这个类进行了简单的Spring配置,声明了Redis所需典型Bean,和其它很多类一样,重度依赖于Spring Boot注释: 1)@ConditionOnClass激活一个配置,当类路径中存在这个类时才会配置该类 2)@EnableConfigurationProperties自动映射一个POJO到Spring Boot配置文件(默认是application.properties文件)的属性集。 3)@ConditionalOnMissingBean启用一个Bean定义,但必须是这个Bean之前未定义过才有效。 还可以使用@ AutoConfigureBefore注释、@AutoConfigureAfter注释来定义这些配置类的载入顺序。 着重了解@Conditional注释,Spring 4框架的新特性 此注释使得只有在特定条件满足时才启用一些配置。SrpingBoot的AutoConfig大量使用了@Conditional,它会根据运行环境来动态注入Bean。这里介绍一些@Conditional的使用和原理,并自定义@Conditional来自定义功能。 * @Conditional是SpringFramework的功能,SpringBoot在它的基础上定义了 * @ConditionalOnClass,@ConditionalOnProperty等一系列的注解来实现更丰富的内容。 具体几个@Conditon\*注解的含义 @ConditionalOnBean 仅仅在当前上下文中存在某个对象时,才会实例化一个Bean @ConditionalOnClass 某个class位于类路径上,才会实例化一个Bean),该注解的参数对应的类必须存在,否则不解析该注解修饰的配置类 @ConditionalOnExpression 当表达式为true的时候,才会实例化一个Bean @ConditionalOnMissingBean 仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean,该注解表示,如果存在它修饰的类的bean,则不需要再创建这个bean,可以给该注解传入参数例如@ConditionOnMissingBean(name = "example"),这个表示如果name为“example”的bean存在,这该注解修饰的代码块不执行 @ConditionalOnMissingClass 某个class类路径上不存在的时候,才会实例化一个Bean @ConditionalOnNotWebApplication 不是web应用时,才会执行 -------------------- ### 2.Properties系列注释 ### @EnableConfigurationProperties @ConfigurationProperties(prefix = "may") 在需要注入配置的类上加上这个注解,prefix的意思是,以该前缀打头的配置,以下是例子 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70 6][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70 7][] ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70 8][] ### 总结 ### SpringBoot 的 自动配置得益于 SpringFramework 强大的支撑,框架早已有很多工具和注解可以自动装配 Bean 。SpringBoot 通过 一个封装,将市面上通用的组件直接写好了配置类。当我们程序去依赖了这些组件的 jar 包后,启动 SpringBoot应用,于是自动加载开始了。 我们也可以定义自己的自动装配组件,依赖之后,Spring直接可以加载我们定义的 starter 。笔者将在后续文章中进行编码和解读。 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70]: /images/20220413/813e0dccf40641dcafb383f8e1b2fa85.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70 1]: /images/20220413/1d2a95b3a780461fab5cbb21eb5060c2.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70 2]: /images/20220413/d169997b5346441f9080c219fb0a0635.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70 3]: /images/20220413/67051542dd924e2d9d67b2071b1d2819.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70 4]: /images/20220413/175cbb180caf43899262cb7e46a1a26d.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70 5]: /images/20220413/59e15e17d13446b585d3f316070975b1.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70 6]: /images/20220413/ea337c5b489b4ce79fc7729c1c3cd2b4.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70 7]: /images/20220413/1edc5a8a112641f2b6f3fa92cba30edb.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE3NTU3MA_size_16_color_FFFFFF_t_70 8]: /images/20220413/f74639b938bf4f738bf864bd8de7d14b.png
还没有评论,来说两句吧...