Showing posts with label java-interview-qauestion. Show all posts
Showing posts with label java-interview-qauestion. Show all posts

Sunday, February 21, 2021

Thread.start() and Thread.run() For java thread interview question

Difference between Thread.start() and Thread.run() method in Java in Hindi?


यदि आपको याद है, जावा में
start() पद्धति को java.lang.Thread क्लास कहकर एक थ्रेड शुरू किया गया है, लेकिन यदि आप अधिक सीखते हैं, तो आपको पता चलेगा कि start()विधि आंतरिक रूप से run() रननेबल इंटरफ़ेस की विधि को कॉल करती है 

अलग थ्रेड में run () विधि में निर्दिष्ट कोड निष्पादित करें। अब सवाल यह है कि, आप start() विधि को कॉल करने के बजाय run () पद्धति को क्यों नहीं कह सकते?

 चूंकि start(),run() को कॉल कर रहा है  वैसे भी, कॉलिंग रन का सीधा प्रभाव कॉलिंग के समान होना चाहिए, नहीं?

खैर, यह मुश्किल java multithreading interview questions में से एक है जो आपको java interview question पर मिलेगा और यह आसान नहीं है क्योंकि यह दिखता है, खासकर यदि आपको java threads के बारे में आधा ज्ञान है।

यहां ट्रिक यह है कि जब आप run () विधि को सीधे कॉल करते हैं तो run () विधि के अंदर कोड को उसी थ्रेड में निष्पादित किया जाता है जो  run method को कॉल करता है। 

JVM तब तक एक नया सूत्र नहीं बनाएगा जब तक आप प्रारंभ विधि को कॉल नहीं करते।

दूसरी तरफ, जब आप Thread.start() method को कॉल करते हैं, तो run() विधि को एक नए थ्रेड पर निष्पादित किया जाएगा, जो वास्तव में  start() विधि द्वारा बनाई गई है।

याद रखने के लिए शुरू और चलाने की विधि के बीच एक और महत्वपूर्ण अंतर यह है कि आप रन विधि को कई बार कॉल कर सकते हैं, जेवीएम किसी भी त्रुटि को नहीं फेंकेगा लेकिन जब आप एक ही thread उदाहरण पर
start() method को कॉल नहीं कर सकते।

पहली बार, t.start () एक नया थ्रेड बनाएगा, लेकिन दूसरी बार यह java.lang.IllegalStateException को फेंक देगा, क्योंकि थ्रेड पहले ही शुरू हो चुका है और आप इसे फिर से शुरू नहीं कर सकते, आप केवल जावा में एक थ्रेड को रोक सकते हैं। एक बार जब यह मर गया तो यह चला गया।

Difference between start() and run() method of Thread class in java in hindi


Run () विधि रननेबल इंटरफ़ेस से आती है लेकिन start () method केवल थ्रेड क्लास में घोषित की जाती है।

 चूंकि java.lang.Thread क्लास इम्प्लीमेंट रनवेबल इंटरफेस है, आप थ्रेड क्लास के इंस्टेंस से run () विधि का उपयोग कर सकते हैं।

मैंने आपको थ्रेड पर कॉलिंग start () विधि और मुख्य थ्रेड से run () विधि को कॉल करने के अंतर को प्रदर्शित करने के लिए जावा प्रोग्राम के बाद बनाया है।

याद रखें, दोनों स्थितियों में run () विधि को कहा जाएगा लेकिन जब आप start () विधि को कॉल करेंगे तो इसे एक नए थ्रेड द्वारा बुलाया जाएगा।

दूसरी ओर, यदि आप run () विधि को सीधे कॉल करते हैं, तो इसे उसी थ्रेड पर बुलाया जाएगा यानी हमारे मामले में मुख्य थ्रेड।

विश्वास नहीं होता? कोड चलाएं और स्वयं देखें। अब उदाहरण देखते हैं।


/**
* Java Program to demonstrate the difference between run() vs start() method of
* Thread class in Java. Just remember that when you directly call the run()
* method, code written inside the run() method will be executed in the calling
* thread, but when you call the start() method then a new thread will be
* created to execute the code written inside run() method in Java.
*
* @author WINDOWS 8
*
*/

public class HelloWorldApp {

public static void main(String args[]) {
Thread t = new Thread() {

@Override
public void run() {
System.out.println(Thread.currentThread().getName()
+ " is executed the run() method");
}
};

System.out.println( Thread.currentThread().getName() + " Calling the start() method of Thread");
t.start();

// let's wait until the thread completes execution
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println( Thread.currentThread().getName() + " Calling the run() method of Thread");
t.run();
}
}
OUTPUT : -

Threads in Java
Threads in Java in hindi


आप स्पष्ट रूप से देख सकते हैं कि जब हमारा main thread (main() method in Javaको निष्पादित करने वाला thread)start
() को कॉल करता है

 थ्रेड नाम के साथ एक नए thread की तुलना में विधि बनाई जाती है और run () विधि उस thread द्वारा निष्पादित की जाती है, लेकिन अगर आप सीधे जावा में एक ही main thread पर इसके निष्पादन की तुलना में run () विधि कहते हैं।

