上篇已经深入分析了Java9中的模块化,有读者又提到了module与starter是什么关系?本篇将进行分析。

首先先回顾下module与maven/gradle的关系:

module与maven/gradle是什么关系?

模块化的依赖关系,很容易让人联想到mven和gradle,这个在上篇中也提及,后来有读者也提出module和maven是什么关系?解答如下:

Maven 有两个主要的特征:依赖管理和构建管理。
依赖管理即可以决定库中的版本并从仓库中下载下来。
构建管理即管理开发过程中的任务,包括初始化、编译、测试、打包等。

Module是系统内置用于表述组件之间的关系,对于版本的管理还是处于最原始的状体,管理一种强制的依赖关系。

总结一下:Maven还是主要负责构建管理,Modules 对于像Maven这样的构建工具(build tools)来说扮演的是辅助补充的角色。因为这些构建工具在构建时建立的依赖关系图谱和他们版本可以根据Module来创建,Module强制确定了module和artifacts之间的依赖关系,而Maven对于依赖并非是强制的。
具体可参考StackOverflow上的一篇问答:Project Jigsaw vs Maven on StackOverflow

说到starter,如果用过SpringBoot的开发者可能很熟悉,Starter主要用来简化依赖用的。

Starter是什么?

Starter主要用来简化依赖用的

  • Starter前时代

在Starter之前做MVC时要引入日志组件,比如log4j,那么需要找到依赖的log4j的版本,有的时候版本不匹配也会出现问题,因为我们也不知道依赖什么版本,那么Starter就应运而生。

  • Starter

我们要在SpringBoot中引入WebMVC的支持时,我们只需引入这个模块spring-boot-starter-web,有了Starter之后,log4j就自动引入了,也不用关心版本这些问题,将这个模块如果解压包出来会发现里面什么都没有,只定义了一些POM依赖,所以说Starter的作用主要是简化依赖。

  • SpringBoot Starters

《Spring Boot in Action》的附录B列出了SpringBoot Starters的内容:

Starter(Group ID: org.springframework.boot) 传递依赖
spring-boot-starter-web org.springframework.boot:spring-boot-starter
org.springframework.boot:spring-boot-starter-tomcat
org.springframework.boot:spring-boot-starter-validation
com.fasterxml.jackson.core:jackson-databind
org.springframework:spring-web
org.springframework:spring-webmvc
spring-boot-starter-log4j2 org.apache.logging.log4j:log4j-slf4j-impl
org.apache.logging.log4j:log4j-api
org.apache.logging.log4j:log4j-core
org.slf4j:jcl-over-slf4j
org.slf4j:jul-to-slf4j
... ....

如何定义自己的Starter?

  • 基于已有starter进行扩展(pom.xml)
<!-- 依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 添加依赖 -->
<dependencies>
<!-- 自动配置依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>1.5.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>1.5.2.RELEASE</version>
<optional>true</optional>
</dependency>
</dependencies>
复制代码
  • 定义自动配置配置类
package net.hellomypastor.springboot.starter;

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

@ConfigurationProperties(prefix="dog.proterties")
public class DogProperties {
private String name;
private int age;
//set、get
}
复制代码
package net.hellomypastor.springboot.starter;

public class DogService {
private DogProperties dogProperties; public DogService() { } public DogService(DogProperties dogProperties) {
this.dogProperties = dogProperties;
} public String getDogName() {
return dogProperties.getName();
} public int getDogAge() {
return dogProperties.getAge();
}
}
复制代码
package net.hellomypastor.springboot.starter;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
@EnableConfigurationProperties(DogProperties.class)
@ConditionalOnClass(DogService.class)
@ConditionalOnProperty(prefix="dog.proterties", value="enabled", matchIfMissing=true)
public class DogAutoConfiguration {
@Autowired
private DogProperties dogProperties; @Bean
@ConditionalOnMissingBean(DogService.class)
public DogService personService() {
DogService dogService = new DogService(dogProperties);
return dogService;
}
} 复制代码
  • 修改META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=net.hellomypastor.configure.DogAutoConfiguration
复制代码
  • 打包

spring官方说明定义starter时最好是按*-spring-boot-starter的格式进行命名

mvn clean install
复制代码
  • 使用

将上述starter作为依赖,并配置application.properties:

dog.properties.name=dog2018
dog.properties.age=1
复制代码

那么在类中只要注入DogService就能获取到配置的值:

package net.hellomypastor.springboot.starter;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping("/dog")
public class DogController {
@Autowired
private DogService dogService; @GetMapping("name")
public String getDogName() {
return dogService.getDogName();
} @GetMapping("age")
public int getDogAge() {
return dogService.getDogAge();
}
}
复制代码

测试请求结果:

http:127.0.0.1:8080/starterdemo/dog/name
结果:dog2018
http:127.0.0.1:8080/starterdemo/dog/age
结果:1
复制代码

