以前一直在用SpringBoot框架,一直感受SpringBoot框架自動配置的功能很強大,可是並無明白它是怎麼實現自動配置的,如今有空研究了一下,大概明白了SpringBoot框架是怎麼實現自動配置的功能,咱們編寫一個最簡單的自動配置功能,大概的總結一下.react
一,配置屬性類web
其實就是值對象注入的方式去配置一些Spring經常使用的配置,咱們編寫一個最簡單的配置對象。redis
@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中修改某些配置就是這樣的道理,咱們不設置就是默認的,設置了就是咱們設置的屬性。spring
二,自動配置類websocket
上面已經構建了咱們簡單的屬性對象,那麼如今咱們要經過屬性對象獲得相應的屬性值將其注入到咱們的Bean中,這些Bean也就是一些SpringBoot啓動後爲咱們自動配置生成的Bean,固然SpringBoot優先使用咱們配置的Bean這個功能是如何實現的,咱們往下看一下就明白了。session
首先咱們須要一個功能Bean,能夠把這個Bean看作是SpringBoot框架啓動後在容器裏面生成的爲咱們服務的內置Bean,簡單的寫一個。app
//@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應用,測試一下。socket
三,測試自動配置elasticsearch
@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下添加相似的配置便可。。
ok,自動配置的原理差很少就這樣,我如今瞭解的並不深刻,還須要繼續學習。