difference between start() and run() method in Java in Hindi के बारे में सब कुछ है। बस याद रखें कि भले ही start () विधि आंतरिक रूप से run() विधि को बुलाती है, इसका मुख्य उद्देश्य एक नया thread बनाना है। 

यदि आप सीधे run () method को कॉल करते हैं, तो रन के बजाय एक नया थ्रेड नहीं बनाया जाएगा उसी थ्रेड पर निष्पादित होगा। इसका मतलब है कि आपको हमेशा जावा में Thread.start() विधि को कॉल करके शुरू करना चाहिए।

Friday, February 19, 2021

Avoid deadlock in Java in Hindi

How to avoid deadlock in Java in Hindi?

जावा में गतिरोध से कैसे बचें? बहु-थ्रेडिंग के लिए लोकप्रिय जावा साक्षात्कार प्रश्न और सीज़न के स्वाद में से एक है, ज्यादातर वरिष्ठ स्तर पर पूछे जाने वाले प्रश्नों के साथ। 

भले ही समस्या बहुत बुनियादी दिखती है, लेकिन जब आप गहराई में जाना शुरू करते हैं, तो अधिकांश जावा डेवलपर्स अटक जाते हैं।

 java interview के सवालों के साथ शुरू होता है, "deadlock in java?" इसका उत्तर सरल है जब दो या दो से अधिक thread एक दूसरे के लिए इंतजार कर रहे हैं ताकि उन्हें जिस संसाधन (लॉक) की आवश्यकता हो, उसे छोड़ दें और अनंत समय के लिए अटक जाएं, स्थिति को गतिरोध कहा जाता है। यह केवल मल्टीटास्किंग या मल्टी-थ्रेडिंग के मामले में होगा।
 

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

यह उच्च प्रदर्शन पर जोर देने के साथ जावा में मल्टीथ्रेडिंग, कॉन्सिरेन्सी, और पैरेलल प्रोग्रामिंग में एक विशेषज्ञ बनने के लिए एक उन्नत पाठ्यक्रम है

java deadlock detection in Hindi?

हालाँकि इसके कई उत्तर हो सकते हैं, मेरा संस्करण है; पहले मैं कोड को देखूंगा यदि मुझे एक नेस्टेड सिंक्रोनाइज़्ड ब्लॉक या दूसरे से एक सिंक्रोनाइज़्ड मेथड दिखाई देता है, या किसी अलग ऑब्जेक्ट पर लॉक लगाने की कोशिश की जा रही है, तो डवलप का एक अच्छा मौका है यदि कोई डेवलपर बहुत सावधान नहीं है।

एक अन्य तरीका यह है कि जब आप एप्लिकेशन को चलाते समय डेड-लॉक हो जाते हैं, तो उसे ढूंढने का प्रयास करें, थ्रेड डंप लेने की कोशिश करें, लिनक्स में आप इसे कमांड "kill -3" से कर सकते हैं, यह एक एप्लीकेशन में सभी थ्रेड्स की स्थिति को प्रिंट करेगा लॉग फ़ाइल, और आप देख सकते हैं कि कौन सा thread किस ऑब्जेक्ट पर लॉक है।

आप Fastthread.io जैसे टूल का उपयोग करके उस थ्रेड डंप का विश्लेषण कर सकते हैं जो आपको अपने थ्रेड डंप को अपलोड करने और उसका विश्लेषण करने की अनुमति देता है।

दूसरा तरीका jConsole / VisualVM का उपयोग करना है, यह आपको दिखाएगा कि कौन से धागे लॉक हो रहे हैं और किस ऑब्जेक्ट पर।

यदि आप अपने थ्रेड डंप का विश्लेषण करने के लिए समस्या निवारण उपकरण और प्रक्रियाओं के बारे में जानना चाहते हैं, 

तो मेरा सुझाव है कि आप यूरिया लेवी द्वारा प्लुरलसिटी पर जावा थ्रेड डंप्स का विश्लेषण करने पर एक नज़र डालें। 

जावा थ्रेड डंप के बारे में अधिक जानने के लिए एक उन्नत व्यावहारिक पाठ्यक्रम, और अन्य लोकप्रिय उन्नत समस्या निवारण उपकरण के साथ आपको परिचित करता है।

मेरा यह भी सुझाव है कि आप  Java Concurrency in Practice Bundle by Heinz Kabutz,में शामिल हों, जावा में कंसर्ट और मल्टी-थ्रेडिंग में महारत हासिल करने के लिए सबसे उन्नत पाठ्यक्रम सामग्री में से एक। यह ब्रायन गोएत्ज़ द्वारा क्लासिक जावा कॉनक्यूरिटी इन प्रैक्टिस किताब पर आधारित है, जो कि हर जावा डेवलपर के लिए एक अनुशंसित रीडिंग है।


deadlock in java in hindi
 deadlock in java


Write a Java program that will result in deadlock?

