spring5开始了对kotlin一个很好的支持,当然坑也无数,今天闲来无事,成功搭建起来了这个项目。
采用idea,项目用maven管理,并且引入了spring_kotlin官方插件支持,以及Noarg插件。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<repositories>
<repository>
<id>central</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<name>aliyun</name>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<jvmTarget>1.8</jvmTarget>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<configuration>
<compilerPlugins>
<!-- spring_kotlin官方插件,为aop代理类去final关键字 -->
<plugin>spring</plugin>
<!-- kotlin官方插件,为被注解的指定类添加无参构造方法 -->
<plugin>no-arg</plugin>
</compilerPlugins>
<pluginOptions>
<option>no-arg:annotation=com.anno.NoArg</option>
<!-- 在合成的构造函数中调用实例初始化器 -->
<!-- <option>no-arg:invokeInitializers=true</option> -->
</pluginOptions>
</configuration>
</plugin>
</plugins>
</build>
<groupId>groupId</groupId>
<artifactId>spring5</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<spring.version>5.0.3.RELEASE</spring.version>
<mybatis.version>3.4.2</mybatis.version>
<mybatis.spring.version>1.3.2</mybatis.spring.version>
<mysql.version>5.1.46</mysql.version>
<druid.version>1.0.9</druid.version>
<slf4j.version>1.6.4</slf4j.version>
<jstl.version>1.2</jstl.version>
<servlet-api.version>2.5</servlet-api.version>
<jsp-api.version>2.0</jsp-api.version>
<commons-lang3.version>3.3.2</commons-lang3.version>
<commons-io.version>2.5</commons-io.version>
<commons-net.version>3.3</commons-net.version>
<freemarker.version>2.3.23</freemarker.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jackjson.version>2.9.2</jackjson.version>
<kotlin.version>1.2.41</kotlin.version>
</properties>
<dependencies>
<!-- Apache工具组件 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.1</version>
</dependency>
<!-- 日志处理 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- Mybatis -->
<!--<dependency>-->
<!--<groupId>org.mybatis</groupId>-->
<!--<artifactId>mybatis</artifactId>-->
<!--<version>${mybatis.version}</version>-->
<!--</dependency>-->
<!--<dependency>-->
<!--<groupId>org.mybatis</groupId>-->
<!--<artifactId>mybatis-spring</artifactId>-->
<!--<version>${mybatis.spring.version}</version>-->
<!--</dependency>-->
<!-- jackson 相关 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackjson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackjson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackjson.version}</version>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- freemarker -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- JSP相关 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>${freemarker.version}</version>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test</artifactId>
<version>${kotlin.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-noarg</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
</project>
值得注意的是:其中引入了2个插件,一个是插件为aop增强的类去final关键字,还是一个是noarg可以为data class增加无参构造。由于生成的内容是在编译期通过修改字节码生成的,所以在写代码的时候是访问不了这些内容,但可以通过反射去访问。如果遇到插件引入成功后,可是字节码没有发生变化,只需要重新编译下class文件就可以了。
我们写上NoArg这个注解
package com.anno
/**
*
* Created with LXD
* author:Luhui
* qq:729913162
* Date:2018-06-12
* Time:10:06
*
* */
annotation class NoArg
然后在data class中使用他,就可以为我们生成无参构造:
package com.entity
import com.anno.NoArg
/**
*
* Created with LXD
* author:Luhui
* qq:729913162
* Date:2018-06-12
* Time:9:55
*
* */
@NoArg
data class User(val id:Int,val username:String,val password:String)
dao:
package com.dao
import com.baomidou.mybatisplus.mapper.BaseMapper
import com.entity.User
import org.apache.ibatis.annotations.Select
/**
*
* Created with LXD
* author:Luhui
* qq:729913162
* Date:2018-06-12
* Time:9:21
*
* */
interface UserDao : BaseMapper<User>{
@Select("select * from user")
fun getAll():List<User>
}
service:
package com.service
import com.baomidou.mybatisplus.service.impl.ServiceImpl
import com.dao.UserDao
import com.entity.User
import org.springframework.stereotype.Service
/**
*
* Created with LXD
* author:Luhui
* qq:729913162
* Date:2018-06-12
* Time:9:23
*
* */
@Service
class UserService : ServiceImpl<UserDao, User>(){
fun getAll():List<User>{
return baseMapper.getAll()
}
}
Controller:
package com.controller
import com.entity.User
import com.service.UserService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
/**
*
* Created with LXD
* author:Luhui
* qq:729913162
* Date:2018-06-12
* Time:9:26
*
* */
@RestController
class UserController (
@Autowired private val userService: UserService
){
@GetMapping("/list")
fun list() : List<User>{
return userService.getAll()
}
}
最后我们就可以访问我们写的方接口了。
总结:kotlin是一门非常优雅,简洁的编程语言,能大大提高我们开发效率,已经有越来越多的java开发者转战了kotlin,他与java 100%兼容,非常值得学习。