2016-02-25 8 views
8

मैं वसंत दस्तावेज के this section द्वारा परेशान हूं।रनटाइम निर्भरता के रूप में वसंत संदर्भ

उदाहरण के लिए, एक आवेदन संदर्भ बना सकते हैं और एक आवेदन कॉन्फ़िगर करने के लिए निर्भरता इंजेक्शन का उपयोग करने के लिए, अपने Maven निर्भरता इस तरह दिखेगा:

<dependencies> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>4.2.5.RELEASE</version> 
     <scope>runtime</scope> 
    </dependency> 
</dependencies> 

नोट गुंजाइश क्रम के रूप में घोषित किया जा सकता है अगर आप डॉन ' टी वसंत एपीआई के खिलाफ संकलन करने की जरूरत नहीं है, जो आमतौर पर बुनियादी निर्भरता इंजेक्शन उपयोग मामलों के मामले में है।

मुझे जेएसआर 330 (डी एनोटेशन) के बारे में पता है। लेकिन आप ApplicationContext कक्षा से कैसे रद्द कर सकते हैं? और यदि आप इससे decouple करते हैं तो फिर भी वसंत पर निर्भर क्यों?

उदाहरण के लिए, quick start को spring-context को रनटाइम निर्भरता के रूप में फिर से लिखा जा सकता है? या "मूल निर्भरता इंजेक्शन उपयोग केस" क्या होगा?

उत्तर

4

मुझे लगता है कि "मूल उपयोग केस" एक्सएमएल-आधारित अनुप्रयोग संदर्भों का जिक्र कर रहा है। वह दस्तावेज कह रहा है कि क्या आप सीधे अपने कोड में स्प्रिंग लाइब्रेरी का उपयोग नहीं कर रहे हैं, तो आपको अपने संकलन वर्गपथ में उन पुस्तकालयों को शामिल नहीं करना होगा। एक्सएमएल कॉन्फ़िगरेशन के साथ यह मामला है, क्योंकि सब कुछ वसंत से संबंधित है एक्सएमएल में कॉन्फ़िगर किया गया है, और इसलिए संकलित नहीं किया गया है।

त्वरित शुरुआत में आपने लिंक किया है, लेखक एनोटेशन-आधारित एप्लिकेशन संदर्भ कॉन्फ़िगरेशन का उपयोग कर रहा है, जिसके लिए वसंत पुस्तकालयों को संकलन और रनटाइम दोनों में शामिल करने की आवश्यकता होगी।

नमूना XML विन्यास: http://www.springbyexample.org/examples/intro-to-ioc-creating-a-spring-application.html

वहाँ केवल कुछ प्रमुख बिंदु जहां आवेदन कोड सीधे आईओसी कंटेनर का उपयोग करने की जरूरत है होना चाहिए [...]। यदि आप एक वेब एप्लिकेशन विकसित कर रहे हैं, तो आपको सीधे आईओसी कंटेनर तक पहुंचने की आवश्यकता नहीं हो सकती है क्योंकि यह स्वचालित रूप से आपके नियंत्रक और किसी भी बीन्स की तत्कालता को संभालने में सक्षम होगी।

मैं इसके साथ पूरी तरह से परिचित नहीं हूं, लेकिन ऐसा लगता है कि आप जेएसआर 330 का उपयोग कर सकते हैं जैसा कि आपने एनएमएल कॉन्फ़िगरेशन के साथ सुझाव दिया है कि एनोटेशन का उपयोग करके ऑटो को बीयर करें। here देखें। यह एनोटेशन का उपयोग करने की अनुमति देगा, लेकिन संकलन-समय विन्यास में वसंत को शामिल करने की आवश्यकता के बिना।

-1

आप अलग-अलग बंडल में javax.inject (@Named, @Inject) पर निर्भरता के साथ अपने सेम को कार्यान्वित कर सकते हैं। वे वसंत आधारित परियोजना या किसी अन्य कंटेनर से उपयोग योग्य होंगे जिनके पास स्वयं का डीआई कार्यान्वयन है।

यहाँ (अलग बंडलों को बंटवारे परियोजना के बिना) javax.inject को नए सिरे वसंत आधारित घटकों के नमूना है http://www.mkyong.com/spring3/spring-3-and-jsr-330-inject-and-named-example/

