全面解析SpringBoot自动配置的实现原理

2025-05-29 0 62

之前一直在用SpringBoot框架,一直感觉SpringBoot框架自动配置的功能很强大,但是并没有明白它是怎么实现自动配置的,现在有空研究了一下,大概明白了SpringBoot框架是怎么实现自动配置的功能,我们编写一个最简单的自动配置功能,大概的总结一下.

一,配置属性类

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

?

1

2

3

4

5

6

7

8

9

10

11
@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,简单的写一个。

?

1

2

3

4

5

6

7

8

9

10

11

12

13
//@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;

}

}

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14
@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应用,测试一下。

三,测试自动配置

?

1

2

3

4

5

6

7

8

9

10

11

12

13
@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全限定名对应值.

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94
# 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下添加类似的配置即可。。

以上所述是小编给大家介绍的SpringBoot自动配置的实现原理,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 全面解析SpringBoot自动配置的实现原理 https://www.kuaiidc.com/116428.html

相关文章

发表评论
暂无评论