版权声明:转载请附上本文链接,谢谢。 https://blog.youkuaiyun.com/weixin_40663800/article/details/80391539
在我们使用springboot的时候,感觉很方便,它提倡的 '习惯优于配置' 给开发人员带来了很大的方便。但是当一些小白在使用的时候,经常不理解是如何实现自动配置的。
在spring中提供了一种基于条件来配置bean的方式来实现bean的配置。其实springboot也基于了这个来实现。
spring基于条件配置bean
spring提供了条件注解@Conditional,该注解根据满足某一个条件来实现创建一个特定的bean。
实例:下面实例将以不同的操作系统为条件来创建不同的bean。我们将通过实现Condition接口,并重写其matches方法来构建判断条件。
1:定义判断条件:
2:不同系统下要实现的bean
3:配置类的实现
代码解释:
@configuration注解配置类,通过@Conditional注解,符合哪个条件则创建对应的bean
4:运行测试
springboot运行原理
关于springboot的运行原理,我们可以通过查看@SpringBootApplication注解,这个注解是一个组合注解,它的核心功能是有@EanbleAutoConfiguration注解提供的。
看下@EanbleAutoConfiguration的源码:
源码里面可以看出,这是一个组合注解,其中关键功能是@Import注解的导入配置功能。EnableAutoConfigurationImportSelector使用SpringFctoriesLoader.loadFactoryNames方法来扫描具有META-INF/spring.factories文件,此文件中声名了有哪些自动配置。
核心注解
springboot的运行原理看起来很简单,其实还有很多核心的注解。
其实打开spring.factories文件中随便哪一个自动配置,都可以发现有很多注解,尤其是上面说到的基于条件来创建bean的注解的使用。
以上的注解其实都是组合了@Condition注解,只是传入不同的条件类。
案列分析
通过以上的了解,现在我们来找一个案列来分析一下springboot是如何实现自动配置的。我们来分析一下http编码的自动配置。
常规配置http编码,是在web.xml当中配置一个filter:
实现springboot自动配置:
1:配置参数,类型安全配置的方式。
springboot有类型安全配置。springboot的自动配置也是基于了这一点。这里的配置类里面的参数可以直接在application.properties中设置。
源码如下:
2:配置bean
实战
通过上面的理解,我们可以写一个简单的例子来测一下。这里举一个简单的例子,包含当某个类存在的时候自动配置这个类的bean,并可将该bean的属性在applicationg.peoperties中进行配置。
首先要创建starter的maven项目。
并且在pom文件中要增加springboot的自动配置的依赖。
1:属性配置类,类型安全配置,可在application.properties中配置参数。
类型安全的配置,在application.properties中通过hello.msg来配置msg参数的值。默认为hello.msg=world。
2:判断依据类。
3:自动配置类
通过注解@EnableConfigurationProperties开始属性配置,可以在appicationg.properties中配置HelloServiceProperties类的参数。
通过注解@ConditionalOnClass判断HelloService.class在类路径下条件时。
通过注解@ConditionalOnProperty判断当在application.properties中设置hello=enabled设置条件符合,默认为true,也是条件符合。
4:注入配置类
如果想要是自动配置生效,在分析springboot运行原理的时候我们就知道了,需要在METE-INF/spring.factories中注册配置类。
5:测试