स्प्रिंग - जावा आधारित कॉन्फ़िगरेशन

अब तक आपने देखा कि कैसे हम XML कॉन्फ़िगरेशन फ़ाइल का उपयोग करके स्प्रिंग बीन्स को कॉन्फ़िगर करते हैं। यदि आप XML कॉन्फ़िगरेशन के साथ सहज हैं, तो वास्तव में जावा-आधारित कॉन्फ़िगरेशन के साथ आगे बढ़ना सीखने की आवश्यकता नहीं है क्योंकि आप उपलब्ध कॉन्फ़िगरेशन में से किसी एक का उपयोग करके समान परिणाम प्राप्त करने जा रहे हैं।

जावा-आधारित कॉन्फ़िगरेशन विकल्प आपको XML के बिना अपने अधिकांश स्प्रिंग कॉन्फ़िगरेशन को लिखने में सक्षम बनाता है लेकिन इस अध्याय में बताए गए कुछ जावा-आधारित एनोटेशन की मदद से।

@Configuration और @ बीन एनोटेशन

के साथ एक वर्ग की व्याख्या @Configurationइंगित करता है कि वर्ग का उपयोग स्प्रिंग IoC कंटेनर द्वारा सेम परिभाषाओं के स्रोत के रूप में किया जा सकता है। @Beanएनोटेशन स्प्रिंग को बताता है कि @Bean के साथ एनोटेट किया गया एक तरीका एक ऑब्जेक्ट लौटाएगा जिसे स्प्रिंग एप्लिकेशन संदर्भ में बीन के रूप में पंजीकृत किया जाना चाहिए। सबसे सरल संभव @Configuration वर्ग निम्नानुसार होगा -

package com.tutorialspoint;
import org.springframework.context.annotation.*;

@Configuration
public class HelloWorldConfig {
   @Bean 
   public HelloWorld helloWorld(){
      return new HelloWorld();
   }
}

उपरोक्त कोड निम्न XML कॉन्फ़िगरेशन के बराबर होगा -

<beans>
   <bean id = "helloWorld" class = "com.tutorialspoint.HelloWorld" />
</beans>

यहां, @Bean सेम आईडी के रूप में विधि नाम एनोटेट किया गया है और यह वास्तविक बीन बनाता है और वापस करता है। आपके कॉन्फ़िगरेशन वर्ग में एक से अधिक @ बीन के लिए घोषणा हो सकती है। एक बार जब आपकी कॉन्फ़िगरेशन कक्षाएं परिभाषित हो जाती हैं, तो आप एनोटेशन कॉनफिग एपिलेशन कॉन्टेक्स्ट का उपयोग करके उन्हें स्प्रिंग कंटेनर में लोड और प्रदान कर सकते हैं: -

public static void main(String[] args) {
   ApplicationContext ctx = new AnnotationConfigApplicationContext(HelloWorldConfig.class);
   
   HelloWorld helloWorld = ctx.getBean(HelloWorld.class);
   helloWorld.setMessage("Hello World!");
   helloWorld.getMessage();
}

आप विभिन्न विन्यास वर्गों को निम्नानुसार लोड कर सकते हैं -

public static void main(String[] args) {
   AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();

   ctx.register(AppConfig.class, OtherConfig.class);
   ctx.register(AdditionalConfig.class);
   ctx.refresh();

   MyService myService = ctx.getBean(MyService.class);
   myService.doStuff();
}

उदाहरण

आइए हम एक काम कर रहे ग्रहण आईडीई को जगह दें और स्प्रिंग एप्लिकेशन बनाने के लिए निम्नलिखित कदम उठाएं -

कदम विवरण
1 SpringExample नाम से एक प्रोजेक्ट बनाएँ और के तहत एक पैकेज com.tutorialspoint बनाएँsrc बनाया परियोजना में फ़ोल्डर।
2 स्प्रिंग हैलो वर्ल्ड उदाहरण अध्याय में बताए अनुसार बाहरी जार विकल्प का उपयोग करके आवश्यक स्प्रिंग लाइब्रेरी जोड़ें
3 क्योंकि आप जावा आधारित एनोटेशन का उपयोग कर रहे हैं, तो आप भी जोड़ने की जरूरत है CGLIB.jar अपने जावा स्थापना निर्देशिका और से ASM.jar पुस्तकालय जहाँ से डाउनलोड किया जा सकता asm.ow2.org
4 Com.tutorialspoint पैकेज के तहत Java कक्षाएं HelloWorldConfig , HelloWorld और MainApp बनाएं
5 अंतिम चरण सभी जावा फ़ाइलों और बीन कॉन्फ़िगरेशन फ़ाइल की सामग्री बनाना और नीचे बताए अनुसार एप्लिकेशन चलाना है।

यहाँ की सामग्री है HelloWorldConfig.java फ़ाइल

package com.tutorialspoint;
import org.springframework.context.annotation.*;

@Configuration
public class HelloWorldConfig {
   @Bean 
   public HelloWorld helloWorld(){
      return new HelloWorld();
   }
}

यहाँ की सामग्री है HelloWorld.java फ़ाइल

package com.tutorialspoint;

public class HelloWorld {
   private String message;

   public void setMessage(String message){
      this.message  = message;
   }
   public void getMessage(){
      System.out.println("Your Message : " + message);
   }
}

निम्नलिखित की सामग्री है MainApp.java फ़ाइल

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.*;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext ctx = 
         new AnnotationConfigApplicationContext(HelloWorldConfig.class);
   
      HelloWorld helloWorld = ctx.getBean(HelloWorld.class);
      helloWorld.setMessage("Hello World!");
      helloWorld.getMessage();
   }
}

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

Your Message : Hello World!

