makotan _at_ gmail dot com

Springの小ネタ

ことりんでSpringを使うときにはなにもしないと @Autowired constructor(val xxxx : Xxxxx) みたいに書く必要がある
Javaっぽくかけないかなぁ〜って遊んでみた結果

@SpringBootApplication
@ComponentScan(basePackages = arrayOf("com.makotan.kotlin"))
open class Application : CommandLineRunner {

    val hogeService : HogeService by Spring()
    
    override fun run(vararg p0: String?) {
        val hoge = hogeService.call("hoge")
        println(hoge)
        val fuga = hogeService.call("fuga")
        println(fuga)
    }

    companion object {
        @JvmStatic fun main(args: Array<String>) {
            SpringApplication.run(Application::class.java, *args)
        }
    }    
}


それっぽく出来た!


ちなみにSpringの中身はこんな感じ

class Spring {
    companion object Context {
        var springContext : ApplicationContext? = null 
        fun set(springContext : ApplicationContext) {
            this.springContext = springContext
        }
    }
    var value : Any? = null
    operator fun <T> getValue(thisRef: Any?, property: KProperty<*>): T {
        if (value == null) {
            value = springContext?.getBean(property.javaGetter?.returnType)
        }
        return value as T
    }
}

@Component
class SpringInitialize @Autowired constructor(val springContext : ApplicationContext) {
    @PostConstruct
    fun init() {
        Spring.set(springContext)
    }
}