एक बार जब आप पहले वाले प्रश्न का उत्तर दे देते हैं, तो वे आपसे कोड लिखने के लिए कह सकते हैं (write code which will result in a deadlock in Java?)जिसके परिणामस्वरूप जावा में गतिरोध आ जाएगा?

यहाँ मेरा एक संस्करण है

/**
* Java program to create a deadlock by imposing circular wait.
*
* @author WINDOWS 8
*
*/

public class DeadLockDemo {

/*
* This method request two locks, first String and then Integer
*/

public void method1() {
synchronized (String.class) {
System.out.println("Aquired lock on String.class object");

synchronized (Integer.class) {
System.out.println("Aquired lock on Integer.class object");
}
}
}

/*
* This method also requests same two lock but in exactly
* Opposite order i.e. first Integer and then String.
* This creates potential deadlock, if one thread holds String lock
* and other holds Integer lock and they wait for each other, forever.
*/

public void method2() {
synchronized (Integer.class) {
System.out.println("Aquired lock on Integer.class object");

synchronized (String.class) {
System.out.println("Aquired lock on String.class object");
}
}
}
}


यदि  method1() और  method2()दोनों को दो या कई थ्रेड द्वारा बुलाया जाएगा, तो गतिरोध का एक अच्छा मौका है क्योंकि यदि मेथड 1 को निष्पादित करते समय थ्रेड 1 स्टिंग ऑब्जेक्ट पर लॉक प्राप्त करता है और मेथड 2 को रन करते समय इंटेगर पर थ्रेड 2 प्राप्त करता है। () दोनों एक-दूसरे का इंतजार कर रहे होंगे कि आगे बढ़ने के लिए इंटेगर और स्ट्रिंग पर lock जारी हो।

यह आरेख ठीक हमारे कार्यक्रम को प्रदर्शित करता है, जहां एक thread एक वस्तु पर एक ताला रखता है और अन्य वस्तु ताले की प्रतीक्षा करता है जो अन्य धागे के स्वामित्व में हैं। 

avoid deadlock in java
java deadlock example


आप देख सकते हैं कि थ्रेड 1 ऑब्जेक्ट 2 पर लॉक चाहता है जो थ्रेड 2 द्वारा आयोजित किया गया है, और थ्रेड 2 ऑब्जेक्ट 1 पर एक लॉक चाहता है जो थ्रेड 1 द्वारा आयोजित किया जाता है। चूंकि कोई thread छोड़ने के लिए तैयार नहीं है, इसलिए एक गतिरोध है, और जावा प्रोग्राम अटका हुआ है।

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

How to avoid deadlock in Java In Hindi?

अब साक्षात्कारकर्ता अंतिम भाग में आता है, जो मेरे विचार में सबसे महत्वपूर्ण है; आप कोड में एक गतिरोध कैसे तय करते हैं? या  How to avoid deadlock in Java?

यदि आपने ऊपर दिए गए कोड को ध्यान से देखा है, तो आपको पता चल गया होगा कि गतिरोध का वास्तविक कारण एक से अधिक threads नहीं हैं, बल्कि जिस तरह से वे लॉक का अनुरोध कर रहे हैं, यदि आप आदेशित पहुंच प्रदान करते हैं तो समस्या हल हो जाएगी।

यहाँ मेरा निश्चित संस्करण है, जो गतिरोध से बचने के लिए गतिरोध से बचता है, बिना किसी पूर्वपरिवर्तन के, गतिरोध के लिए आवश्यक चार स्थितियों में से एक।

अब कोई गतिरोध नहीं होगा क्योंकि दोनों विधियाँ एक ही क्रम में इंटेगर और स्ट्रिंग वर्ग शाब्दिक रूप से लॉक पर पहुँच रही हैं। इसलिए, यदि थ्रेड A इंटेगर ऑब्जेक्ट पर लॉक प्राप्त कर लेता है, तो थ्रेड B तब तक आगे नहीं बढ़ेगा जब तक कि थ्रेड A रिलीज नहीं होता आगे बढ़ने के लिए इंटेगर लॉक।


public class DeadLockFixed {

/**
* Both method are now requesting lock in same order,
* first Integer and then String.
* You could have also done reverse e.g. first String and then Integer,
* both will solve the problem, as long as both method are requesting lock
* in consistent order.
*/

public void method1() {
synchronized (Integer.class) {
System.out.println("Aquired lock on Integer.class object");

synchronized (String.class) {
System.out.println("Aquired lock on String.class object");
}
}
}

public void method2() {
synchronized (Integer.class) {
System.out.println("Aquired lock on Integer.class object");

synchronized (String.class) {
System.out.println("Aquired lock on String.class object");
}
}
}
}



Tuesday, February 16, 2021

Spring boot interview question - Creak java interview

1. Introduction spring boot interview question

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

इस ट्यूटोरियल में, हम spring boot से संबंधित कुछ सबसे simple java spring boot interview questions को शामिल करेंगे जो नौकरी के साक्षात्कार के दौरान सामने आ सकते हैं।



Spring boot interview question in hindi- Creak java interview
Spring boot interview question in hindi- Creak java interview

