Kotlin編譯器插件

全開放編譯器插件

Kotlin 有類及其默認爲 final 的成員,這使得像 Spring AOP 這樣需要類爲 open 的框架和庫用起來很不方便。
這個 all-open 編譯器插件會適配 Kotlin 以滿足那些框架的需求,並使用指定的註解標註類而其成員無需顯式使用 open 關鍵字打開。
例如,當你使用 Spring 時,你不需要打開所有的類,而只需要使用特定的註解標註,如
[@Configuration](https://github.com/Configuration "@Configuration")[@Service](https://github.com/Service "@Service")
all-open 插件允許指定這些註解。

我們爲全開放插件提供 Gradle 和 Maven 以及 IDE 集成的支持。
對於 Spring,你可以使用 kotlin-spring 編譯器插件(見下文)。

如何使用全開放插件

build.gradle 中添加插件:

buildscript {
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
    }
}

apply plugin: "kotlin-allopen"

或者,如果你使用 Gradle 插件 DSL,將其添加到 plugins 塊:

plugins {
  id "org.jetbrains.kotlin.plugin.allopen" version "<使用的版本>"
}

然後指定會打開該類的註解:

allOpen {
    annotation("com.my.Annotation")
}

如果類(或任何其超類)標有 com.my.Annotation 註解,類本身及其所有成員會變爲開放。

它也適用於元註解:

@com.my.Annotation
annotation class MyFrameworkAnnotation

@MyFrameworkAnnotation
class MyClass // 將會全開放

MyFrameworkAnnotation 也是使類打開的註解,因爲它標有 com.my.Annotation 註解。

下面是全開放與 Maven 一起使用的用法:

<plugin>
    <artifactId>kotlin-maven-plugin</artifactId>
    <groupId>org.jetbrains.kotlin</groupId>
    <version>${kotlin.version}</version>

    <configuration>
        <compilerPlugins>
            <!-- 或者 "spring" 對於 Spring 支持 -->
            <plugin>all-open</plugin>
        </compilerPlugins>

        <pluginOptions>
            <!-- 每個註解都放在其自己的行上 -->
            <option>all-open:annotation=com.my.Annotation</option>
            <option>all-open:annotation=com.their.AnotherAnnotation</option>
        </pluginOptions>
    </configuration>

    <dependencies>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-allopen</artifactId>
            <version>${kotlin.version}</version>
        </dependency>
    </dependencies>
</plugin>

Kotlin-spring 編譯器插件

你無需手動指定 Spring 註解,你可以使用 kotlin-spring 插件,它根據 Spring 的要求自動配置全開放插件。

buildscript {
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
    }
}

apply plugin: "kotlin-spring"

或者使用 Gradle 插件 DSL:

plugins {
  id "org.jetbrains.kotlin.plugin.spring" version "<使用的版本>"
}

其 Maven 示例與上面的類似。

該插件指定了以下註解:
@Component
@Async
@Transactional
@Cacheable
由於元註解的支持,標註有 [@Configuration](https://github.com/Configuration "@Configuration")[@Controller](https://github.com/Controller "@Controller")[@RestController](https://github.com/RestController "@RestController")[@Service](https://github.com/Service "@Service") 或者 [@Repository](https://github.com/Repository "@Repository") 的類會自動打開,因爲這些註解標註有元註解 [@Component](https://github.com/Component "@Component")

當然,你可以在同一個項目中同時使用 kotlin-allopenkotlin-spring
請注意,如果你使用 start.spring.iokotlin-spring 插件將默認啓用。

無參編譯器插件

無參(no-arg)編譯器插件爲具有特定註解的類生成一個額外的零參數構造函數。
這個生成的構造函數是合成的,因此不能從 Java 或 Kotlin 中直接調用,但可以使用反射調用。
這允許 Java Persistence API(JPA)實例化 data 類,雖然它從 Kotlin 或 Java 的角度看沒有無參構造函數(參見下面的 kotlin-jpa 插件的描述)。

如何使用無參插件

其用法非常類似於全開放插件。
添加該插件並指定註解的列表,這些註解一定會導致被標註的類生成無參構造函數。

在 Gradle 中使用無參插件方法:

buildscript {
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"
    }
}

apply plugin: "kotlin-noarg"

或者使用 Gradle 插件 DSL:

plugins {
  id "org.jetbrains.kotlin.plugin.noarg" version "<使用的版本>"
}

然後指定註解類型:

noArg {
    annotation("com.my.Annotation")
}

在 Maven 中使用無參插件方法:

<plugin>
    <artifactId>kotlin-maven-plugin</artifactId>
    <groupId>org.jetbrains.kotlin</groupId>
    <version>${kotlin.version}</version>

    <configuration>
        <compilerPlugins>
            <!-- 或者 "jpa" 對於 JPA 支持 -->
            <plugin>no-arg</plugin>
        </compilerPlugins>

        <pluginOptions>
            <option>no-arg:annotation=com.my.Annotation</option>
        </pluginOptions>
    </configuration>

    <dependencies>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-noarg</artifactId>
            <version>${kotlin.version}</version>
        </dependency>
    </dependencies>
</plugin>

Kotlin-jpa 編譯器插件

該插件指定
@Entity
@Embeddable
註解作爲應該爲一個類生成無參構造函數的標記。
這就是如何在 Gradle 中添加該插件的方法:

buildscript {
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"
    }
}

apply plugin: "kotlin-jpa"

或者使用 Gradle 插件 DSL:

plugins {
  id "org.jetbrains.kotlin.plugin.jpa" version "<使用的版本>"
}

其 Maven 示例與上面的類似。