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) } }