2. Questions For spring boot questions

Q1। स्प्रिंग बूट क्या है और इसकी मुख्य विशेषताएं क्या हैं?

स्प्रिंग बूट मूल रूप से स्प्रिंग फ्रेमवर्क के शीर्ष पर निर्मित तीव्र अनुप्रयोग विकास के लिए एक रूपरेखा है। 

अपने ऑटो-कॉन्फ़िगरेशन और एम्बेडेड एप्लिकेशन सर्वर समर्थन के साथ, व्यापक प्रलेखन और सामुदायिक समर्थन के साथ संयुक्त रूप से इसे आनंद मिलता है, 

स्प्रिंग बूट जावा पारिस्थितिकी तंत्र में आज तक की सबसे लोकप्रिय तकनीकों में से एक है।

यहाँ कुछ मुख्य विशेषताएं हैं:

  •     Starters – एक बार में प्रासंगिक निर्भरता को शामिल करने के लिए निर्भरता विवरणकों का एक सेट
  •     Auto-configuration – क्लासपाथ पर मौजूद निर्भरता के आधार पर किसी एप्लिकेशन को स्वचालित रूप से कॉन्फ़िगर करने का तरीका
  •     Actuator - उत्पादन-तैयार सुविधाओं जैसे निगरानी के लिए
  •     Security
  • Logging


Q2। स्प्रिंग और स्प्रिंग बूट के बीच अंतर क्या हैं?

स्प्रिंग फ्रेमवर्क कई विशेषताएं प्रदान करता है जो वेब एप्लिकेशन के विकास को आसान बनाते हैं। इन सुविधाओं में निर्भरता इंजेक्शन, डेटा बाइंडिंग, aspect-oriented programming, डेटा एक्सेस और कई और अधिक शामिल हैं।

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

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

यहां spring boot के सबसे महत्वपूर्ण लाभों में से दो हैं:

  •     क्लासपथ पर मिलने वाली कलाकृतियों के आधार पर ऑटो-कॉन्फ़िगर एप्लिकेशन
  •     उत्पादन में अनुप्रयोगों के लिए गैर-कार्यात्मक सुविधाएँ प्रदान करें, जैसे कि सुरक्षा या स्वास्थ्य जाँच


Q3। हम मावेन के साथ स्प्रिंग बूट एप्लीकेशन कैसे सेट कर सकते हैं?

हम किसी अन्य पुस्तकालय की तरह मावेन परियोजना में स्प्रिंग बूट को शामिल कर सकते हैं। 

हालांकि, सबसे अच्छा तरीका वसंत-बूट-स्टार्टर-पैरेंट प्रोजेक्ट से विरासत में मिला है और स्प्रिंग बूट शुरुआत के लिए निर्भरता की घोषणा करना है। 

ऐसा करने से हमारी परियोजना स्प्रिंग बूट की डिफ़ॉल्ट सेटिंग्स का पुन: उपयोग करती है।

स्प्रिंग-बूट-स्टार्टर-पैरेंट प्रोजेक्ट को इनहेरिट करना सीधा है - हमें केवल pomx .xml में पेरेंट एलिमेंट को निर्दिष्ट करना है:


<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0.RELEASE</version>
</parent>


हम मावेन सेंट्रल पर स्प्रिंग-बूट-स्टार्टर-पैरेंट का नवीनतम संस्करण पा सकते हैं।

स्टार्टर पैरेंट प्रोजेक्ट का उपयोग करना सुविधाजनक है, लेकिन हमेशा संभव नहीं है। उदाहरण के लिए, यदि हमारी कंपनी को मानक POM से विरासत में सभी परियोजनाओं की आवश्यकता है, तो हम अभी भी कस्टम माता-पिता का उपयोग करके स्प्रिंग बूट के निर्भरता प्रबंधन से लाभ उठा सकते हैं।


Q4। Spring Initializr क्या है?

स्प्रिंग बूट प्रोजेक्ट बनाने के लिए स्प्रिंग इनिग्निज़र एक सुविधाजनक तरीका है।

हम स्प्रिंग प्रीलिफ़र साइट पर जा सकते हैं, एक निर्भरता प्रबंधन उपकरण (या तो मेवेन या ग्रेडल), एक भाषा (जावा, कोटलिन या ग्रूवी), एक पैकेजिंग योजना (जार या युद्ध), संस्करण और निर्भरताएं चुन सकते हैं और परियोजना डाउनलोड कर सकते हैं।

यह हमारे लिए एक कंकाल परियोजना बनाता है और सेटअप समय बचाता है ताकि हम व्यापार तर्क जोड़ने पर ध्यान केंद्रित कर सकें।

यहां तक ​​कि जब हम स्प्रिंग बूट प्रोजेक्ट बनाने के लिए अपनी आईडीई (जैसे एसटीएस या एसटीएस प्लगइन के साथ ग्रहण) नए प्रोजेक्ट विज़ार्ड का उपयोग करते हैं, तो यह हुड के नीचे स्प्रिंग एनरिलिज का उपयोग करता है।

