使用了Spring Boot的朋友对starter并不陌生,使用也是极其简单,比如你要使用jdbc只需要引入spring-boot-starter-jdbc,要使用JPA只需要引入spring-boot-starter-data-jpa,使用非常方便,大家也不必太在意他们内部的依赖关系,那starter这么好用,能否自己定义一个starter呢?答案是肯定的,本篇介绍一下如何自定义一个starter。
下面就介绍一些如何自定义一个starter,本案例的starter对外提供一个BookServcie,通过配置配置文件,对service实现自动装配。
1、新建一个maven项目,pom文件如下:
4.0.0 com.wang.boot com-boot-starter-demo 0.0.1-SNAPSHOT jar demostarter UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-autoconfigure 1.4.4.RELEASE org.springframework.boot spring-boot-configuration-processor 1.4.4.RELEASE org.springframework.boot spring-boot-maven-plugin
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、注册自动配置类
- 在src/main/resources新建META-INF文件夹
- 在META-INF文件夹下新建spring.factories文件
- 注册自动配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.wang.boot.BookServiceAutoConfiguration
6、将starter构建到本地
至此starter编写完成,下面我们编写调用方。
1、新建一个Spring Boot项目,引入以下starter
org.springframework.boot spring-boot-starter-web com.wang.boot com-boot-starter-demo 0.0.1-SNAPSHOT
2、在application.properties中添加相关配置
com.wang.boot.author=wangcom.wang.boot.isbn=12345com.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的扩展性。