Có thể làm điều gì đó như sau trong Kotlin không?
@Autowired
internal var mongoTemplate: MongoTemplate
@Autowired
internal var solrClient: SolrClient
Có thể làm điều gì đó như sau trong Kotlin không?
@Autowired
internal var mongoTemplate: MongoTemplate
@Autowired
internal var solrClient: SolrClient
Câu trả lời:
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 val
vào, mặt khác chỉ có thể là các trường được tiêm lateinit var
và 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:
@Autowired
tham số với hàm tạo chính không?
autowired
theo setter?
YourBean
vào FooBean
, trong trường hợp khi các YourBean
phụ 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 YourBean
phụ thuộc trong FooBean
( yourBean.mongoTemplate
). Nhưng điều này không được cho phép, bởi vì YourBean
phụ 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 đó, FooBean
nên xác định các phụ thuộc riêng trong phương thức khởi tạo riêng.
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) {
// ...
}