什么是自动装配?
Spring Boot 自动装配是指 Spring Boot 应用程序在启动时,框架会自动根据应用程序的配置来创建和连接各种对象之间的依赖关系。这意味着,在应用程序中使用的对象可以通过声明它们的依赖关系来自动创建,而不需要人为地创建这些对象。
Spring Boot 自动装配使用依赖注入(DI)技术来实现自动装配。在依赖注入中,对象之间的依赖关系通过将依赖项注入到客户端中来建立。 Spring Boot 自动装配使用配置文件来声明对象之间的依赖关系,然后在运行时自动创建并连接这些对象。
使用 Spring Boot 自动装配可以简化应用程序开发流程,并使应用程序更易于维护和扩展。它还可以帮助减少代码量,并使应用程序更易于测试。之前要用一个功能还要使用各种的 @EnableXxx 注解,现在完全不需要,统一使用 @EnableAutoConfiguration 即可。但是就必须遵守规范,才能达到想要的效果。
下面就通过自定义一个缓存功能模块,然后通过自动装配装配到 Spring 容器中供使用。
代码演示
新建一个普通 Maven 工程(推荐普通 Maven 工程,SpringBoot 工程导入 Jar 包过多),总体项目结构如下:
然后就可以在这个工程中开始自定义功能模块开发了。
1、引入 maven 依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>cache-test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.22</version>
</dependency>
</dependencies>
</project>
2、在 resources 下新建文件和文件夹 META-INF/spring.factories
其中 spring.factories 文件配置如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.gwm.MyCacheAutoConfiguration
注意文件夹和文件名称不能写错也不能修改就是固定住的,以为 Spring 源码中就是这样写死的。然后 spring.factories 中的内容 key 也是固定这样写的,因为 SpringBoot 中默认寻找的 key 就是 @EnableAutoConfiguration 注解的全路径名,所以要想被自动扫描到就乖乖遵守规范。
对于 spring.factories 配置的 value 值就是你要被 Spring 扫描装载的功能配置类。注意也是全路径包名。下面就会介绍到。
3、自定义功能入口类 MyCacheAutoConfiguration
一般功能模块的入口类相当于个大管家,管理大家出生,组装大家之间的关系(DI),各个元素通过 @Bean 注解完成装载,MyRedisCacheTemplate 类就是该功能模块中的核心成员。
@Configuration
public class MyCacheAutoConfiguration {
@Bean
public MyRedisCacheTemplate redisCacheTemplate() {
return new MyRedisCacheTemplate();
}
}
public class MyRedisCacheTemplate {
private Map<String, Object> map = new ConcurrentHashMap<>();
public void put(String key, Object t) {
map.put(key, t);
}
public boolean delete(String key) {
map.remove(key);
return true;
}
public Object get(String key) {
return map.get(key);
}
}
现在依赖、配置、代码都已经完成!现在要将这个模块打包导出并放入到共享仓库供给大家使用。
4、打包该功能模块提供给大家使用,因为大家都是用 maven 所以最好是打包下形成一个 maven 坐标,别人使用起来贼方便
常用的两种方式:
1)、手动打包
mvn install:install-file -Dfile=cache-test-1.0-SNAPSHOT.jar -DgroupId=org.example -DartifactId=cache-test -Dversion=1.0-SNAPSHOT -Dpackaging=jar
<dependency>
<groupId>org.example</groupId>
<artifactId>cache-test</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
2)、idea 打包
先点击 clean、然后 compile、完成之后直接 install 即可。然后提示 BUILD SUCCESS 就是成功打包完成。
5、在其他项目中导入上述功能组件,其实就是引入 maven 坐标即可
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud2022</artifactId>
<groupId>com.gwm.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-alibaba-nacos-order9211</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--导入功能模块然后通过 @Autowire 就可以使用啦-->
<dependency>
<groupId>org.example</groupId>
<artifactId>cache-test</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
6、@Autowired、或者 @Resource 使用此功能模块
通过 DI 注解 @Autowired、或者 @Resource 可以获取到 MyRedisCacheTemplate 对象,然后就可以开始使用了!
@SpringBootApplication
public class NacosOrderMain9211 {
@Autowired
private MyRedisCacheTemplate myRedisCacheTemplate;
public static void main(String[] args) {
SpringApplication.run(NacosOrderMain9211.class, args);
}
}
okay,现在就完成了自定义功能模块的自动装配,我们就配了点配置文件,写了点相关的代码,其实额外的事情没干,这个功能导入 jar 包就直接可以使用了,再也不用像以前还要写 @EanbleXxx 这样的注解,省事不容易忘记。
总结
其实归根结底还是 Spring 的 SpringFactoriesLoader 工厂加载机制 + @Import(DeferredImportSelector) 实现的,之前说配置文件必须写死 META-INF/spring.factories 规范也就是 Spring 的 SpringFactoriesLoader 规范。
上升到 SpringBoot 就完美利用这两点功能实现了自动装配。然后 SpringBoot 将 @EnableXxx 各式各类注解统一
命名成 @EnableAutoConfiguration 简单明了!这也就是为什么 spring.factories 文件中的 key 必须要写死 @EnableAutoConfiguration 注解的全路径名!