文档章节

在Spring boot中自定义starter

老虎是个蛋蛋
 老虎是个蛋蛋
发布于 2017/02/25 13:17
字数 696
阅读 2187
收藏 47

    使用了Spring Boot的朋友对starter并不陌生,使用也是极其简单,比如你要使用jdbc只需要引入spring-boot-starter-jdbc,要使用JPA只需要引入spring-boot-starter-data-jpa,使用非常方便,大家也不必太在意他们内部的依赖关系,那starter这么好用,能否自己定义一个starter呢?答案是肯定的,本篇介绍一下如何自定义一个starter。

    下面就介绍一些如何自定义一个starter,本案例的starter对外提供一个BookServcie,通过配置配置文件,对service实现自动装配。

    1、新建一个maven项目,pom文件如下:

<?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.wang.boot</groupId>
	<artifactId>com-boot-starter-demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>
	<name>demostarter</name>

	<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-autoconfigure</artifactId>
			<version>1.4.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<version>1.4.4.RELEASE</version>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

    2、创建装配类

@ConfigurationProperties(prefix = "com.wang.boot")//定义application.properties配置文件中的配置前缀
public class BookPropertiesService {
    private String name;
    private String isbn;
    private String author;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
}

    3、编写starter对外提供的service

public class BookService {
    private BookPropertiesService bookPropertiesService;
    public BookService(BookPropertiesService bookPropertiesService){
        this.bookPropertiesService=bookPropertiesService;
    }
    public BookService(){
    }

    public String getName(){
        return bookPropertiesService.getName();
    }

    public String getIsbn() {
        return bookPropertiesService.getIsbn();
    }

    public String getAuthor() {
        return bookPropertiesService.getAuthor();
    }

}

    4、创建自动配置类

@Configuration
@EnableConfigurationProperties(BookPropertiesService.class)//指定类的配置
@ConditionalOnClass(BookService.class)//当BookService在类路径中时并且当前容器中没有这个Bean的情况下,自动配置
@ConditionalOnProperty(prefix = "com.wang.boot",value = "enable",matchIfMissing = true)//指定的属性是否有指定的值
public class BookServiceAutoConfiguration {
    @Autowired
    private BookPropertiesService bookPropertiesService;

    @Bean
    @ConditionalOnMissingBean(BookService.class)//当容器中没有指定Bean的情况下
    public BookService bookService(){
        BookService bookService = new BookService(bookPropertiesService);
        return bookService;
    }
}

    5、注册自动配置类

  1. 在src/main/resources新建META-INF文件夹
  2. 在META-INF文件夹下新建spring.factories文件
  3. 注册自动配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.wang.boot.BookServiceAutoConfiguration

    6、将starter构建到本地

    至此starter编写完成,下面我们编写调用方。

    1、新建一个Spring Boot项目,引入以下starter

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--自定义的starter-->
<dependency>
    <groupId>com.wang.boot</groupId>
    <artifactId>com-boot-starter-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

    2、在application.properties中添加相关配置

com.wang.boot.author=wang
com.wang.boot.isbn=12345
com.wang.boot.name=SpringBoot

    3、编写Controller测试service

@RestController
@RequestMapping("/book")
public class BookController {
    @Autowired
    private BookService bookService;

    @RequestMapping("/bookInfo")
    public String getBookInfo(){
        StringBuffer sb = new StringBuffer();
        sb.append("book name:").append(bookService.getName())
                .append(",isbn:").append(bookService.getIsbn())
                .append(",author:").append(bookService.getAuthor());
        return sb.toString();
    }
}

    在浏览器中输入http://localhost:8080/book/bookInfo,测试结果如下

    通过上面几步,我们构建了一个自定义的starter,在Spring Boot中有很多第三方的starter,极大的提高了Spring Boot的扩展性。

© 著作权归作者所有

老虎是个蛋蛋
粉丝 173
博文 31
码字总数 40085
作品 0
朝阳
高级程序员
私信 提问
加载中

评论(3)

老虎是个蛋蛋
老虎是个蛋蛋 博主

引用来自“王浩鑫”的评论

整个流程很好, 但是有点小问题, 就是BookService 应该添加@Service注解, 否则使用的时候不能注入

@Andys-Idea 是应该加,写的时候遗漏了
常柏草
常柏草
整个流程很好, 但是有点小问题, 就是BookService 应该添加@Service注解, 否则使用的时候不能注入
源远流长啊
好的分享,谢谢
spring boot 之依赖

spring boot 虽然不强制使用特殊的依赖。但是其提供了一些非常高效的依赖。其中最有如下几个: spring-boot-starter-parent spring-boot-starter-data-jpa数据库连接的依赖。 spring-cloud-c...

乾坤刀
2018/05/28
0
0
对照谈-官方spring-boot-starter和自定义starter异同分析

在前面我讲用spring-boot-starter-mail发邮件的时候,我侧重看的是spring boot发邮件的便利性,今天,我们聊下另外一个方面,spring-boot-starter自身的便利性。 1、看看官方starter的jar里面...

wphmoon
10/10
30
0
自定义spring boot starter三部曲之一:准备工作

版权声明:欢迎转载,请注明出处,谢谢。 https://blog.csdn.net/boling_cavalry/article/details/82956512 从本章开始,一起实战一个自定义的spring boot starter,整个系列共三篇文章,内容...

博陵精骑
2018/10/08
0
0
SpringBoot 自定义starter

1 先创建一个空项目(自己起名字) 2 在1步骤中创建的空项目中创建两个模块,创建方式如下图所示 1)创建启动器模块用maven项目我的启动器名称为 mao-spring-boot-starter pom.xml如下所示 ...

南桥北木
07/11
51
0
【Spring Boot】16.自定义starter

自定义starter 自定义starter: 这个场景需要使用到的依赖是什么? 如何编写自动配置? 以我们web场景启动器的自动配置类WebMVCAutoConfiguration类为例: 在自动配置类中,经常可以看到如下...

落花时节又逢卿
2018/12/27
78
0

没有更多内容

加载失败,请刷新页面

加载更多

PCB设计-Allegro软件入门系列-铺铜操作(下)

铺铜是PCB很常见的操作,PCB的敷铜一般都是覆地铜,增大地线面积,有利于地线阻抗降低,使电源和信号传输稳定,在高频的信号线附近敷铜,可大大减少电磁辐射干扰,起屏蔽作用。 本讲讲解啊一...

demyar
1分钟前
0
0
如何通过WASI SDK 在Linux上编译ZXing C++

Mozilla在今年三月份的时候公布了WASI。WASI的目标就是让WebAssembly在任何地方都可以运行,而不仅仅像现在这样只能运行在Node.js和Web浏览器中。WASI目前依然处于初级阶段,这篇文章分享下如...

yushulx
3分钟前
0
0
.Net界面开发神器—DevExpress官方汉化包免费下载!还在等什么?

点击获取DevExpress v19.1.7新版试用下载 DevExpress Localization Service允许您创建一组自定义的附属程序集,要将语言包添加到程序集中,请查看本文中为大家列出的对应版本的汉化包,下载并...

FILA6666
3分钟前
0
0
php生成二维码

        header('Content-Type: image/png');        //清除缓冲区,防止之前面不知道的情况下被加头部信息导致不显示图片内容        ob_clean();        $...

横着走的螃蟹
8分钟前
0
0
伪类和伪元素

伪类和伪元素 伪类和伪元素,对于绝大多数同学来说,都是耳熟能详的名字,但确实又有很多人搞不清楚它们之间的区别,以致于混淆概念。而当概念都混淆的时候,也往往意味着你不会经常使用它,...

不负好时光
11分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部