-1

अगर मैं सही ढंग से समझ आप मूल रूप से कह रहे हैं कि कैसे निर्भरता इंजेक्टर आरंभ नहीं हो जाता और आप कैसे इंजेक्षन कर सकते हैं आपकी कक्षाओं में निर्भरता। त्वरित प्रारंभ उदाहरण में आपने प्रदान किया है कि मुख्य संदर्भ में एप्लिकेशन संदर्भ मैन्युअल रूप से बनाया गया है।

ApplicationContext context = 
     new AnnotationConfigApplicationContext(Application.class); 
documentation

स्टैंडअलोन आवेदन संदर्भ के अनुसार

, इनपुट के रूप में व्याख्या किए गए वर्गों को स्वीकार - विशेष @ विन्यास-एनोटेट कक्षाओं में, लेकिन यह भी सादे @Component प्रकार और JSR-330 अनुरूप वर्गों का उपयोग करना javax.inject एनोटेशन। कक्षाएं एक रजिस्टर का उपयोग कर (कक्षा ...) के साथ-साथ classpath स्कैनिंग स्कैन प्रयोग करने के लिए के रूप में के बाद एक पंजीकरण के लिए अनुमति देता है (स्ट्रिंग ...)

प्रारंभ करने में वसंत अपने web.xml के भीतर है एक वैकल्पिक तरीका जहां आप ContextLoaderListner का उपयोग करते हैं जो प्रोग्राम शुरू होने पर आपके लिए वसंत एप्लिकेशन संदर्भ बूटस्ट्रैप करेगा।

वेब.एक्सएमएल में वसंत शुरू करने के बारे में सवाल पहले से ही here का उत्तर दिया गया है।

3

सबसे पहले, के डि के बारे में बात करते हैं।

निर्भरता प्रबंधन और निर्भरता इंजेक्शन, Spring Doc से नोट अलग बातें हैं।

  • निर्भरता प्रबंधन "सभी पुस्तकालयों की जरूरत (जार फ़ाइलें) को इकट्ठा और रनटाइम पर अपने classpath पर उन्हें मिलता है, और संभवतः संकलन समय पर" है।
  • निर्भरता इंजेक्शन है, मान लें कि का उपयोग करके इसे अपनी कक्षा में Service ऑब्जेक्ट चाहिए, तो आप वसंत ढांचे को उस बीन के जीवन चक्र को संभालने दें। निर्भरता प्रबंधन के

उदाहरण:

<dependencies> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>4.2.5.RELEASE</version> 
    </dependency> 
</dependencies> 

तो तुम अपनी परियोजना में इन सभी जार फ़ाइलें है।

spring-context-4.2.5.RELEASE.jar 
spring-aop-4.2.5.RELEASE.jar 
spring-beans-4.2.5.RELEASE.jar 
spring-core-4.2.5.RELEASE.jar 

निर्भरता इंजेक्शन का उदाहरण:

अपने quick-start उदाहरण में, आप MessageServiceMessagePrinter में निर्माता इंजेक्शन का उपयोग करके इंजेक्षन। आपने कहीं भी MessageService नहीं बनाया है। वसंत कंटेनर इसे आपके लिए बनाता है।

@Component 
public class MessagePrinter { 
    final private MessageService service; 
    @Autowired 
    public MessagePrinter(MessageService service) { 
     this.service = service; 
    } 
    public void printMessage() { 
     System.out.println(this.service.getMessage()); 
    } 
} 

@Configuration 
@ComponentScan 
public class Application { 
    @Bean 
    MessageService mockMessageService() { 
     return new MessageService() { 
      public String getMessage() { 
       return "Hello World!"; 
      } 
     }; 
    } 
    ... 
} 

अब transitive dependency and run-time dependency के बारे में बात करते हैं।

सकर्मक निर्भरता

यह पुस्तकालयों कि अपनी खुद की निर्भरता की आवश्यकता होती है और उन्हें स्वतः सहित की खोज करने का मतलब है।
उदाहरण के लिए, यदि आपने pom.xml में निर्भरता ए और बी निर्दिष्ट किया है। और ए सी पर निर्भर करता है, डी बी ई पर निर्भर करता है। आपको अपनी कॉन्फ़िगरेशन में सी, डी, ई शामिल करने की आवश्यकता नहीं है। संक्रमणीय निर्भरता के कारण, सी, डी, ई स्वचालित रूप से शामिल किया जाएगा।

