सबसे पहले, के डि के बारे में बात करते हैं।
निर्भरता प्रबंधन और निर्भरता इंजेक्शन, 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 उदाहरण में, आप MessageService
MessagePrinter
में निर्माता इंजेक्शन का उपयोग करके इंजेक्षन। आपने कहीं भी 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>
उपयोग में एक सेम Login
springManagedLoginAction
के रूप में नामित परिभाषित
'; tldr' विरासत बकवास। एक्सएमएल विन्यास वसंत पर पूर्ण निर्भरता बनाता है। वसंत जागरूक निष्पादन पर्यावरण द्वारा 'ApplicationContext' को तुरंत चालू किया जा सकता है। – user2418306