Kotlin에서 다음과 같은 작업을 수행 할 수 있습니까?
@Autowired
internal var mongoTemplate: MongoTemplate
@Autowired
internal var solrClient: SolrClient
답변:
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
런타임 오버 헤드가 거의 없습니다. 생성자로 클래스를 테스트하기 위해 리플렉션이 필요하지 않습니다.
연결:
@Autowired
with 기본 생성자 매개 변수를 사용할 수 있습니까?
autowired
by setter를 추가 할 수도 있습니까?
YourBean
에서을 FooBean
때 경우에 YourBean
의존성이 공개됩니다 개발자가 사용할 수 있습니다 (코 틀린 기본적 수정) YourBean
에 종속성을 FooBean
( yourBean.mongoTemplate
). 그러나 이것은 허용되지 않아야합니다. YourBean
종속성은 그의 공개 계약이 아니기 때문에 구현 세부 사항 일뿐입니다 (대부분의 경우). 대신 FooBean
자신의 생성자에 자신의 종속성을 정의해야합니다.
예, 자바 주석은 대부분 자바 에서처럼 Kotlin에서 지원됩니다. 한 가지 문제는 기본 생성자에 대한 주석에 명시적인 'constructor'키워드가 필요하다는 것입니다.
에서 https://kotlinlang.org/docs/reference/annotations.html
클래스의 기본 생성자에 주석을 추가해야하는 경우 생성자 선언에 생성자 키워드를 추가하고 그 앞에 주석을 추가해야합니다.
class Foo @Inject constructor(dependency: MyDependency) {
// ...
}