क्रम निर्भरता

यह निर्भरता कार्यक्षेत्रों का एक प्रकार सकर्मक निर्भरता को सीमित करने के लिए है।

"यह गुंजाइश इंगित करता है कि निर्भरता संकलन के लिए आवश्यक नहीं है, लेकिन निष्पादन के लिए है। यह क्रम और परीक्षण में classpaths, लेकिन नहीं संकलन classpath है।"

अब सवाल यह है: वहाँ किसी भी मामले है कि डि के लिए, बजाय आप क्रम के रूप में गुंजाइश सेट कर सकते हैं "आप स्प्रिंग एपीआई के खिलाफ संकलन करने की जरूरत नहीं है" क्या है? इसी तरह के प्रश्न here

हां, एक उदाहरण मैं वेब एप्लिकेशन के बारे में सोच सकता हूं। मान लीजिए कि मैं स्प्रिंग प्लगइन के साथ स्ट्रैट्स का उपयोग कर रहा हूं।(उदाहरण के नीचे मैनिंग से "स्ट्रैट्स 2 इन एक्शन" से आता है)

मैं स्प्रिंग को Login कक्षा का उदाहरण बनाने के लिए अनुरोध के लिए अपनी क्रिया ऑब्जेक्ट के रूप में उपयोग करना चाहता हूं।

web.xml

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

करने के लिए एक वसंत वेब संदर्भ श्रोता जोड़ने struts-config-login.xml

<action name="Login" class="springManagedLoginAction"> 
    <result type="redirectAction"> 
     <param name="actionName">AdminPortfolio</param> 
     <param name="namespace">/chapterEight/secure</param> 
    </result> 
    <result name="input">/chapterEight/Login.jsp</result> 
</action> 
में कार्रवाई कक्षा में इस सेम applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> 
    <bean id="portfolioService" class="manning.chapterNine.utils.PortfolioServiceJPAImpl"/> 
    <bean id="springManagedLoginAction" class="manning.chapterNine.Login" scope="prototype"> 
     <property name="portfolioService" ref="portfolioService"/> 
    </bean> 
</beans> 

उपयोग में एक सेम LoginspringManagedLoginAction के रूप में नामित परिभाषित

+0

'; tldr' विरासत बकवास। एक्सएमएल विन्यास वसंत पर पूर्ण निर्भरता बनाता है। वसंत जागरूक निष्पादन पर्यावरण द्वारा 'ApplicationContext' को तुरंत चालू किया जा सकता है। – user2418306

0

मुझे यकीन नहीं है कि मैं आपका प्रश्न सही ढंग से समझ गया हूं, लेकिन मुझे ऐसा लगता है कि आप क्यों पूछ रहे हैं कि यदि आप जेएसआर-330 एनोटेशन का उपयोग कर रहे हैं तो आपको वसंत-संदर्भ निर्भरता क्यों चाहिए।

खैर, मेरे दृष्टिकोण से उत्तर यह है कि आपको वास्तव में वसंत पर निर्भरता की आवश्यकता नहीं है यदि आप केवल जेएसआर-330 एनोटेशन का उपयोग कर रहे हैं लेकिन उनके लिए काम करने के लिए, आपको कुछ लाइब्रेरी चाहिए जो उन्हें समझें और सही ढंग से समझें आपके लिए निर्भरता ग्राफ बनाता है और वसंत-संदर्भ ऐसी पुस्तकालय में से एक है।

कारण यह एक रनटाइम निर्भरता है क्योंकि आप कम से कम सिद्धांत में इस प्रदाता को रनटाइम पर स्विच कर सकते हैं।

+0

कंक्रीट जेएसआर-330 कार्यान्वयन पर निर्भरता की व्यर्थता के बारे में मैंने कई बार अपनी चिंताओं का उल्लेख किया है। मुझे खुशी है कि आपकी राय * मेरी मेल खाती है। लेकिन मैं इस तार्किक झूठ के औचित्य की तलाश में हूं। – user2418306

संबंधित मुद्दे