sourcecode

@Autowired in kotlin과 같은 봄 주석 사용법

copyscript 2023. 2. 15. 22:08
반응형

@Autowired in kotlin과 같은 봄 주석 사용법

코틀린에서 팔로우 같은 걸 할 수 있을까요?

@Autowired
internal var mongoTemplate: MongoTemplate

@Autowired
internal var solrClient: SolrClient

봄에 의존성 주입을 수행하기 위해 권장되는 접근 방식은 컨스트럭터 주입입니다.

@Component
class YourBean(
    private val mongoTemplate: MongoTemplate, 
    private val solrClient: SolrClient
) {
  // code
}

봄 4.3 컨스트럭터에는, 다음의 코멘트가 명시적으로 기술되어 있을 필요가 있습니다.Autowired:

@Component
class YourBean @Autowired constructor(
    private val mongoTemplate: MongoTemplate, 
    private val solrClient: SolrClient
) {
  // code
}

드문 경우지만 현장 주입을 사용할 수 있으며 다음 방법으로 수행할 수 있습니다.lateinit:

@Component
class YourBean {

    @Autowired
    private lateinit var mongoTemplate: MongoTemplate

    @Autowired
    private lateinit var solrClient: SolrClient
}

생성자 주입은 콩 생성 시 모든 종속성을 검사하고 주입된 모든 필드는 다음과 같습니다.val한편, lateinit 주입된 필드는var런타임 오버헤드가 거의 없습니다.그리고 컨스트럭터와의 테스트 클래스에는 반성이 필요 없습니다.

링크:

  1. lateinit에 관한 문서
  2. 컨스트럭터에 관한 문서
  3. Kotlin을 사용한 Spring Boot 어플리케이션 개발

네, 자바 주석은 대부분 자바와 마찬가지로 Kotlin에서 지원됩니다.첫 번째 gotcha는 primary constructor에 대한 주석으로 명시적인 'constructor' 키워드가 필요합니다.

https://kotlinlang.org/docs/reference/annotations.html 에서

클래스의 기본 생성자에 주석을 달아야 하는 경우 생성자 선언에 생성자 키워드를 추가하고 그 앞에 주석을 추가해야 합니다.

class Foo @Inject constructor(dependency: MyDependency) {
  // ...
}

생성자를 통해 종속성을 자동 연결할 수도 있습니다.종속성에 주석을 다는 것을 잊지 마십시오.@Configuration, @Component, @Service기타

import org.springframework.stereotype.Component

@Component
class Foo (private val dependency: MyDependency) {
    //...
}

이런 거죠.

@Component class Girl( @Autowired var outfit: Outfit)

속성 주입을 원하지만 원하지 않는 경우lateinit var다음은 속성 대리인을 사용한 솔루션입니다.

private lateinit var ctx: ApplicationContext

@Component
private class CtxVarConfigurer : ApplicationContextAware {
    override fun setApplicationContext(context: ApplicationContext) {
        ctx = context
    }
}

inline fun <reified T : Any> autowired(name: String? = null) = Autowired(T::class.java, name)

class Autowired<T : Any>(private val javaType: Class<T>, private val name: String?) {

    private val value by lazy {
        if (name == null) {
            ctx.getBean(javaType)
        } else {
            ctx.getBean(name, javaType)
        }
    }

    operator fun getValue(thisRef: Any?, property: KProperty<*>): T = value

}

그러면 훨씬 더 좋은 것을 사용할 수 있습니다.by위임 구문:

@Service
class MyService {

    private val serviceToBeInjected: ServiceA by autowired()

    private val ambiguousBean: AmbiguousService by autowired("qualifier")

}

언급URL : https://stackoverflow.com/questions/35479631/how-to-use-spring-annotations-like-autowired-in-kotlin

반응형