बीन डिपेंडेंसीज को इंजेक्ट करना

जब @ बीन्स की एक-दूसरे पर निर्भरता होती है, तो यह व्यक्त करना कि निर्भरता इतनी सरल है कि एक बीन विधि दूसरे को कॉल करने की विधि निम्नानुसार है -

package com.tutorialspoint;
import org.springframework.context.annotation.*;

@Configuration
public class AppConfig {
   @Bean
   public Foo foo() {
      return new Foo(bar());
   }
   @Bean
   public Bar bar() {
      return new Bar();
   }
}

यहाँ, फ़ू बीन को कंस्ट्रक्टर इंजेक्शन के माध्यम से बार का संदर्भ मिलता है। अब हम एक और कार्यशील उदाहरण देखें।

उदाहरण

आइए हम एक काम कर रहे ग्रहण आईडीई को जगह दें और स्प्रिंग एप्लिकेशन बनाने के लिए निम्नलिखित कदम उठाएं -

कदम विवरण
1 SpringExample नाम से एक प्रोजेक्ट बनाएँ और के तहत एक पैकेज com.tutorialspoint बनाएँsrc बनाया परियोजना में फ़ोल्डर।
2 स्प्रिंग हैलो वर्ल्ड उदाहरण अध्याय में बताए अनुसार बाहरी जार विकल्प का उपयोग करके आवश्यक स्प्रिंग लाइब्रेरी जोड़ें
3 क्योंकि आप जावा आधारित एनोटेशन का उपयोग कर रहे हैं, तो आप भी जोड़ने की जरूरत है CGLIB.jar अपने जावा स्थापना निर्देशिका और से ASM.jar पुस्तकालय जहाँ से डाउनलोड किया जा सकता asm.ow2.org
4 Com.tutorial.oint पैकेज के तहत Java क्लासेज TextEditorConfig , TextEditor , SpellChecker और MainApp बनाएं
5 अंतिम चरण सभी जावा फ़ाइलों और बीन कॉन्फ़िगरेशन फ़ाइल की सामग्री बनाना और नीचे बताए अनुसार एप्लिकेशन चलाना है।

यहाँ की सामग्री है TextEditorConfig.java फ़ाइल

package com.tutorialspoint;
import org.springframework.context.annotation.*;

@Configuration
public class TextEditorConfig {
   @Bean 
   public TextEditor textEditor(){
      return new TextEditor( spellChecker() );
   }

   @Bean 
   public SpellChecker spellChecker(){
      return new SpellChecker( );
   }
}

यहाँ की सामग्री है TextEditor.java फ़ाइल

package com.tutorialspoint;

public class TextEditor {
   private SpellChecker spellChecker;

   public TextEditor(SpellChecker spellChecker){
      System.out.println("Inside TextEditor constructor." );
      this.spellChecker = spellChecker;
   }
   public void spellCheck(){
      spellChecker.checkSpelling();
   }
}

निम्नलिखित एक और आश्रित वर्ग फ़ाइल की सामग्री है SpellChecker.java

package com.tutorialspoint;

public class SpellChecker {
   public SpellChecker(){
      System.out.println("Inside SpellChecker constructor." );
   }
   public void checkSpelling(){
      System.out.println("Inside checkSpelling." );
   }
}

निम्नलिखित की सामग्री है MainApp.java फ़ाइल

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.*;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext ctx = 
         new AnnotationConfigApplicationContext(TextEditorConfig.class);

      TextEditor te = ctx.getBean(TextEditor.class);
      te.spellCheck();
   }
}

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

Inside SpellChecker constructor.
Inside TextEditor constructor.
Inside checkSpelling.

@Import एनोटेशन

@Importएनोटेशन किसी अन्य कॉन्फ़िगरेशन वर्ग से @Bean परिभाषाओं को लोड करने की अनुमति देता है। एक विन्यास वर्ग पर विचार करें:

@Configuration
public class ConfigA {
   @Bean
   public A a() {
      return new A(); 
   }
}

आप बीन घोषणा से ऊपर बीन घोषणा में आयात कर सकते हैं इस प्रकार है -

@Configuration
@Import(ConfigA.class)
public class ConfigB {
   @Bean
   public B b() {
      return new B(); 
   }
}

अब कॉन्फिगरिंग को कॉन्फिगर करते समय ConfigA.class और ConfigB.class दोनों को निर्दिष्ट करने की आवश्यकता के बजाय, केवल कॉन्फ़िग को निम्नानुसार आपूर्ति की जानी चाहिए -

public static void main(String[] args) {
   ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigB.class);
   
   // now both beans A and B will be available...
   A a = ctx.getBean(A.class);
   B b = ctx.getBean(B.class);
}

जीवनचक्र कॉलबैक

@ बीन एनोटेशन, मनमाने ढंग से आरंभीकरण और विनाश कॉलबैक विधियों को निर्दिष्ट करने का समर्थन करता है, जैसे कि स्प्रिंग एक्सएमएल के इनिट-मेथड और बीन तत्व पर विनाश-विधि विशेषताओं -

public class Foo {
   public void init() {
      // initialization logic
   }
   public void cleanup() {
      // destruction logic
   }
}
@Configuration
public class AppConfig {
   @Bean(initMethod = "init", destroyMethod = "cleanup" )
   public Foo foo() {
      return new Foo();
   }
}

बीन स्कोप को निर्दिष्ट करना

डिफ़ॉल्ट स्कोप सिंगलटन है, लेकिन आप इसे इस प्रकार देख सकते हैं कि @ स्कोप एनोटेशन निम्नानुसार है -

@Configuration
public class AppConfig {
   @Bean
   @Scope("prototype")
   public Foo foo() {
      return new Foo();
   }
}