Kotlin에서 @Autowired와 같은 스프링 주석을 사용하는 방법은 무엇입니까?


84

Kotlin에서 다음과 같은 작업을 수행 할 수 있습니까?

@Autowired
internal var mongoTemplate: MongoTemplate

@Autowired
internal var solrClient: SolrClient

3
시도해 보셨습니까? 그리고 좀 더 건설 적이기 위해 .. 전체 Spring Boot 템플릿 이 있습니다. 대답은 확실히 "예"입니다.
mabi

@mabi 튜토리얼 링크 주셔서 감사합니다 :)
eendroroy

답변:


187

Spring에서 Dependency Injection을 수행하는 권장 방법은 생성자 주입입니다.

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

Spring 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 애플리케이션 개발

@Autowiredwith 기본 생성자 매개 변수를 사용할 수 있습니까?
Asif Mushtaq 2018 년

물론 두 번째와 세 번째 예제에서는 주입에 기본 생성자를 사용합니다.
Ruslan

autowiredby setter를 추가 할 수도 있습니까?
Asif Mushtaq

@IRus, 귀하는 귀하의 예에서 개인 값을 사용했지만, 인터넷에서 찾은 모든 예의 80 %가 Kotlin과 관련하여 "개인"수식어없이 제공됩니다. 그것은 Java에서 코드 냄새로 간주됩니다. 그 이유는 무엇입니까? 알고 계십니까? 별도의 질문이 필요하다고 생각합니다.
yuranos dec

@ 그 개발자를 분사 상상 yuranos87 YourBean에서을 FooBean때 경우에 YourBean의존성이 공개됩니다 개발자가 사용할 수 있습니다 (코 틀린 기본적 수정) YourBean에 종속성을 FooBean( yourBean.mongoTemplate). 그러나 이것은 허용되지 않아야합니다. YourBean종속성은 그의 공개 계약이 아니기 때문에 구현 세부 사항 일뿐입니다 (대부분의 경우). 대신 FooBean자신의 생성자에 자신의 종속성을 정의해야합니다.
Ruslan

6

예, 자바 주석은 대부분 자바 에서처럼 Kotlin에서 지원됩니다. 한 가지 문제는 기본 생성자에 대한 주석에 명시적인 'constructor'키워드가 필요하다는 것입니다.

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

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

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

4

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

import org.springframework.stereotype.Component

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

0

그렇게

@Component class Girl( @Autowired var outfit: Outfit)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.