好了,本期就讲到这里,下期我们讲讲Java9中到另一个新工具JShell,敬请期待~

微信公众号:码上论剑
请关注我的个人技术微信公众号,订阅更多内容

Java9新特性系列(module&maven&starter)的更多相关文章

  1. Java9 新特性 详解

    作者:木九天   <   Java9 新特性 详解  > Java9 新特性 详解 摘要: 1.目录结构 2.repl工具 jShell命令 3.模块化 4.多版本兼容jar包 5.接口方 ...

  2. 【Java基础】Java9 新特性

    Java9 新特性 模块化系统 Java 和相关生态在不断丰富的同时也越来越暴露出一些问题: Java 运行环境的膨胀和臃肿.每次 JVM 启动的时候,至少会 30-60MB 的内存加载,主要原因是 ...

  3. 点击--》java9 新特性 详解

    引言: 点击-->java9 新特性 详解 点击-->java8 新特性 详解 正题: 1.局部变量var 将前端思想var关键字引入java后段,自动检测所属于类型,一种情况除外,不能为 ...

  4. 传统JIT和java9新特性AOT理解

    java慢的原因 1.  除了少量基本类型用栈存储外,所有对象都使用堆存储.堆的性能低于栈. 2.  很多强制类型转换(cast)或加查,耗用内存大.java运行时对类型检测,如果类型不正确会抛出Cl ...

  5. Java8新特性系列-默认方法

    Java8 Interface Default and Static Methods 原文连接:Java8新特性系列-默认方法 – 微爱博客 在 Java 8 之前,接口只能有公共抽象方法. 如果不强 ...

  6. Java8新特性系列-Lambda

    转载自:Java8新特性系列-Lambda – 微爱博客 Lambda Expressions in Java 8 Lambda 表达式是 Java 8 最流行的特性.它们将函数式编程概念引入 Jav ...

  7. Java9新特性之——JShell

    java9已经在北京时间9月22日正式发布,开发者可以在oracle jdk官网上下载到最新的jdk9.jdk9和jdk8中的新特性不同:jdk8中的stream和lambda表达式能够让开发者非常快 ...

  8. Java9 新特性

    Java9中的9个新特性 1. Java 平台级模块系统 2. Linking 3. JShell: 交互式 Java REPL 4. 改进的 Javadoc 5. 集合工厂方法 6. 改进的 Str ...

  9. Java9新特性

    转载:http://blog.csdn.net/qq_32524177/article/details/77014757 写在前面的话:Java9来了,搜索了很多关于Java9的新特性,但文献不多,特 ...

随机推荐

  1. Java第七天,类的继承

    面向对象编程的三大特征: 封装.继承.多态 今天我们学习继承! 继承是多态的前提,如果没有继承就没有多态. 继承主要解决的问题就是共性抽取(将许多类共有的特性便作父类,这样可以较大程度的优化代码). ...

  2. MySQL中的事务和MVCC

    本篇博客参考掘金小册--MySQL 是怎样运行的:从根儿上理解 MySQL 以及极客时间--MySQL实战45讲. 虽然我们不是DBA,可能对数据库没那么了解,但是对于数据库中的索引.事务.锁,我们还 ...

  3. c++ 启发式搜索解决八数码问题

    本文对八数码问题 启发式搜索 (C++)做了一点点修改 //fn=gn+hn #include<iostream> #include<queue> #include<st ...

  4. 【DataBase】更改root根用户密码 和 SQLyog安装

    更改root根用户密码 和 SQLyog安装 无密码登录MySQL mysql -u root -p 修改密码与更新加密规则 ALTER USER 'root'@'localhost' IDENTIF ...

  5. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十二)之Error Handling with Exceptions

    The ideal time to catch an error is at compile time, before you even try to run the program. However ...

  6. Salesforce Admin考题解析 | 流程自动化考题与知识点拓展

    [题目1] A record is modified on 1/1/2008. It meets criteria for a time-based workflow rule; this rule ...

  7. Cyclic Nacklace 杭电3746

    CC always becomes very depressed at the end of this month, he has checked his credit card yesterday, ...

  8. Python刷CSDN阅读数(仅供娱乐)

    #!/usr/bin/env python # -*- coding: utf-8 -*- """ @File:csdn_reads.py @E-mail:3649427 ...

  9. vue2.x学习笔记(十)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12584237.html. 事件处理 使用javascript当然少不了事件处理,即使是vue也不会例外. 监听事件 ...

  10. 设计模式-原型模式(Prototype)【重点:浅复制与深复制】

    讲故事 最近重温了一下星爷的<唐伯虎点秋香>,依然让我捧腹不已,幻想着要是我也能有一名秋香如此的侍女,夫复何求呀,带着这个美好的幻想沉沉睡去... 突然想到,我是一名程序猿呀,想要什么对象 ...