1. 场景启动器
Spring Boot的自动配置原理中不可或缺的就是那些已经定义好的场景启动器,只要导入某个场景启动器我们的应用就拥有了该场景下的一些核心Bean,有利于快速开发,比如引入Web的场景启动器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
我们就可以快速开发Web服务,Spring Boot官方提供了众多的场景启动器供开发者使用,但这些场景启动器也并不能满足开发者各式各样的需求。比如Dubbo很好用,我们希望能够有一个Dubbo的场景启动器能够快速使用Dubbo的功能,因此阿里就推出了dubbo-spring-boot-starter的场景启动器,这也是延续了Spring的整合一切的思想。
2. 命名规则
场景启动器的命名其实本身可以随意命名,但在JAVA领域总有一些约定,比如类名、方法名要见名知意,Spring Boot官方自己出产的场景启动器都是以spring-boot-starter开头再加模块名称,比如:
- spring-boot-starter-web
- spring-boot-starter-jdbc
- spring-boot-starter-cache
非官方出产的场景启动器都是以模块名称开头再加spring-boot-starter,比如:
- mybatis-spring-boot-starter
- dubbo-spring-boot-starter
3. 开发规则
场景启动器帮我们做了什么?
- 场景启动器帮我们引入了某个场景下所需要的依赖JAR
- 提供了自动配置类给IOC容器注入该场景下的核心Bean
其中自动配置类会用到很多条件注解来判断是否符合场景,Spring Boot提供的条件注解如下:
注解 | 作用 |
---|
@ConditionalOnBean | 判断某个Bean是否存在 | @ConditionalOnClass | 判断某个class是否存在 | @ConditionalOnExpression | 判断某个表达式是否成立 | @ConditionalOnJava | 判断是否是运行的指定版本的JAVA | @ConditionalOnJndi | 判断指定资源是否是通过JNDI加载 | @ConditionalOnMissingBean | 判断某个Bean是否不存在 | @ConditionalOnMissingClass | 判断某个class是否不存在 | @ConditionOnWebApplication | 判断是否是Web应用 | @ConditionOnProperty | 判断某个配置是否是指定的内容 | @Conditional | 设置实现Condition接口的类,实现自定义条件 |
例如缓存场景启动器的自动配置类CacheAutoConfiguration如下:
4. 自定义场景启动器
定义一个场景启动器,名称为:hello-spring-boot-starter,该启动器提供一个核心Bean,名称为helloBean,可以输出启动器的名称,工程结构如下:
4.1 开发场景启动器
- 在【hello-spring-boot-starter】工程中的pom文件中引入如下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.5.RELEASE</version>
</dependency>
</dependencies>
- 在【hello-spring-boot-starter】工程中创建核心类,类名称:HelloBean,具体内容如下:
public class HelloBean
{
public void printHello()
{
System.out.println("hello-spring-boot-starter");
}
}
- 在【hello-spring-boot-starter】工程中创建自动配置类,类名称:HelloAutoConfiguration,只有在Web应用中才生效,内容如下:
@Configuration
@ConditionalOnWebApplication
public class HelloAutoConfiguration
{
@Bean
public HelloBean helloBean()
{
return new HelloBean();
}
}
- 在【hello-spring-boot-starter】工程中的META-INF目录下创建spring.factories文件,内容如下:
// 让Spring Boot启动时自动给我们装配
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.xxxx.hello.HelloAutoConfiguration
4.2 应用场景启动器
- 在【spring-boot-web-example】工程中的pom文件中引入web和自定义的hello场景启动器,内容如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.xxxx</groupId>
<artifactId>hello-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
- 在【spring-boot-web-example】工程中新建应用程序启动类,类名称:SpringServiceApplication,内容如下:
@SpringBootApplication
public class SpringServiceApplication implements ApplicationRunner
{
@Autowired
private HelloBean helloBean;
public static void main(String[] args)
{
SpringApplication.run(SpringServiceApplication.class);
}
@Override
public void run(ApplicationArguments args) throws Exception
{
helloBean.printHello();
}
}
|