ホームページ  >  記事  >  Java  >  SpringBoot が FreeMarker を統合してコード ジェネレーターを実装する方法

SpringBoot が FreeMarker を統合してコード ジェネレーターを実装する方法

WBOY
WBOY転載
2023-05-10 20:37:101143ブラウズ

    1. はじめに

    実際のソフトウェア プロジェクト開発プロセスにおいて、5 年以上実際にコードを書いていれば、責任を持って言えます。追加、削除、変更、検索などの単純な機能要件の開発は完全にやり尽くしたと言えますが、少なくとも私はこのタイプです。

    しかし、ソフトウェア機能の大部分は、最も基本的なユニットに至るまで、基本的には 1 つのテーブルの追加、削除、変更、クエリであることは否定できません。

    ユーザーのニーズが増え続けるにつれて、以前は 1 つのテーブルで実行できた作業が、現在では複数のテーブルまたは複数のライブラリを必要とする可能性があるというだけです。コード層はブロックを積み上げるようなもので、コード層が増えれば増えるほど、積み重ねると、より複雑になります。

    初期のプロジェクトに取り組んでいたとき、プロジェクトに 1 つのテーブルを追加するたびに、コード レベルで CURD## のセットを次のように書き直す必要があったことを思い出します。 MVC フレームワークのアイデアを使用すると、基本的な追加、削除、変更、チェックをすべて書くのに少なくとも 20 分かかります。早い人であれば、次の手順で 10 分かかります。最速。

    新しく開発した関数で 10 個の新しいテーブルを追加する必要がある場合、この時間を基準にすると少なくとも 100 分かかります。よく考えてみると、実際には、これらの単純な作業にほとんどの時間が無駄に費やされていることがわかります。複雑な機能を備えた反復的なプログラミングサークルに参加しました。

    これらの単純な

    CURD コードをすべて標準化して公開する方法はありますか?このようにして、ビジネス シナリオの開発に投資する時間を大幅に節約できます。

    答えは「はい、はい」です。

    私が初期の頃に最初に触れたのは

    MybatisGenertor ツールキットだったことを覚えています。このツールキットを通じて、xml# の大部分を ## に保存できます。 #mybaits ##ファイル カード 執筆作業。 また、おなじみの JPA

    もあります。これには、パブリック永続層の動的プロキシ クラスのセットがあり、名前に基づいて

    SQL ステートメントを自動的に生成できます。開発時間を節約できます。多くのことが起こります。 でも、私は怠け者なので、controller

    serviceentity dao## からツールを構築したいと考えています。 #Layer、単体テスト クラスを含むすべての crud コードはツールによって自動的に生成されます。 現在、インターネット上にはこのようなツールがたくさんあります。たとえば、私たちがよく知っている Mybatis-plus プラグインなど、これを行うことができ、非常に使いやすいです。

    しかし、一部の企業はこれを好まないのですが、その理由は非常に単純です。その中の多くのパブリック メソッドが深くカプセル化されすぎており、多くの crud

    sql

    はすべて動的に生成されるため、まったく見えません。 要するに、それは自分のコントロールの範囲内ではありません。多くのプログラマは常にさまざまな疑問を抱いています~~ もちろん、マイクロサービスについても明らかな疑問があります。開発を完全にサポートすることはできません。たとえば、プロジェクトが

    SpringBoot Dubbo

    の組み合わせを使用して開発されている場合、この時点で生成される

    controller

    はまったく役に立たず、無味です。 したがって、この場合、迅速な開発のニーズを満たすために、現在のプロジェクトのソフトウェア開発ルールに基づいて独自のコード ジェネレーターを開発する必要があります。 ここで、コードジェネレーターを自分で開発する方法を簡単に紹介します。

    2. コードの実践

    実際、コード ジェネレーターの開発は、誰もが考えているほど複雑ではありません。その中で使用される最も重要なテクノロジは、テンプレートを使用してコード

    を生成することです。私たちがよく使用するテンプレート エンジン

    freemarker

    がこれを実現するのに役立ちます。

    2.1. まず、freemarker 依存関係パッケージ

    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.23</version>
    </dependency>
    2.2 を追加し、コード テンプレートを作成します

    例としてエンティティ クラスを動的に作成して、エンティティ クラスのテンプレート。

    entity.java.ftl

    ${}

    は動的変数を定義します。

    package ${package};
    
    import java.io.Serializable;
    
    /**
     * <p>
     * ${tableComment}
     * </p>
     *
     * @author ${author}
     * @since ${date}
     */
    public class ${entityClass} implements Serializable {
    
        private static final long serialVersionUID = 1L;
        
        <#--属性遍历-->
        <#list columns as pro>
    
        /**
         * ${pro.comment}
         */
        private ${pro.propertyType} ${pro.propertyName};
        </#list>
    
        <#--属性get||set方法-->
        <#list columns as pro>
        public ${pro.propertyType} get${pro.propertyName?cap_first}() {
            return this.${pro.propertyName};
        }
    
        public ${entityClass} set${pro.propertyName?cap_first}(${pro.propertyType} ${pro.propertyName}) {
            this.${pro.propertyName} = ${pro.propertyName};
            return this;
        }
        </#list>
    }
    2.3. 最後にターゲット コードを生成します最後に、freemarker

    に基づいてテスト クラスを作成します。

    public class CodeGeneratorDemo {
    
        public static void main(String[] args) throws IOException, TemplateException {
            Map<String, Object> objectMap = new HashMap<>();
            //定义包路径
            objectMap.put("package", "com.example.test");
            //定义实体类
            objectMap.put("entityClass", "Student");
    
            //定义实体类属性
            List<Map<String, Object>> columns = new ArrayList<>();
            //姓名字段
            Map<String, Object> column1 = new HashMap<>();
            column1.put("propertyType", "String");
            column1.put("propertyName", "name");
            column1.put("comment", "姓名");
            columns.add(column1);
            //年龄字段
            Map<String, Object> column2 = new HashMap<>();
            column2.put("propertyType", "Integer");
            column2.put("propertyName", "age");
            column2.put("comment", "年龄");
            columns.add(column2);
    
            //定义类的属性
            objectMap.put("columns", columns);
            //定义作者
            objectMap.put("author", "张三");
            //定义创建时间
            objectMap.put("date", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
            //定义类描述
            objectMap.put("tableComment", "学生信息");
    
            //生产目标代码
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
            configuration.setDefaultEncoding(Charset.forName("UTF-8").name());
            configuration.setClassForTemplateLoading(CodeGeneratorDemo.class, "/");
            Template template = configuration.getTemplate("/templates/entity.java.ftl");
            FileOutputStream fileOutputStream = new FileOutputStream(new File("../src/main/java/com/example/generator/Student.java"));
            template.process(objectMap, new OutputStreamWriter(fileOutputStream, Charset.forName("UTF-8").name()));
            fileOutputStream.close();
            System.out.println("文件创建成功");
    
        }
    }

    プログラムを実行すると、出力ファイルの結果は次のようになります。

    package com.example.test;
    
    import java.io.Serializable;
    
    /**
     * <p>
     * 学生信息
     * </p>
     *
     * @author 张三
     * @since 2021-08-22
     */
    public class Student implements Serializable {
    
        private static final long serialVersionUID = 1L;
        
    
        /**
         * 姓名
         */
        private String name;
    
        /**
         * 年龄
         */
        private Integer age;
    
        public String getName() {
            return this.name;
        }
    
        public Student setName(String name) {
            this.name = name;
            return this;
        }
        public Integer getAge() {
            return this.age;
        }
    
        public Student setAge(Integer age) {
            this.age = age;
            return this;
        }
    }
    期待された効果と一致し、正常に生成されました。

    例として私はこの方法を使っていますが、まずツールで生成するコードをすべてテンプレートで定義します。

    次に、データベースに接続して、自動的に生成する必要があるテーブル構造をクエリし、それをデータ レンダリング パラメーターにカプセル化して、最後に

    freemarker# に渡します。 ## 必要なコードを生成するのは非常に簡単かつ迅速で、単一テーブルの

    crudSpringBoot が FreeMarker を統合してコード ジェネレーターを実装する方法 はすべて 1 ステップで完了します。

    以下は、現在のプロジェクトに基づいてエディターによってカスタマイズおよび開発されたコード ジェネレーターです。プロジェクトは、SpringBoot Dubbo フレームワークを使用して開発されています。Controller はありません。すべてのコードはコード ジェネレーターを使用して生成され、単体テストを通じて直接実行できます。開発は非常に高速です。

    以上がSpringBoot が FreeMarker を統合してコード ジェネレーターを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。