Kotlin 有類及其默認為 final 的成員,這使得像 Spring AOP 這樣需要類為 open 的框架和庫用起來很不方便。
這個 all-open 編譯器插件會適配 Kotlin 以滿足那些框架的需求,并使用指定的注解標注類而其成員無需顯式使用 open 關鍵字打開。
例如,當你使用 Spring 時,你不需要打開所有的類,而只需要使用特定的注解標注,如@Configuration 或 @Service。all-open 插件允許指定這些注解。
我們?yōu)槿_放插件提供 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 注解,類本身及其所有成員會變?yōu)殚_放。
它也適用于元注解:
@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>
你無需手動指定 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、 @Controller、 @RestController、 @Service 或者 @Repository 的類會自動打開,因為這些注解標注有元注解 @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>
該插件指定@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 示例與上面的類似。