start.sping.ioコード研究と二次開発

   SpringはJava開発者の聖書であり、公式Webサイトhttps://spring.ioは説教の場として機能します。もちろん、開発者は、公式に推奨されるプロジェクトコード仕様を含め、Springに関するほぼすべての情報を見つけることができます。その中で、https://start.spring.ioは公式の足場プロジェクトであるだけでなく、初心者がエントリープロジェクトを生成するためによく使用します。このサイトもオープンソースのSpringプロジェクトであり、かなりの誇りを持っています(Gitにもこの誇りがあります)。国内大手メーカーのクラウドプラットフォームもカスタマイズ版をリリース。

関連リソース

プロジェクトリスト

公式サイトドキュメント

ローカルで構築する

   多くの国内開発者は、加速イメージとしてローカルバージョンを構築します。これはstart.spring.ioプロジェクトで最も一般的に使用される関数でもあります。

   このプロジェクトにはhttps://start.spring.ioにあるフロントエンドインターフェイスの構成済みのSpringInitializrインスタンスが付属しています次のモジュールが含まれています。

  • start-client:フロントエンドインターフェイス
  • 開始サイト:バックエンドの基本サービスとメタデータ構成
  • start-site-verification:メタデータテストケース

   実行して、実行./mvnw clean installするtarget /start-site-exec.jar生成します。学ぶ価値がfrontend-maven-pluginあるのは、シェルスクリプトをより標準化されたmavenプラグインに置き換えるプラグインです。

<plugin>
	<groupId>com.github.eirslett</groupId>
	<artifactId>frontend-maven-plugin</artifactId>
	<executions>
		<execution>
			<id>install node and yarn</id>
			<goals>
				<goal>install-node-and-yarn</goal>
			</goals>
			<configuration>
				<nodeVersion>v12.13.0</nodeVersion>
				<yarnVersion>v1.22.4</yarnVersion>
			</configuration>
		</execution>
		<execution>
			<id>yarn install</id>
			<goals>
				<goal>yarn</goal>
			</goals>
		</execution>
		<execution>
			<id>yarn build</id>
			<goals>
				<goal>yarn</goal>
			</goals>
			<configuration>
				<arguments>build</arguments>
			</configuration>
		</execution>
	</executions>
</plugin>

   start-clientプロジェクトは静的リソースをstart-client-0.0.1-SNAPSHOT.jarパッケージstart-site化してから、プロジェクトにインポートします。

コード研究

   公式ドキュメントを読むと、start.spring.ioプロジェクトは単なるファサードであり、initializrは内部にあることがわかります。initializrドキュメントでは、プロジェクトの構造について説明しています。

  • initializr-actuator:プロジェクト生成に関する追加情報と統計を提供するオプションのモジュール。

  • initializr-bom:プロジェクトの依存関係管理を容易にするための部品表を提供します。

  • initializr-docs:ドキュメント。

  • initializr-generator:コアプロジェクト生成ライブラリ。

  • initializr-generator-spring:典型的なSpringBootプロジェクトの規則を定義するオプションのモジュール。再利用したり、独自の規則に置き換えることができます。

  • initializr-generator-test:プロジェクト生成のためのテストインフラストラクチャ。

  • initializr-metadata:プロジェクトのさまざまな側面のメタデータインフラストラクチャ。

  • initializr-service-sample:基本的なカスタムインスタンスを紹介します。

  • initializr-version-resolver:任意のPOMからバージョン番号を抽出するためのオプションのモジュール。

  • initializr-web:サードパーティクライアントのWebエンドポイント。

生成原理を理解するために、主にinitializr-generatorinitializr-generator-springを見てくださいinitializr-generatorProjectGeneratorクラスは、プロジェクト生成の単位です。

public <T> T generate(ProjectDescription description, ProjectAssetGenerator<T> projectAssetGenerator)
		throws ProjectGenerationException {
    
    
	try (ProjectGenerationContext context = this.contextFactory.get()) {
    
    
		registerProjectDescription(context, description);
		registerProjectContributors(context, description);
		this.contextConsumer.accept(context);
		context.refresh();
		try {
    
    
			return projectAssetGenerator.generate(context);
		}
		catch (IOException ex) {
    
    
			throw new ProjectGenerationException("Failed to generate project", ex);
		}
	}
}

   まず、/src/main/resources/META-INF/spring.factories構成ファイルをファイルに登録し、@ProjectGenerationConfigurationアノテーションスキャンで構成取得し、その中の構成項目をトラバースして実行し、コードを生成します。

二次開発

   公式文書は豊富な拡張インターフェースを予約しています詳細についてはセクション6.1.1を参照してください具体的な実装は、構成ファイルを追加または書き換え、アプリケーションレベルの開発のためにstart.spring.ioプロジェクトで直接開発することです。
ここに画像の説明を挿入

キーコード

  • FcsGenerationConfiguration.java
@ProjectGenerationConfiguration
public class FcsGenerationConfiguration {
    
    
	@Bean
	public FcsContributor fcsContributor(ProjectDescription description,TemplateRenderer templateRenderer) {
    
    
		return new FcsContributor(description, templateRenderer);
	}
}
  • FcsContributor.java
public class FcsContributor implements ProjectContributor {
    
    
	
	private final ProjectDescription description;
	private final TemplateRenderer templateRenderer;
	private final String SOURCE_PATH = "src/main/java/";
	
	public FcsContributor(ProjectDescription description, TemplateRenderer templateRenderer) {
    
    
		this.description = description;
		this.templateRenderer = templateRenderer;
	}

	@Override
	public void contribute(Path projectRoot) throws IOException {
    
    
		Map<String, Object> data = new HashMap<>();
		String groupId = description.getGroupId();
		String artifactId = description.getArtifactId();
		data.put("groupId", groupId);
		data.put("artifactId", artifactId);
		
        Path file = Files.createFile(projectRoot.resolve("README.md"));
        String pre = SOURCE_PATH + groupId.replace(".", "/") + "/" + artifactId;
        Files.createDirectories(projectRoot.resolve(pre+"/controller/"));
        Path codeFile = Files.createFile(projectRoot.resolve(pre+"/controller/DemoController.java"));
        String code = this.templateRenderer.render("code/DemoController.java", data);
        try (
        	PrintWriter writer = new PrintWriter(Files.newBufferedWriter(file));
        	PrintWriter codeWriter = new PrintWriter(Files.newBufferedWriter(codeFile));
        ) {
    
    
            writer.println("README");
            codeWriter.print(code);
        }
	}
}

効果を生み出す

ここに画像の説明を挿入

総括する

  • start.spring.ioはスキャフォールディングプロジェクトとして何度も使用されることはありませんが、技術的な指標としてJava開発者が注目する価値があります。
  • そのパッケージ化された建設方法は、後続の建設パイプラインのオプションを提供します。
  • 二次開発はチームの開発スタイルに簡単に適応でき(Mavenプライベートウェアハウスを構成することをお勧めします)、チーム内の開発構造を統一するのに役立ちます。

おすすめ

転載: blog.csdn.net/vipshop_fin_dev/article/details/113101536