कोटलिन में @Autowired जैसे स्प्रिंग एनोटेशन का उपयोग कैसे करें?


84

क्या कोटलिन में निम्नलिखित कुछ करना संभव है?

@Autowired
internal var mongoTemplate: MongoTemplate

@Autowired
internal var solrClient: SolrClient

3
आपने कोशिश की है? और थोड़ा और रचनात्मक होने के लिए .. एक पूरे स्प्रिंग बूट टेम्पलेट है , इसका जवाब सबसे निश्चित रूप से "हां" है।
मबी

@ मबी ट्यूटोरियल लिंक के लिए धन्यवाद :)
eendroroy

जवाबों:


187

वसंत में डिपेंडेंसी इंजेक्शन करने के लिए अनुशंसित दृष्टिकोण निर्माणकर्ता इंजेक्शन है:

@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, दूसरी तरफ लेटनीट इंजेक्शन इंजेक्शन केवल हो सकते हैं var, और बहुत कम रनवे ओवरहेड होते हैं। और निर्माता के साथ वर्ग का परीक्षण करने के लिए, आपको प्रतिबिंब की आवश्यकता नहीं है।

लिंक:

  1. लेटइनिट पर प्रलेखन
  2. निर्माणकर्ताओं पर प्रलेखन
  3. कोटलिन के साथ स्प्रिंग बूट एप्लिकेशन विकसित करना

क्या मैं @Autowiredप्राथमिक निर्माता पैरामीटर के साथ उपयोग कर सकता हूं ?
आसिफ मुश्ताक

ज़रूर, मैं दूसरे और तीसरे उदाहरण में इंजेक्शन के लिए प्राथमिक निर्माणकर्ता का उपयोग करता हूं।
रुस्लान

क्या आप autowiredउप सेटर भी जोड़ सकते हैं ?
आसिफ मुश्ताक

@ आईरस, आपने अपने उदाहरण में निजी वैल का इस्तेमाल किया है, लेकिन मैं कहूंगा कि तेह इंटरनेट पर जितने भी उदाहरण मुझे मिले उनमें से 80% उदाहरण "कोटलिन" के बिना "निजी" संशोधक के बिना आते हैं। यह जावा में कोड गंध माना जाएगा। उसका कारण क्या है? क्या आप को पता है? मुझे भी लगता है कि यह एक अलग सवाल है।
युरानोस

@ yuranos87 कल्पना कीजिए कि डेवलपर उस स्थिति YourBeanमें इंजेक्शन लगाता है FooBean, जब YourBeanनिर्भरता सार्वजनिक होगी (कोटलिन में डिफ़ॉल्ट संशोधक) डेवलपर ( ) YourBeanमें निर्भरता का उपयोग कर सकता है । लेकिन इसकी अनुमति नहीं दी जानी चाहिए, क्योंकि निर्भरता उसका सार्वजनिक अनुबंध नहीं है, यह सिर्फ कार्यान्वयन विवरण (ज्यादातर मामलों में) है। इसके बजाय, खुद के कंस्ट्रक्टर में खुद की निर्भरता को परिभाषित करना चाहिए। FooBeanyourBean.mongoTemplateYourBeanFooBean
रुस्लान

6

हाँ, जावा एनोटेशन का समर्थन ज्यादातर जावा के रूप में कोटलिन में किया जाता है। प्राथमिक निर्माणकर्ता पर एक गोत्र एनोटेशन है, इसके लिए स्पष्ट 'कंस्ट्रक्टर' कीवर्ड की आवश्यकता होती है:

से https://kotlinlang.org/docs/reference/annotations.html

यदि आपको किसी क्लास के प्राथमिक कंस्ट्रक्टर को एनोटेट करने की आवश्यकता है, तो आपको कंस्ट्रक्टर कीवर्ड को कंस्ट्रक्टर घोषणा में जोड़ना होगा, और इससे पहले एनोटेशन जोड़ना होगा:

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

4

आप कंस्ट्रक्टर के माध्यम से निर्भरता को भी कम कर सकते हैं। @Configuration, @Component, @Serviceआदि के साथ अपनी निर्भरता को एनोटेट करना याद रखें

import org.springframework.stereotype.Component

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.