Kotlin 有類及其默認(rèn)為 final 的成員,這使得像 Spring AOP 這樣需要類為 open 的框架和庫用起來很不方便。
這個(gè) all-open 編譯器插件會(huì)適配 Kotlin 以滿足那些框架的需求,并使用指定的注解標(biāo)注類而其成員無需顯式使用 open 關(guān)鍵字打開。
例如,當(dāng)你使用 Spring 時(shí),你不需要打開所有的類,而只需要使用特定的注解標(biāo)注,如@Configuration 或 @Service。all-open 插件允許指定這些注解。
我們?yōu)槿_放插件提供 Gradle 和 Maven 以及 IDE 集成的支持。
對(duì)于 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 "<使用的版本>"
}
然后指定會(huì)打開該類的注解:
allOpen {
annotation("com.my.Annotation")
}
如果類(或任何其超類)標(biāo)有 com.my.Annotation 注解,類本身及其所有成員會(huì)變?yōu)殚_放。
它也適用于元注解:
@com.my.Annotation
annotation class MyFrameworkAnnotation
@MyFrameworkAnnotation
class MyClass // 將會(huì)全開放
MyFrameworkAnnotation 也是使類打開的注解,因?yàn)樗鼧?biāo)有 com.my.Annotation 注解。
下面是全開放與 Maven 一起使用的用法:
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<configuration>
<compilerPlugins>
<!-- 或者 "spring" 對(duì)于 Spring 支持 -->
<plugin>all-open</plugin>
</compilerPlugins>
<pluginOptions>
<!-- 每個(gè)注解都放在其自己的行上 -->
<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>
你無需手動(dòng)指定 Spring 注解,你可以使用 kotlin-spring 插件,它根據(jù) Spring 的要求自動(dòng)配置全開放插件。
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。
由于元注解的支持,標(biāo)注有 @Configuration、 @Controller、 @RestController、 @Service 或者 @Repository 的類會(huì)自動(dòng)打開,因?yàn)檫@些注解標(biāo)注有元注解 @Component。
當(dāng)然,你可以在同一個(gè)項(xiàng)目中同時(shí)使用 kotlin-allopen 和 kotlin-spring。
請(qǐng)注意,如果你使用 start.spring.io,kotlin-spring 插件將默認(rèn)啟用。
無參(no-arg)編譯器插件為具有特定注解的類生成一個(gè)額外的零參數(shù)構(gòu)造函數(shù)。
這個(gè)生成的構(gòu)造函數(shù)是合成的,因此不能從 Java 或 Kotlin 中直接調(diào)用,但可以使用反射調(diào)用。
這允許 Java Persistence API(JPA)實(shí)例化 data 類,雖然它從 Kotlin 或 Java 的角度看沒有無參構(gòu)造函數(shù)(參見下面的 kotlin-jpa 插件的描述)。
其用法非常類似于全開放插件。
添加該插件并指定注解的列表,這些注解一定會(huì)導(dǎo)致被標(biāo)注的類生成無參構(gòu)造函數(shù)。
在 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" 對(duì)于 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
注解作為應(yīng)該為一個(gè)類生成無參構(gòu)造函數(shù)的標(biāo)記。
這就是如何在 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 示例與上面的類似。