java - सरल - स्प्रिंग में ऑटोवॉयरिंग कैसे काम करता है?




सरल लोलक का आवर्तकाल का सूत्र (6)

@Autowired

  • स्प्रिंग की निर्भरता इंजेक्शन सुविधाओं द्वारा स्वायत्त होने के लिए एक कन्स्ट्रक्टर, फ़ील्ड, सेटर विधि या कॉन्फ़िगरेशन विधि को चिह्नित करता है।

  • किसी दिए गए बीन वर्ग के केवल एक कन्स्ट्रक्टर (अधिकतम पर) इस एनोटेशन को ले जा सकता है, जो स्प्रिंग बीन के रूप में उपयोग किए जाने पर ऑटोवायर को कन्स्ट्रक्टर को इंगित करता है। ऐसे कन्स्ट्रक्टर को सार्वजनिक होना जरूरी नहीं है।

  • किसी भी कॉन्फ़िगरेशन विधियों को लागू करने से पहले फ़ील्ड को बीन के निर्माण के ठीक बाद इंजेक्शन दिया जाता है। इस तरह के एक विन्यास क्षेत्र सार्वजनिक होना जरूरी नहीं है।

  • कॉन्फ़िगर विधियों में मनमाने ढंग से नाम और तर्कों की संख्या हो सकती है; उन तर्कों में से प्रत्येक स्प्रिंग कंटेनर में एक मिलान बीन के साथ स्वचालित हो जाएगा। बीन प्रॉपर्टी सेटर विधियां प्रभावी रूप से ऐसी सामान्य कॉन्फ़िगरेशन विधि का एक विशेष मामला है। इस तरह के कॉन्फ़िगरेशन विधियों को सार्वजनिक होना जरूरी नहीं है।

  • कई तर्क विधियों के मामले में, सभी आवश्यक तर्कों के लिए 'आवश्यक' पैरामीटर लागू होता है।

  • संग्रह या मानचित्र निर्भरता प्रकार के मामले में, कंटेनर घोषित मूल्य प्रकार से मेल खाने वाले सभी बीन्स को स्वचालित कर देगा। मानचित्र के मामले में, चाबियों को प्रकार स्ट्रिंग के रूप में घोषित किया जाना चाहिए और संबंधित बीन नामों के लिए हल किया जाएगा।

मैं थोड़ा उलझन में हूं कि कैसे नियंत्रण में उलटा ( IoC ) Spring में काम करता है।

मान लें कि मेरे पास UserServiceImpl नामक एक सेवा वर्ग है जो UserService इंटरफ़ेस लागू UserService है।

यह @Autowired कैसे होगा?

और मेरे Controllers कार्रवाई में, मैं इस सेवा के instance को कैसे instantiate करूं?

क्या मैं बस निम्नलिखित करूँगा?

UserService userService = new UserServiceImpl();

@Autowired आंतरिक रूप से कैसे काम करता है?

पूर्व -

class EnglishGreeting {
   private Greeting greeting;
   //setter and getter
}

class Greeting {
   private String message;
   //setter and getter
}

@xml फ़ाइल का उपयोग न करने पर .xml फ़ाइल समान दिखाई देगी

<bean id="englishGreeting" class="com.bean.EnglishGreeting">
   <property name="greeting" ref="greeting"/>
</bean>

<bean id="greeting" class="com.bean.Greeting">
   <property name="message" value="Hello World"/>
</bean>

यदि आप तब @Autowired का उपयोग कर रहे हैं

class EnglishGreeting {
   @Autowired //so automatically based on the name it will identify the bean and inject.
   private Greeting greeting;
   //setter and getter
}

@xml फ़ाइल का उपयोग न करने पर .xml फ़ाइल समान दिखाई देगी

<bean id="englishGreeting" class="com.bean.EnglishGreeting"></bean>

<bean id="greeting" class="com.bean.Greeting">
   <property name="message" value="Hello World"/>
</bean>

यदि अभी भी कुछ संदेह है तो लाइव डेमो के नीचे जाएं

@Autowired आंतरिक रूप से कैसे काम करता है?


इस पर निर्भर करता है कि क्या आप एनोटेशन रूट या बीन एक्सएमएल परिभाषा मार्ग गए हैं।

मान लें कि आपके applicationContext.xml में परिभाषित बीन्स थे Context.xml:

<beans ...>

    <bean id="userService" class="com.foo.UserServiceImpl"/>

    <bean id="fooController" class="com.foo.FooController"/>

</beans>

जब आवेदन शुरू होता है तो ऑटोवॉयरिंग होती है। तो, fooController , जो तर्क के लिए UserServiceImpl क्लास का उपयोग करना चाहता है, आप इसे निम्नानुसार एनोटेट करेंगे:

public class FooController {

    // You could also annotate the setUserService method instead of this
    @Autowired
    private UserService userService;

    // rest of class goes here
}

जब यह @Autowired देखता है, तो स्प्रिंग उस वर्ग की तलाश करेगी जो @Autowired में संपत्ति से मेल खाती है, और इसे स्वचालित रूप से इंजेक्ट करती है। यदि आपके पास 1 से अधिक उपयोगकर्ता सेवा बीन हैं, तो आपको यह समझना होगा कि इसका उपयोग किसके लिए करना चाहिए।

यदि आप निम्न कार्य करते हैं:

UserService service = new UserServiceImpl();