Q 5 What Spring Boot Starters Are Available out There?

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

सभी शुरुआत org.springframework.boot समूह के तहत होती है और उनके नाम वसंत-बूट-स्टार्टर के साथ शुरू होते हैं- यह नामकरण पैटर्न शुरुआत खोजने में आसान बनाता है, खासकर जब आईडीई के साथ काम करते हैं जो नाम से निर्भरता खोजने का समर्थन करते हैं।

इस लेखन के समय, हमारे निपटान में 50 से अधिक शुरुआती हैं। सबसे अधिक उपयोग किया जाता है:

  •     स्प्रिंग-बूट-स्टार्टर: कोर स्टार्टर, जिसमें ऑटो-कॉन्फ़िगरेशन सपोर्ट, लॉगिंग और YAML शामिल हैं
  •     स्प्रिंग-बूट-स्टार्टर-एओपी: स्प्रिंग एओपी और एस्पेक्टज के साथ पहलू-उन्मुख प्रोग्रामिंग के लिए स्टार्टर
  •     स्प्रिंग-बूट-स्टार्टर-डेटा-जेपा: हाइबरनेट के साथ स्प्रिंग डेटा जेपीए का उपयोग करने के लिए स्टार्टर
  •     स्प्रिंग-बूट-स्टार्टर-सुरक्षा: स्प्रिंग सुरक्षा का उपयोग करने के लिए स्टार्टर
  •     स्प्रिंग-बूट-स्टार्टर-टेस्ट: स्प्रिंग बूट एप्लिकेशन के परीक्षण के लिए स्टार्टर
  •     स्प्रिंग-बूट-स्टार्टर-वेब: बिल्डिंग वेब के लिए स्टार्टर, रेस्टफुल सहित, स्प्रिंग एमवीसी का उपयोग करने वाले अनुप्रयोग


शुरुआत की पूरी सूची के लिए, कृपया इस भंडार को देखें।

स्प्रिंग बूट स्टार्टर्स के बारे में अधिक जानकारी प्राप्त करने के लिए, इंट्रो पर स्प्रिंग बूट स्टार्टर्स पर एक नज़र डालें।

Q6। एक विशिष्ट ऑटो-कॉन्फ़िगरेशन को कैसे अक्षम करें?

यदि हम एक विशिष्ट ऑटो-कॉन्फ़िगरेशन को अक्षम करना चाहते हैं, तो हम @EnableAutoConfiguration एनोटेशन के बहिष्करण विशेषता का उपयोग करके इसे इंगित कर सकते हैं। उदाहरण के लिए, यह कोड स्निपेट DataSourceAutoConfiguration को बेअसर करता है:


// other annotations
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
public class MyConfiguration { }


अगर हमने @SpringBootApplication एनोटेशन के साथ ऑटो-कॉन्फ़िगरेशन को सक्षम किया है - जिसमें मेटा-एनोटेशन के रूप में @EnableAutoConfiguration है - हम इसी नाम की विशेषता के साथ ऑटो-कॉन्फ़िगरेशन को अक्षम कर सकते हैं:


// other annotations
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class MyConfiguration { }


हम स्प्रिंग के साथ ऑटो-कॉन्फ़िगरेशन को भी अक्षम कर सकते हैं ।autoconfigure.exclude पर्यावरण संपत्ति। Application.properties फ़ाइल में यह सेटिंग पहले की तरह ही काम करती है:


spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration


प्र 7। कस्टम ऑटो-कॉन्फ़िगरेशन कैसे पंजीकृत करें?

ऑटो-कॉन्फ़िगरेशन क्लास रजिस्टर करने के लिए, हमारे पास META-INF / spring.factories फ़ाइल में EnableAutoConfiguration कुंजी के तहत सूचीबद्ध इसका पूर्ण-योग्य नाम होना चाहिए:


org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.baeldung.autoconfigure.CustomAutoConfiguration


यदि हम मावेन के साथ एक परियोजना का निर्माण करते हैं, तो उस फ़ाइल को संसाधन / मेटा-इन निर्देशिका में रखा जाना चाहिए, जो पैकेज चरण के दौरान उल्लिखित स्थान पर समाप्त हो जाएगा।

Q 8। जब एक बीन अस्तित्व में आता है तो ऑटो-कॉन्फ़िगरेशन को पीछे से कैसे बताएं?

जब कोई बीन पहले से मौजूद है, तो ऑटो-कॉन्फ़िगरेशन क्लास को बैक-ऑफ करने का निर्देश देने के लिए, हम @ConditionalOnMissingBean एनोटेशन का उपयोग कर सकते हैं। इस एनोटेशन की सबसे उल्लेखनीय विशेषताएं हैं:


    मूल्य: सेम के प्रकारों की जाँच की जानी चाहिए
    नाम: सेम के नामों की जाँच की जानी है

जब @ विधि से सजी एक विधि पर रखा जाता है, तो लक्ष्य प्रकार विधि की वापसी प्रकार में चूक करता है:


@Configuration
public class CustomConfiguration {
@Bean
@ConditionalOnMissingBean
public CustomService service() { ... }
}

