【Spring Boot 系列 自定义启动器Starter】

对应经常使用的功能组件,咱们能够将其制做成一个Starter.这样在整个系统中都能达到只须要导入依赖便可使用功能,无需其余配置。java

一、Starter命名规则

1.一、官方命名方式

  • 前缀:spring-boot-starter-
  • 规范:spring-boot-starter-模块名
  • 示例:spring-boot-starter-web

1.二、第三方命名方式

  • 后缀:-spring-boot-starter
  • 规范:模块名-spring-boot-starter
  • 示例:mybatis-spring-boot-starter

二、自动装配Bean

经过使用@Configuration以及Spring4中@Conditional条件注解等来完成Bean的自动装配web

三、配置自动装配Bean

在类路径下新建文件夹META-INF,在该文件夹下新建spring.factories文件。spring

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=自动装配Bean的全限定路径

原理戳Spring Boot自动配置分析shell

四、示例程序

4.一、利用IDEA建立一个SpringBoot工程

  • 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>com.hanson</groupId>
    <artifactId>example-spring-boot-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>example-spring-boot-starter</name>
    <description>自定义Starter</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.15.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
</project>
  • 建立属性配置类
package com.hanson.example.spring.boot.starter.ext;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Data
@ConfigurationProperties(prefix = "hanson")
public class HansonProperties {
    private String name;
    private Integer age;
}
  • 建立应用属性配置类程序
package com.hanson.example.spring.boot.starter.ext;

import lombok.Data;

@Data
public class HansonService {
    private HansonProperties hansonProperties;

    public String introduce() {
        return "hello,i am " + hansonProperties.getName() +
                " and i am " + hansonProperties.getAge() + "years old!";
    }

}
  • 建立自动配置类
package com.hanson.example.spring.boot.starter;

import com.hanson.example.spring.boot.starter.ext.HansonProperties;
import com.hanson.example.spring.boot.starter.ext.HansonService;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(HansonProperties.class)
public class HansonAutoConfiguration {
    @Bean
    public HansonService hansonService(HansonProperties hansonProperties) {
        HansonService hansonService = new HansonService();
        hansonService.setHansonProperties(hansonProperties);
        return hansonService;
    }
}
  • 新增spring.factories文件 在类路径下建立META-INF文件夹,在该文件下建立一个spring.factories文件。其内容以下
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.hanson.example.spring.boot.starter.HansonAutoConfiguration
  • 打包安装

4.二、测试程序

  • 利用IDEA 建立一个Spring Boot工程,依赖以下
<?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>com.hanson</groupId>
	<artifactId>example-spring-boot-starter-test</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>example-spring-boot-starter-test</name>
	<description>自定义Starter测试</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.16.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		<!--导入咱们自定义的依赖-->
		<dependency>
			<groupId>com.hanson</groupId>
			<artifactId>example-spring-boot-starter</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>
  • 编写配置文件

在application.yml或者application.properties添加一下配置apache

hanson.name=Hanson
hanson.age=25
  • 编写主程序测试
package com.hanson.example.spring.boot.starter.test;

import com.hanson.example.spring.boot.starter.ext.HansonService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class ExampleSpringBootStarterTestApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = 
                SpringApplication.run(ExampleSpringBootStarterTestApplication.class, args);
        HansonService bean = context.getBean(HansonService.class);
        System.out.println(bean.introduce());
    }
}
  • 运行结果
2018-09-14 19:46:29.157  INFO 2184 --- [           main] .ExampleSpringBootStarterTestApplication : Started ExampleSpringBootStarterTestApplication in 0.966 seconds (JVM running for 2.281)
hello,i am Hanson and i am 25years old!
2018-09-14 19:46:29.167  INFO 2184 --- [       Thread-4] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@120d6fe6: startup date [Fri Sep 14 19:46:28 CST 2018]; root of context hierarchy
2018-09-14 19:46:29.167  INFO 2184 --- [       Thread-4] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown
相关文章
相关标签/搜索