zoukankan      html  css  js  c++  java
  • SpringBoot自动配置的实现原理

    一,配置属性类

    其实就是值对象注入的方式去配置一些Spring常用的配置,我们编写一个最简单的配置对象。

    @ConfigurationProperties(prefix = "hello")

    //@Component //如果这里添加了注解那么在自动配置类的时候就不用添加@enableConfigurationProperties(HelloProperties.class)注解.

    public class HelloProperties {

        private String msg="default";//现在我们在配置文件写hello.msg=world,因为简单就不再展示;如果那么默认为default.

        public String getMsg() {

            return msg;

        }

        public void setMsg(String msg) {

            this.msg = msg;

        }

    }

    这是一个简单的属性值对象,那么相当于写死的字段就是SpringBoot为我们自动配置的配置,那么我们很多时候可以自己在application.properties中修改某些配置就是这样的道理,我们不设置就是默认的,设置了就是我们设置的属性。

    二,自动配置类

    上面已经构建了我们简单的属性对象,那么现在我们要通过属性对象得到相应的属性值将其注入到我们的Bean中,这些Bean也就是一些SpringBoot启动后为我们自动配置生成的Bean,当然SpringBoot优先使用我们配置的Bean这个功能是如何实现的,我们往下看一下就明白了。

    首先我们需要一个功能Bean,可以把这个Bean看做是SpringBoot框架启动后在容器里面生成的为我们服务的内置Bean,简单的写一个。

    //@Component 这里很重要,如果我们添加了这个注解那么,按照我们下面的设置SpringBoot会优先使用我们配置的这个Bean,这是符合SpringBoot框架优先使用自定义Bean的原则的。

    public class HelloService {

        private String msg = "service";//如果自动配置没有读入成功,那么为默认值

        public String say() {

            return "hello " + msg;

        }//为我们服务的方法

        public String getMsg() {

            return msg;

        }

        public void setMsg(String msg) {

            this.msg = msg;

        }

    }

    现在编写我们的自动配置类。

    @Configuration //配置类

    @EnableConfigurationProperties(HelloProperties.class)//这里就是前面说的,这个注解读入我们的配置对象类

    @ConditionalOnClass(HelloService.class)//当类路径存在这个类时才会加载这个配置类,否则跳过,这个很有用比如不同jar包间类依赖,依赖的类不存在直接跳过,不会报错

    public class HelloAutoConfiguration {

        @Autowired

        private HelloProperties helloProperties;

        @Bean

        @ConditionalOnMissingBean(HelloService.class)//这个配置就是SpringBoot可以优先使用自定义Bean的核心所在,如果没有我们的自定义Bean那么才会自动配置一个新的Bean

        public HelloService auto(){

            HelloService helloService =new HelloService();

            helloService.setMsg(helloProperties.getMsg());

            return helloService;

        }

    }

    好了现在自动配置的类也写好了,我们可以启动一下SpringBoot应用,测试一下。

    三,测试自动配置

    @SpringBootApplication

    @RestController

    public class MyRun {

        @Autowired

        private HelloService helloService;

        @RequestMapping("/auto/home")

        public String home(){

            return helloService.say();

        }

        public static void main(String[] args) {

            SpringApplication.run(MyRun.class,args);

        }

    }

    ok ,运行后访问你会看到:

    hello world

    代表我们的自动配置功能成功。

    四,SpringBoot管理自动配置

    其实在很多时候我们的配置是在很多jar包里的,那么我们新的应用该怎么读入这些jar包里的配置文件呢,SpringBoot是这样管理的。

    最主要的注解就是@enableAutoConfiguration,而这个注解会导入一个EnableAutoConfigurationImportSelector的类,而这个类会去读取一个spring.factories下key为EnableAutoConfiguration全限定名对应值.

    # Auto Configure

    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.MessageSourceAutoConfiguration,

    org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration,

    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.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.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,

    org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,

    org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,

    org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,

    org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,

    org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,

    org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,

    org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,

    org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,

    org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,

    org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,

    org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,

    org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,

    org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,

    org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,

    org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,

    org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,

    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.jms.hornetq.HornetQAutoConfiguration,

    org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,

    org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,

    org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,

    org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,

    org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,

    org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,

    org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,

    org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,

    org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,

    org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,

    org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,

    org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,

    org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,

    org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,

    org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,

    org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,

    org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,

    org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,

    org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,

    org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,

    org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,

    org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,

    org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,

    org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration,

    org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration,

    org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,

    org.springframework.boot.autoconfigure.velocity.VelocityAutoConfiguration,

    org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,

    org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,

    org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,

    org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,

    org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,

    org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,

    org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration,

    org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,

    org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,

    org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,

    org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration,

    org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,

    org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,

    org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,

    org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration

    所以如果需要我们可以在我们的resources目录下创建spring.factories下添加类似的配置即可。

  • 相关阅读:
    mysql json 嵌套数组查询
    Centos 部署 mysql
    Mysql8.0 导出数据库文档
    MySQL常用Json函数
    java Dateutil 操作类
    雪花算法生成的ID,前端无法使用
    Mysql 一个字段匹配多个字符
    EntityManager 获取 List<T>
    高级软件工程第二次作业:随机生成N个不重复的已解答完毕的数独棋盘
    调研《构建之法》指导下的全国高校优秀实践作品三篇
  • 原文地址:https://www.cnblogs.com/windpoplar/p/10921320.html
Copyright © 2011-2022 走看看