Q9. Jar and War Files के रूप में स्प्रिंग बूट वेब एप्लिकेशन को कैसे नियुक्त करें?

परंपरागत रूप से, हम एक वेब एप्लिकेशन को एक WAR फ़ाइल के रूप में पैकेज करते हैं, फिर इसे एक बाहरी सर्वर में तैनात करते हैं। ऐसा करने से हम एक ही सर्वर पर कई एप्लिकेशन की व्यवस्था कर सकते हैं। उस समय जब सीपीयू और मेमोरी दुर्लभ थे, यह संसाधनों को बचाने का एक शानदार तरीका था।

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

वसंत एक निष्पादन योग्य जार के रूप में एक वेब एप्लिकेशन को पैकेज करने के लिए एक प्लगइन, अर्थात् वसंत-बूट-मावेन-प्लगइन प्रदान करके इस समस्या से निपटता है। इस प्लगइन को शामिल करने के लिए, बस pom.xml में एक प्लगइन तत्व जोड़ें:


<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>


जगह में इस प्लगइन के साथ, हम पैकेज चरण को निष्पादित करने के बाद एक मोटा जार प्राप्त करेंगे। इस JAR में एक एम्बेडेड सर्वर सहित सभी आवश्यक निर्भरताएँ हैं। इस प्रकार, हमें अब बाहरी सर्वर को कॉन्फ़िगर करने के बारे में चिंता करने की आवश्यकता नहीं है।

हम तब एप्लिकेशन को वैसे ही चला सकते हैं जैसे हम एक सामान्य निष्पादन योग्य JAR।

ध्यान दें कि pom.xml फ़ाइल में पैकेजिंग तत्व जार को JAR फ़ाइल बनाने के लिए सेट किया जाना चाहिए:


<packaging>jar</packaging>


यदि हम इस तत्व को शामिल नहीं करते हैं, तो यह जार के लिए भी चूक है।

यदि हम WAR फ़ाइल बनाना चाहते हैं, तो पैकेजिंग तत्व को युद्ध में बदल दें:


<packaging>war</packaging>


और डिब्बाबंद फ़ाइल से कंटेनर निर्भरता को छोड़ दें:


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>


मावेन पैकेज चरण को निष्पादित करने के बाद, हमारे पास एक डब्लूएआर फ़ाइल होगी।

प्रश्न 10। कमांड लाइन अनुप्रयोगों के लिए स्प्रिंग बूट का उपयोग कैसे करें?

किसी भी अन्य जावा प्रोग्राम की तरह, स्प्रिंग बूट कमांड लाइन एप्लिकेशन में एक मुख्य विधि होनी चाहिए। यह विधि एक प्रवेश बिंदु के रूप में कार्य करती है, जो SpringApplication#run method को एप्लिकेशन को बूटस्ट्रैप करने के लिए आमंत्रित करती है:

Code for spring boot interview questions 


@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class);
// other statements
}
}

SpringApplication class फिर एक स्प्रिंग कंटेनर और ऑटो-कॉन्फ़िगर बीन्स को निकालता है।

ध्यान दें कि हमें प्राथमिक कॉन्फ़िगरेशन स्रोत के रूप में काम करने के लिए रन क्लास के लिए एक कॉन्फ़िगरेशन क्लास पास करना होगा। कन्वेंशन द्वारा, यह तर्क ही एंट्री क्लास है।

रन विधि को कॉल करने के बाद, हम एक नियमित कार्यक्रम के रूप में अन्य कथनों को निष्पादित कर सकते हैं।


प्रश्न 11 External Configuration के संभावित स्रोत क्या हैं?

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

हम कॉन्फ़िगरेशन फ़ाइलों को निर्दिष्ट करने के लिए properties files, YAML files, environment variables, system properties और कमांड-लाइन विकल्प तर्क का उपयोग कर सकते हैं।

उसके बाद हम उन संपत्तियों का उपयोग कर सकते हैं जो @Value एनोटेशन, @ConfigurationProperties एनोटेशन, या पर्यावरण अमूर्त के माध्यम से एक बाउंड ऑब्जेक्ट का उपयोग कर रहे हैं।

प्रश्न 12। इसका क्या मतलब है कि स्प्रिंग बूट सपोर्टिंग बाइंडिंग में ढील देता है?

स्प्रिंग बूट में आराम से बांधना विन्यास गुणों के प्रकार-सुरक्षित बंधन पर लागू होता है।

आराम से बंधन के साथ, एक संपत्ति की कुंजी को एक संपत्ति के नाम का सटीक मिलान होने की आवश्यकता नहीं है। इस तरह की पर्यावरण संपत्ति को कैमसेल, कबाब-केस, स्नेक_केस या अपरकेस में अंडरस्कोर द्वारा अलग किए गए शब्दों के साथ लिखा जा सकता है।

उदाहरण के लिए, अगर @ConfigurationProperties एनोटेशन वाली बीन क्लास में एक प्रॉपर्टी का नाम myProp है, तो यह इन में से किसी भी पर्यावरण गुण के लिए बाध्य हो सकती है:

myProp, my-prop, my_prop, or MY_PROP.

प्रश्न 13.  Spring Boot Devtools के लिए क्या प्रयोग किया जाता है?

स्प्रिंग बूट डेवलपर टूल, या देवटूल, विकास प्रक्रिया को आसान बनाने वाले उपकरणों का एक समूह है। इन विकास-समय सुविधाओं को शामिल करने के लिए, हमें बस pom.xml फ़ाइल पर निर्भरता जोड़ने की आवश्यकता है:


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>


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

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

जब भी क्लासपाथ पर कोई फ़ाइल बदलती है, DevTools का उपयोग करने वाले एप्लिकेशन पुनः आरंभ होते हैं। यह विकास में एक बहुत ही सहायक विशेषता है, क्योंकि यह संशोधनों के लिए त्वरित प्रतिक्रिया देता है।

डिफ़ॉल्ट रूप से, स्थैतिक संसाधन, जिसमें व्यू टेम्प्लेट शामिल हैं, फिर से शुरू न करें। 

इसके बजाय, एक संसाधन परिवर्तन एक ब्राउज़र ताज़ा ट्रिगर करता है। ध्यान दें कि यह तभी हो सकता है 

जब LiveReload एक्सटेंशन को ब्राउज़र में स्थापित किया गया है ताकि एम्बेडेड LiveReload सर्वर के साथ बातचीत की जा सके जिसमें DevTools शामिल हैं।

इस विषय पर अधिक जानकारी के लिए, कृपया स्प्रिंग बूट देवटूल का अवलोकन देखें।


Q14. How to Write Integration Tests?


स्प्रिंग एप्लिकेशन के लिए एकीकरण परीक्षण चलाते समय, हमारे पास ApplicationContext होना चाहिए।

हमारे जीवन को आसान बनाने के लिए, स्प्रिंग बूट परीक्षण के लिए एक विशेष एनोटेशन प्रदान करता है - @SpringBootTest। यह एनोटेशन अपनी कक्षाओं विशेषता द्वारा इंगित कॉन्फ़िगरेशन कक्षाओं से एक ApplicationContext बनाता है।

यदि क्लास की विशेषता सेट नहीं होती है, तो स्प्रिंग बूट प्राथमिक कॉन्फ़िगरेशन क्लास के लिए खोज करता है। खोज पैकेज से शुरू होती है जिसमें परीक्षण तब तक होता है जब तक कि यह @SpringBootApplication या @SpringBootConfiguration के साथ एनोटेट न हो जाए।

विस्तृत निर्देशों के लिए, स्प्रिंग बूट में परीक्षण के बारे में हमारे ट्यूटोरियल की जाँच करें।

spring boot interview questions in Hindi:-


प्र 15। Spring Boot Actuator के लिए क्या उपयोग किया जाता है?

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

एक परियोजना में स्प्रिंग बूट एक्ट्यूएटर को एकीकृत करना बहुत सरल है। हमें बस इतना करना है कि वसंत-बूट-स्टार्टर-एक्ट्यूएटर स्टार्टर को pom.xml फ़ाइल में शामिल करें:


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>


स्प्रिंग बूट एक्ट्यूएटर HTTP या जेएमएक्स एंडपॉइंट का उपयोग करके परिचालन जानकारी को उजागर कर सकता है। अधिकांश एप्लिकेशन HTTP के लिए चलते हैं, हालांकि, जहां एक समापन बिंदु और / एक्चुएटर उपसर्ग की पहचान एक URL पथ बनाती है।

यहाँ कुछ सबसे आम बिल्ट-इन एंडपॉइंट्स Actuator प्रदान करता है:


  • env: Exposes environment properties
  • health: Shows application health information
  • httptrace: Displays HTTP trace information
  • info: Displays arbitrary application information
  • metrics: Shows metrics information
  • loggers: Shows and modifies the configuration of loggers in the application
  • mappings: Displays a list of all @RequestMapping paths



प्रश्न 16। एक स्प्रिंग बूट प्रोजेक्ट को कॉन्फ़िगर करने का एक बेहतर तरीका क्या है - Properties or YAML का उपयोग करना?

YAML गुण फाइलों पर कई लाभ प्रदान करता है, जैसे:

  •     अधिक स्पष्टता और बेहतर पठनीयता
  •     पदानुक्रमित कॉन्फ़िगरेशन डेटा के लिए बिल्कुल सही, जिसे बेहतर, अधिक पठनीय प्रारूप में भी दर्शाया गया है
  •     नक्शे, सूचियों और स्केलर प्रकारों के लिए समर्थन
  •     एक ही फाइल में कई प्रोफाइल शामिल कर सकते हैं (चूंकि स्प्रिंग बूट 2.4.0, यह गुण फाइलों के लिए भी संभव है)


हालाँकि, इसे लिखना इसके इंडेंटेशन नियमों के कारण थोड़ा मुश्किल और त्रुटि-रहित हो सकता है।