जब तक आप इसे स्वयं सेट नहीं करेंगे तब तक यह @Autowired नहीं उठाएगा।


ध्यान रखें कि आपको वसंत विन्यास फाइल में तत्व <context:annotation-config/> तत्व जोड़कर @Autowired एनोटेशन को सक्षम करना होगा। यह AutowiredAnotationBeanPostProcessor पंजीकृत करेगा जो एनोटेशन की प्रक्रिया का ख्याल रखता है।

और फिर आप फील्ड इंजेक्शन विधि का उपयोग करके अपनी सेवा को स्वचालित कर सकते हैं।

public class YourController{

 @Autowired
 private UserService userService; 

}

मैंने स्प्रिंग @autowired एनोटेशन के बाद से यह पाया


सबसे पहले, और सबसे महत्वपूर्ण - सभी वसंत सेम प्रबंधित होते हैं - वे एक कंटेनर के अंदर "लाइव" होते हैं, जिन्हें "एप्लिकेशन संदर्भ" कहा जाता है।

दूसरा, प्रत्येक एप्लिकेशन के उस संदर्भ में एक प्रविष्टि बिंदु है। वेब अनुप्रयोगों में एक सर्वलेट होता है, JSF एक एल- JSF का उपयोग करता है, आदि। साथ ही, वहां एक ऐसा स्थान है जहां एप्लिकेशन संदर्भ बूटस्ट्रैप किया गया है और सभी सेम - स्वचालित रूप से। वेब अनुप्रयोगों में यह एक स्टार्टअप श्रोता हो सकता है।

एक और बीन के उदाहरण में वांछित क्षेत्र में एक बीन का एक उदाहरण रखकर स्वत: काम होता है। दोनों वर्ग बीन्स होना चाहिए, यानी उन्हें आवेदन संदर्भ में रहने के लिए परिभाषित किया जाना चाहिए।

आवेदन संदर्भ में "जीवित" क्या है? इसका मतलब है कि संदर्भ वस्तुओं को तत्काल करता है, न कि आप। new UserServiceImpl() - आप कभी भी new UserServiceImpl() नहीं बनाते - कंटेनर प्रत्येक इंजेक्शन बिंदु पाता है और वहां एक उदाहरण सेट करता है।

आपके नियंत्रकों में, आपके पास बस निम्न है:

@Controller // Defines that this class is a spring bean
@RequestMapping("/users")
public class SomeController {

    // Tells the application context to inject an instance of UserService here
    @Autowired
    private UserService userService;

    @RequestMapping("/login")
    public void login(@RequestParam("username") String username,
           @RequestParam("password") String password) {

        // The UserServiceImpl is already injected and you can use it
        userService.login(username, password);

    }
}

कुछ नोट्स:

  • आपके applicationContext.xml आपको <context:component-scan> सक्षम करना चाहिए ताकि कक्षाओं को @Service , @Service , आदि टिप्पणियों के लिए स्कैन किया जा सके।
  • एक स्प्रिंग-एमवीसी अनुप्रयोग के लिए प्रवेश बिंदु डिस्पैचर सर्वलेट है, लेकिन यह आपके से छिपा हुआ है, और इसलिए दृश्य संदर्भ के प्रत्यक्ष अनुप्रयोग और बूटस्ट्रैपिंग दृश्य के पीछे होती है।
  • UserServiceImpl को बीन के रूप में भी परिभाषित किया जाना चाहिए - या तो <bean id=".." class=".."> या @Service annotation का उपयोग कर। चूंकि यह उपयोगकर्ता सेवा का एकमात्र कार्यान्वयन होगा, इसे इंजेक्शन दिया जाएगा।
  • @Autowired एनोटेशन के अलावा, वसंत एक्सएमएल-कॉन्फ़िगर करने योग्य @Autowired उपयोग कर सकते हैं। उस स्थिति में जिन क्षेत्रों में नाम या प्रकार होता है जो किसी मौजूदा बीन से मेल खाते हैं, स्वचालित रूप से एक बीन इंजेक्शन प्राप्त करते हैं। वास्तव में, यह ऑटोवॉयरिंग का प्रारंभिक विचार था - किसी भी कॉन्फ़िगरेशन के बिना निर्भरताओं के साथ इंजेक्शन वाले फ़ील्ड रखने के लिए। @Inject , @Resource जैसे अन्य एनोटेशन का भी उपयोग किया जा सकता है।

स्प्रिंग निर्भरता इंजेक्ट आपको अपनी कक्षाओं से युग्मन हटाने में मदद करती है। इस तरह की वस्तु बनाने के बजाय

UserService userService = new UserServiceImpl();

डीआई शुरू करने के बाद आप इसका इस्तेमाल करेंगे

@Autowired
private UserService userService;

इसे प्राप्त करने के लिए आपको अपनी सेवा कॉन्फ़िगरेशन फ़ाइल में अपनी सेवा का एक बीन बनाना होगा। इसके बाद आपको उस सेवा कॉन्फ़िगरेशन क्लास को अपने वेब एप्लिकेशन कॉन्फ़िगरेशन क्लास में आयात करने की आवश्यकता है ताकि आप इस तरह अपने कंट्रोलर में उस बीन को स्वचालित कर सकें।

public class AccController {

    @Autowired
    private UserService userService;
} 

example आप जावा कॉन्फ़िगरेशन आधारित पीओसी पा सकते हैं






ioc-container