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-allopen
和 kotlin-spring
。
請注意,如果你使用 start.spring.io,kotlin-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 示例與上面的類似。