विवरण और काम के नमूने के लिए, कृपया हमारे स्प्रिंग YAML बनाम गुण ट्यूटोरियल देखें।


प्रश्न 17। Spring Boot Offers मूल आधार क्या हैं?

प्राथमिक एनोटेशन जो स्प्रिंग बूट अपने org.springframework.boot.autoconfigure और इसके उप-पैकेज में रहते हैं। यहाँ कुछ बुनियादी बातें हैं:

  •     @EnableAutoConfiguration - इसके क्लासपाथ पर ऑटो-कॉन्फ़िगरेशन बीन्स के लिए स्प्रिंग बूट देखो और स्वचालित रूप से उन्हें लागू करने के लिए।
  •     @SpringBootApplication - एक बूट एप्लिकेशन के मुख्य वर्ग को निरूपित करने के लिए उपयोग किया जाता है। यह एनोटेशन उनके डिफ़ॉल्ट विशेषताओं के साथ @Configuration, @EnableAutoConfiguration और @ComponentScan एनोटेशन को जोड़ती है।


स्प्रिंग बूट एनोटेशन विषय में अधिक जानकारी प्रदान करता है।

प्रश्न 18। आप स्प्रिंग बूट में डिफ़ॉल्ट पोर्ट कैसे बदल सकते हैं?

हम स्प्रिंग बूट में एम्बेडेड सर्वर के डिफ़ॉल्ट पोर्ट को इनमें से किसी एक तरीके से बदल सकते हैं:

  •     प्रॉपर्टी फ़ाइल का उपयोग करना - हम इसे एक प्रॉपर्टी सर्वर का उपयोग करके एक application.properties (या application.yml) फ़ाइल में परिभाषित कर सकते हैं।
  •     प्रोग्रामेटिक रूप से - हमारे मुख्य @SpringBootApplication वर्ग में, हम SpringApplication इंस्टेंस पर server.port सेट कर सकते हैं
  •     कमांड लाइन का उपयोग करना - एप्लिकेशन को जार फाइल के रूप में चलाने पर, हम सर्वर.पोर्ट को जावा कमांड तर्क के रूप में सेट कर सकते हैं:


java -jar -Dserver.port=8081 myspringproject.jar

प्रश्न 19। कौन से एंबेडेड सर्वर स्प्रिंग बूट सपोर्ट करते हैं, और डिफ़ॉल्ट कैसे बदलें?

तिथि के अनुसार,
Tomcat, Jetty, and Undertow का समर्थन करता है। टॉमकैट स्प्रिंग बूट के वेब स्टार्टर द्वारा समर्थित डिफ़ॉल्ट एप्लिकेशन सर्वर है।

स्प्रिंग वेबफ्लक्स रिएक्टर   Netty, Tomcat, Jetty, and Undertow को रिएक्टर नेट्टी के साथ डिफ़ॉल्ट रूप से समर्थन करता है।

स्प्रिंग एमवीसी में, डिफ़ॉल्ट को बदलने के लिए, आइए जेट्टी से कहते हैं, हमें टॉमकैट को बाहर करने की जरूरत है और निर्भरता में जेट्टी को शामिल करें:


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>


इसी प्रकार, WebFlux से UnderTow में डिफ़ॉल्ट को बदलने के लिए, हमें रिएक्टर neety को बाहर करने की जरूरत है और निर्भरता में UnderTow को शामिल करना होगा।

"स्प्रिंग बूट में समाहित एम्बेडेड सर्वलेट की तुलना में" स्प्रिंग एमवीसी के साथ हम जिन विभिन्न एम्बेडेड सर्वरों का उपयोग कर सकते हैं उन पर अधिक विवरण हैं।

Read spring boot interview questions :-

क्यू 20। हमें स्प्रिंग प्रोफाइल की आवश्यकता क्यों है?

उद्यम के लिए एप्लिकेशन विकसित करते समय, हम आम तौर पर देव, क्यूए और प्रोडक्ट जैसे कई वातावरणों से निपटते हैं। इन वातावरणों के लिए कॉन्फ़िगरेशन गुण अलग-अलग हैं।

उदाहरण के लिए, हम देव के लिए एक एम्बेडेड H2 डेटाबेस का उपयोग कर सकते हैं, लेकिन उत्पाद का मालिकाना Oracle या DB2 हो सकता है। भले ही DBMS पूरे परिवेश में समान हो, लेकिन URL निश्चित रूप से भिन्न होंगे।

इस आसान और स्वच्छ बनाने के लिए, स्प्रिंग में प्रत्येक पर्यावरण के लिए कॉन्फ़िगरेशन को अलग करने में मदद करने के लिए प्रोफाइल का प्रावधान है। ताकि इस प्रोग्राम को बनाए रखने के बजाय, गुणों को अलग-अलग फाइलों में रखा जा सके जैसे कि application-dev.properties और application-prod.properties। डिफ़ॉल्ट application.properties वर्तमान में सक्रिय प्रोफ़ाइल पर spring.profiles.active का उपयोग करके इंगित करता है ताकि सही कॉन्फ़िगरेशन उठाया जाए।