
Spring Boot是如何通过自动装配来简化开发的?
蛮荒的年代
最近用了一些spring-boot-starter-data的组件(redis,mongodb,jpa,elasticsearch等),才意识到Spring Boot真是极大的简化了开发的流程。以演进的视角来分享一下spring boot是如何通过自动装配来简化开发的
XML配置
Spring是一个容器,里面保存了你所需要的对象和对象之间的依赖关系。当我们需要对象A时,不用从头开始new,只需要告诉Spring把A给我,Spring就会把对象A给你,即IOC。刚开始这些对象以及对象之间的依赖关系是配置在XML文件中的
applicationContext.xml
Weapon类
BraveKnight类
如果你学过SSM框架的话,应该对这些配置不陌生
用XML形式可以在配置文件中,配置我们自己写的类和外部jar包的类,Spring通过反射把这些类都创建出来,并由Spring管理,在你需要的时候给你
可以看到Weapon和BraveKnight对象都被注入到spring 容器中了,而且获取BraveKnight对象时,它的weapon属性已经被设值了,即DI(依赖注入)
注解
我们不仅可以用XML来设置对象,以及对象和对象之间的关系,还可以用注解和JavaConfig
用注解的方式改造一下上面的代码
测试类
可以看到和上面用XML配置效果一样
JavaConfig
在我们自己的类上,我们可以加@Component注解让Spring来管理,如果是第三方jar包的类呢?它的类上并不会加@Component啊,如果不想用XML来生成第三方jar包的类,JavaConfig在这个时候就派上用场了,接着上面的例子,假如Weapon这个类是第三方jar包的类,则可以通过如下形式让Spring管理
写一个Spring Boot Starter
从上面可以看到,当我们想使用某些类时,我们必须先对类进行配置,让Spring来管理这些类,才能使用。
spring boot可以非常方便的和第三方框架整合,只需要引入一个starter依赖,就可以直接使用(省去了配置的过程),因为spring boot会自动装配我们所需要类。starter artifactId如何命名呢?Spring 官方 starter通常命名为spring-boot-starter-{name} 如 spring-boot-starter-web,Spring官方建议非官方starter命名应遵循{name}-spring-boot-starter的格式。来写一个自己的starter,这里我建了一个多模块项目,一个是starter项目,一个是测试项目
starter项目
1.pom文件如下
2.供其他模块使用的服务类
3.用@ConfigurationProperties将application.xml中的属性映射为配置类
4.自动配置类
@ConditionalOnClass的作用是,判断当前classpath下是否存在指定类,若存在则将当前的配置载入spring容器
5.在src->main->java->resource目录下建META-INF文件夹,放spring.factories文件,文件内容如下
测试项目
在pom文件中引入依赖
application.xml中的配置内容如下
测试类
可以看到,我们在用DemoService这个类的时候,Spring Boot已经自动帮我们注入进来了,我们并没有做任何配置,非常方便。原文阅读放了源码的github地址
Spring Boot自动装配的原理
Spring Boot自动装配是怎么实现的呢?
众所周知,所有的Spring Boot启动类上都有一个@SpringBootApplication注解。@SpringBootApplication是一个复合注解,它包含的其中一个注解为@EnableAutoConfiguration,而@EnableAutoConfiguration会导入AutoConfigurationImportSelector这个类,这个类会加载jar包里面META-INF/spring.factories配置文件里面填写的配置类。
以我们的上面写的starter为例,加载的顺序如下
1.META-INF/spring.factories
2.DemoServiceAutoConfiguration
3.DemoServicePropeties(读取application.properties配置文件)
4.DemoService
所有的starter实现都是这个套路
文章转载自公众号:Java识堂
