Làm cách nào để sử dụng chú thích mùa xuân như @Autowosystem trong kotlin?


81

Có thể làm điều gì đó như sau trong Kotlin không?

@Autowired
internal var mongoTemplate: MongoTemplate

@Autowired
internal var solrClient: SolrClient

3
Bạn đã thử chưa? Và mang tính xây dựng hơn một chút .. có toàn bộ mẫu Spring Boot , câu trả lời chắc chắn nhất là "có".
mabi

@mabi cảm ơn bạn về liên kết hướng dẫn :)
eendroroy

Câu trả lời:


182

Cách tiếp cận được đề xuất để thực hiện Dependency Injection trong Spring là phương thức tiêm hàm tạo:

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

Trước hàm tạo Spring 4.3 phải được chú thích rõ ràng bằng Autowired:

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

Trong một số trường hợp hiếm hoi, bạn có thể thích sử dụng tiêm trường và bạn có thể thực hiện với sự trợ giúp của lateinit:

@Component
class YourBean {

    @Autowired
    private lateinit var mongoTemplate: MongoTemplate

    @Autowired
    private lateinit var solrClient: SolrClient
}

Việc tiêm hàm tạo kiểm tra tất cả các phụ thuộc tại thời điểm tạo bean và tất cả các trường được đưa valvào, mặt khác chỉ có thể là các trường được tiêm lateinit varvà có ít chi phí thời gian chạy. Và để kiểm tra lớp với hàm tạo, bạn không cần phản chiếu.

Liên kết:

  1. Tài liệu về lateinit
  2. Tài liệu về hàm tạo
  3. Phát triển các ứng dụng Spring Boot với Kotlin

tôi có thể sử dụng @Autowiredtham số với hàm tạo chính không?
Asif Mushtaq

Chắc chắn, tôi sử dụng hàm tạo chính cho các lần tiêm trong ví dụ thứ hai và thứ ba.
Ruslan

Bạn cũng có thể thêm autowiredtheo setter?
Asif Mushtaq

@IRus, bạn đã sử dụng private vals trong ví dụ của mình, nhưng tôi sẽ nói rằng 80% tất cả các ví dụ tôi tìm thấy trên Internet teh đều không có bổ ngữ "private" khi nói đến Kotlin. Đó sẽ được coi là mùi mã trong Java. Lý do cho điều đó là gì? Bạn có tình cờ biết không? Tôi thậm chí nghĩ rằng nó xứng đáng có một câu hỏi riêng.
yuranos

@ yuranos87 Hãy tưởng tượng rằng nhà phát triển đưa YourBeanvào FooBean, trong trường hợp khi các YourBeanphụ thuộc được công khai (công cụ sửa đổi mặc định trong Kotlin) thì nhà phát triển có thể sử dụng các YourBeanphụ thuộc trong FooBean( yourBean.mongoTemplate). Nhưng điều này không được cho phép, bởi vì YourBeanphụ thuộc không phải là hợp đồng công khai của anh ta, nó chỉ là chi tiết triển khai (trong hầu hết các trường hợp). Thay vào đó, FooBeannên xác định các phụ thuộc riêng trong phương thức khởi tạo riêng.
Ruslan

6

Có, các chú thích java được hỗ trợ trong Kotlin hầu hết như trong Java. Một gotcha là các chú thích trên hàm tạo chính yêu cầu từ khóa 'hàm tạo' rõ ràng:

Từ https://kotlinlang.org/docs/reference/annotations.html

Nếu bạn cần chú thích hàm tạo chính của một lớp, bạn cần thêm từ khóa hàm tạo vào khai báo hàm tạo và thêm các chú thích trước nó:

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

4

Bạn cũng có thể tự động chuyển hướng các phụ thuộc thông qua hàm tạo. Hãy nhớ chú thích sự phụ thuộc của bạn bằng @Configuration, @Component, @Servicevv

import org.springframework.stereotype.Component

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

0

như thế

@Component class Girl( @Autowired var outfit: Outfit)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.