वास्तव में JavaBean क्या है?


1793

मैं समझ गया, मुझे लगता है, कि एक "बीन" एक जावा वर्ग है जिसमें गुण और गेटर्स / सेटर हैं। जितना मैं समझता हूं, यह एक सी संरचना के बराबर है। क्या यह सच है?

इसके अलावा, क्या एक सेम और एक नियमित वर्ग के बीच वास्तविक वाक्यात्मक अंतर है? क्या कोई विशेष परिभाषा या एक इंटरफ़ेस है?

मूल रूप से, इसके लिए एक शब्द क्यों है?

इसके अलावा Serializableइंटरफ़ेस का क्या मतलब है?


14
उन स्थानों को देखें जहां जावा बीन्स का उपयोग किया गया था? । यह कुछ सम्मेलनों के बाद एक वर्ग है।
मैथ्यू फ्लेशेन

5
पूर्णता की खातिर, यहाँ JavaBeans Specification का लिंक दिया गया है
informatik01

2
सिर्फ एक नोट। यदि आप कभी भी लोगों को पीओजेओ शब्द के आसपास फेंकते हुए सुनते हैं, तो उनका मतलब वास्तव में बीन से है। जब आप POJOs देखते हैं तो वे लगभग हमेशा बसने वाले और पाने वाले होते हैं, क्रमबद्ध होते हैं, ... वास्तविकता में एक POJO को बसने वाले और गेटर्स की आवश्यकता नहीं होती है, एक धारावाहिक इंटरफ़ेस या कुछ और - यह केवल कुछ विशिष्ट आवश्यकताओं के साथ एक प्लेन ओल्ड जावा ऑब्जेक्ट है।
बिल के

जवाबों:


2011

एक जावाबीन सिर्फ एक मानक है

  1. सभी गुण निजी ( गेटर्स / सेटर्स का उपयोग करें )
  2. एक सार्वजनिक गैर-तर्क निर्माता
  3. औजार Serializable

बस। यह सिर्फ एक सम्मेलन है। पुस्तकालयों के बहुत सारे इस पर निर्भर करते हैं।

एपीआई प्रलेखनSerializable से, के संबंध में :

Java.io.Serializable इंटरफ़ेस को लागू करने वाले वर्ग द्वारा एक वर्ग की क्रमिकता को सक्षम किया गया है। जो वर्ग इस इंटरफ़ेस को लागू नहीं करते हैं, उनके पास कोई भी राज्य अनुक्रमित या deserialized नहीं होगा। एक क्रमबद्ध वर्ग के सभी उपप्रकार स्वयं क्रमबद्ध हैं। क्रमांकन इंटरफ़ेस की कोई विधियाँ या क्षेत्र नहीं हैं और केवल क्रमिक होने के शब्दार्थ की पहचान करने के लिए कार्य करता है।

दूसरे शब्दों में, धारावाहिक वस्तुओं को धाराओं, और इसलिए फ़ाइलों, ऑब्जेक्ट डेटाबेस, वास्तव में कुछ भी लिखा जा सकता है।

इसके अलावा, JavaBean और एक अन्य वर्ग के बीच कोई वाक्यात्मक अंतर नहीं है - यदि मानकों का पालन करता है तो एक वर्ग JavaBean है।

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


197
ठीक है, मेरी राय में सेम के चारों ओर घूमने वाले लगभग सभी दस्तावेज इस शब्द का संक्षिप्त वर्णन नहीं कर सकते हैं जैसा कि आपके पास है। +1
अंदाप

10
क्या सेम के सदस्यों के लिए भी सेम होना आवश्यक है? एक उचित आवश्यकता की तरह लगता है ..
worldayshi

14
@ सेवरसही - नहीं, इसकी आवश्यकता नहीं है। उदाहरण के लिए एक सेम में एक स्ट्रिंग शामिल हो सकता है; और स्ट्रिंग एक सेम नहीं है। (स्ट्रिंग अपरिवर्तनीय है, इसलिए आप इसे खाली कंस्ट्रक्टर और सेटर कहकर नहीं बना सकते हैं।) यह उचित प्रतीत होता है कि एक Serializable ऑब्जेक्ट में Serializable सदस्य होने चाहिए, जब तक कि यह किसी तरह उन्हें बाहर से अनुक्रमित नहीं करता है। तो नहीं, जावा सेम के सदस्यों को जावा सेम के किसी भी पहलू को रखने की आवश्यकता नहीं है। हालांकि यह अधिक सरल है अगर वे सेम हैं, भी।
विलीम बुआर

12
"सभी गुण निजी" सही नहीं है। गुण प्राप्तकर्ताओं और वासियों से प्रभावित होते हैं (यदि कोई विधि X getFoo () है -> बीन में "फू" नामक एक पठनीय संपत्ति है; यदि कोई विधि setFoo (X foo) है -> बीन में लेखनीय संपत्ति है) "foo")। गुणों को सदस्य क्षेत्रों द्वारा समर्थित किया जा सकता है (लेकिन ऐसा नहीं होना चाहिए) जो आमतौर पर निजी होते हैं।
पोस

2
मुझे उम्मीद है कि जावा बीन होने के लिए "एक वर्ग सार्वजनिक होना चाहिए"। और क्या वास्तव में यह ज़रूरी है कि यह सीरियल इंटरफ़ेस लागू करना चाहिए ??
सत्यब्रत साहू

286

यह ध्वनि विशेष बनाने के लिए इसके लिए एक शब्द है। वास्तविकता इतने रहस्यमय के पास कहीं नहीं है।

असल में, एक "बीन":

  • एक अनुक्रमिक वस्तु है (जो है, यह लागू java.io.Serializableकरता है, और ऐसा सही ढंग से करता है), कि
  • "गुण" हैं जिनके गेटर्स और सेटर्स कुछ नामों के साथ सिर्फ विधियां हैं (जैसे, कहते हैं, getFoo()"फू" संपत्ति के लिए गेट्टर है), और
  • सार्वजनिक 0-arg निर्माता है (इसलिए इसे अपनी संपत्तियों को सेट करके इच्छानुसार बनाया और कॉन्फ़िगर किया जा सकता है)।

अपडेट करें:

के रूप में Serializable: यह एक "मार्कर इंटरफ़ेस" (कोई इंटरफ़ेस जो किसी भी फ़ंक्शन को घोषित नहीं करता है) के अलावा कुछ भी नहीं है जो जावा को बताता है कि कार्यान्वयन वर्ग सहमति देता है (और इसका मतलब है कि यह सक्षम है) "क्रमांकन" - एक प्रक्रिया जो परिवर्तित करती है बाइट्स की एक धारा में एक उदाहरण। उन बाइट्स को फ़ाइलों में संग्रहीत किया जा सकता है, एक नेटवर्क कनेक्शन आदि पर भेजा जा सकता है, और एक जेवीएम (कम से कम, एक जो वस्तु के प्रकार के बारे में जानता है) को बाद में ऑब्जेक्ट को फिर से संगठित करने की अनुमति देने के लिए पर्याप्त जानकारी है - संभवतः किसी अन्य उदाहरण में आवेदन, या यहां तक ​​कि एक पूरी मशीन पर!

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

एक वर्ग जो उन सीमाओं का पालन नहीं कर सकता है, उसे लागू नहीं करना चाहिए Serializable(और, IIRC, जावा कंपाइलर भी ऐसा नहीं करने देगा ।)


यह शायद एक बेवकूफी भरा सवाल है लेकिन, एक आदिम प्रकार या एक वर्ग के उदाहरण के अलावा एक उदाहरण क्षेत्र क्या हो सकता है?
Kingfrito_5005

8
@ Kingfrito_5005: यह एक या दूसरे होने जा रहा है। लेकिन अगर यह एक वर्ग का उदाहरण है, तो यह मायने रखता है कि वह श्रेणी अनुक्रमिक है या नहीं। वर्ग के क्रमबद्ध होने के लिए, इसके गैर- transientभागों को कुछ क्रमबद्ध प्रकार का होना चाहिए।
cHao

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

@AmosKosgei: भूल गए; यह सिर्फ बेमानी होगा। परिभाषा के अनुसार एक डिफ़ॉल्ट निर्माणकर्ता को बिना किसी तर्क के बुलाया जा सकता है।
cHao

@Amos: जैसा कि मैंने इस पर गौर किया है, हालांकि, ऐसा लगता है कि "डिफॉल्ट कंस्ट्रक्टर" का मतलब जावा में C ++ से थोड़ा अलग है। : P को "0-arg" के साथ "डिफ़ॉल्ट" बदला गया।
cHao

94

JavaBeans जावा कक्षाएं हैं जो एक अत्यंत सरल कोडिंग सम्मेलन का पालन करती हैं। आपको बस इतना करना है

  1. कार्यान्वयन java.io.Serializableइंटरफ़ेस - एक वस्तु की स्थिति को बचाने के लिए
  2. एक सार्वजनिक खाली तर्क निर्माता का उपयोग करें - वस्तु को तुरंत करने के लिए
  3. सार्वजनिक चर / सेटर विधियां प्रदान करना - निजी चरों (संपत्तियों) के मूल्यों को प्राप्त करना और सेट करना।

इस तरह की सरल व्याख्या वह है जिसकी मुझे तलाश थी। धन्यवाद!
मोदो

62

JavaBeans के गुण

एक जावाबीन एक जावा ऑब्जेक्ट है जो कुछ प्रोग्रामिंग सम्मेलनों को संतुष्ट करता है:

  1. JavaBean वर्ग को Serializableया तो लागू करना चाहिए या Externalizable

  2. JavaBean क्लास में एक नो-आर्ग कंस्ट्रक्टर होना चाहिए

  3. सभी JavaBean संपत्तियों में सार्वजनिक सेटर और गेट्टर विधियाँ होनी चाहिए

  4. सभी JavaBean उदाहरण चर निजी होने चाहिए

JavaBeans का उदाहरण

@Entity
public class Employee implements Serializable{

   @Id
   private int id;
   private String name;   
   private int salary;  

   public Employee() {}

   public Employee(String name, int salary) {
      this.name = name;
      this.salary = salary;
   }
   public int getId() {
      return id;
   }
   public void setId( int id ) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName( String name ) {
      this.name = name;
   }
   public int getSalary() {
      return salary;
   }
   public void setSalary( int salary ) {
      this.salary = salary;
   }
}

3
क्या एनोटेशन आवश्यक हैं या जावा बीन का हिस्सा हैं?
गियान्निस क्रिस्तोकिस

7
@incnischristofakis नहीं, एनोटेशन आवश्यक नहीं हैं। एनोटेशन स्प्रिंग फ्रेमवर्क का हिस्सा होते हैं, जो बड़े पैमाने पर जावा बीन्स का उपयोग करते हैं।
तियानजिन Xiong

1
इसके लिए नो-आर्ग कंस्ट्रक्टर की आवश्यकता क्यों है?
रेनाटो

6
@ रेनाटो यह बहुत सरल है। वसंत के बारे में सोचें जो स्वचालित रूप से आपके बीन को आर्ग-कंस्ट्रक्टर के साथ तत्काल करना चाहिए ... यह तर्कों के रूप में क्या होगा? ;)
एलेक्स

24

एक उदाहरण के साथ स्पष्टीकरण।

1. java.io.Serializable आयात करें

Serialization के लिए, दस्तावेज़ीकरण देखें ।

2. निजी क्षेत्र

बाहरी क्षेत्रों को आसानी से उन क्षेत्रों को संशोधित करने से रोकने के लिए फ़ील्ड निजी होनी चाहिए। उन क्षेत्रों पर सीधे आरोप लगाने के बजाय, usuagly getter / सेटर विधियों का उपयोग किया जाता है।

3. संवाहक

एक सार्वजनिक निर्माता बिना किसी तर्क के।

4. गेटटर / सेटर

निजी क्षेत्रों तक पहुँचने और संशोधन के लिए गेट्टर और सेटर विधियाँ।

/** 1. import java.io.Serializable */
public class User implements java.io.Serializable {
    /** 2. private fields */
    private int id;
    private String name;

    /** 3. Constructor */
    public User() {
    }
    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    /** 4. getter/setter */
    // getter
    public int getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    // setter
    public void setId(int id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
}

2
मुझे लगता है कि setId(int id)शरीर का मतलब है कि आप के this.id = id;बजाय कहने के लिएthis.id = is;
स्टीवन 7mwigigwa

18

जावा बीन्स कम कोड और अधिक कार्य दृष्टिकोण के लिए उपयोग कर रहे हैं ... जावा बीन्स का उपयोग जावा ईई में रनटाइम डिस्कवरी और एक्सेस के लिए एक सार्वभौमिक अनुबंध के रूप में किया जाता है। उदाहरण के लिए, JavaServer Pages (JSP) जावा बीन्स का उपयोग पेज के बीच या सर्वलेट्स और JSPs के बीच डेटा ट्रांसफर ऑब्जेक्ट के रूप में करता है। जावा ईई के जावाबीन्स एक्टिवेशन फ्रेमवर्क, जावा ईई में MIME डेटा प्रकारों के लिए समर्थन को एकीकृत करने के लिए जावा बीन्स का उपयोग करता है। जावा ईई प्रबंधन एपीआई जावा ईई वातावरण में प्रबंधित किए जाने वाले संसाधनों के इंस्ट्रूमेंटेशन के लिए नींव के रूप में जावाबीन का उपयोग करता है।

सीरियलाइजेशन के बारे में:

ऑब्जेक्ट क्रमांकन में किसी ऑब्जेक्ट को बाइट्स के अनुक्रम के रूप में दर्शाया जा सकता है जिसमें ऑब्जेक्ट के डेटा के साथ-साथ ऑब्जेक्ट के प्रकार और ऑब्जेक्ट में संग्रहीत डेटा के प्रकार के बारे में जानकारी शामिल होती है।

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


17

सेम के पार और उनके पार स्थानांतरित होने के बाद, आप कई सर्वरों पर अपनी परियोजना को तैनात करते समय सीरियलाइजेशन को उपयोगी पाएंगे।


1
क्या आप कई सर्वरों पर परियोजना को लागू करने के बारे में अधिक जानकारी प्रदान कर सकते हैं? धन्यवाद
Hanfeng

4
सर्वर के एक जोड़े के साथ एक क्लस्टर का कहना है, Websphere के लिए इस लिंक stackoverflow.com/questions/3193345/… मदद कर सकते हैं।
Truong Ha

10

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

हालांकि, IMO, यह एक सरल वाक्यविन्यास मानक से अधिक है। जावा बीन्स का वास्तविक अर्थ या इच्छित उपयोग, विभिन्न उपकरणों के साथ-साथ मानक के आसपास समर्थन करता है, कोड पुन: उपयोग और घटक-आधारित सॉफ़्टवेयर इंजीनियरिंग की सुविधा प्रदान करने के लिए, अर्थात डेवलपर्स को मौजूदा घटकों (कक्षाओं) को इकट्ठा करके और किसी भी लिखने के बिना एप्लिकेशन बनाने में सक्षम बनाता है। कोड (या केवल थोड़ा गोंद कोड लिखना होगा)। दुर्भाग्य से यह तकनीक उद्योग द्वारा कम-अनुमानित और कम-उपयोग है, जिसे इस धागे में दिए गए उत्तर से बताया जा सकता है।

यदि आप जावा बीन्स पर ओरेकल के ट्यूटोरियल को पढ़ते हैं , तो आप इसमें बेहतर समझ प्राप्त कर सकते हैं।


उपयोगी पोस्ट और लिंक जब मैं सेम के बारे में सोचता हूं तो मैं वास्तव में "विज़ुअल बिल्डर" प्रकार की चीज के बारे में सोचता हूं, जैसा कि ओरेकल लेख में सचित्र है। मुझे आश्चर्य है कि क्या कई अन्य ढांचे हैं जो उन्हें बड़े पैमाने पर उपयोग करते हैं ...
माइक कृंतक

9

विकिपीडिया के अनुसार:

  1. कक्षा में एक सार्वजनिक डिफ़ॉल्ट कंस्ट्रक्टर होना चाहिए (जिसमें कोई तर्क नहीं है)। यह संपादन और सक्रियण चौखटे के भीतर आसान तात्कालिकता की अनुमति देता है।

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

  3. वर्ग क्रमबद्ध होना चाहिए। [यह वीएम और प्लेटफॉर्म से स्वतंत्र तरीके से बीन की स्थिति को मज़बूती से सहेजने, संग्रहीत करने और पुनर्स्थापित करने के लिए अनुप्रयोगों और रूपरेखाओं की अनुमति देता है।]

अधिक जानकारी के लिए इस लिंक को फॉलो करें


7

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


7

जावा बीन एक जावा वर्ग है [वैचारिक] जिसे निम्नलिखित सम्मेलनों का पालन करना चाहिए:

  1. इसमें एक नो-आर्ग कंस्ट्रक्टर होना चाहिए।
  2. यह Serializable होना चाहिए।
  3. इसे गुणों के मूल्यों को प्राप्त करने और प्राप्त करने के तरीके प्रदान करने चाहिए, जिन्हें गेट्टर और सेटर विधियों के रूप में जाना जाता है।

यह एक पुन: प्रयोज्य सॉफ्टवेयर घटक है। यह कई ऑब्जेक्ट को एक ऑब्जेक्ट में इनकैप कर सकता है ताकि एक ही ऑब्जेक्ट को कई जगहों से एक्सेस किया जा सके और कोड के आसान रखरखाव की दिशा में एक कदम हो।


1
जावा सेम के बारे में बात करते समय मुझे "पुन: प्रयोज्य सॉफ़्टवेयर घटक" पसंद है - क्योंकि सामान्य रूप से जावा सेम बिल्कुल कुछ भी नहीं करते हैं।
रोडनी पी। बारबाती

6

वे क्रमबद्ध हैं, एक शून्य-तर्क निर्माता हैं, और गेट्टर और सेटर विधियों का उपयोग करके गुणों तक पहुंचने की अनुमति देते हैं। "बीन" नाम इस मानक को शामिल करने के लिए दिया गया था, जिसका उद्देश्य जावा के लिए पुन: प्रयोज्य सॉफ्टवेयर घटक बनाना है।according to विकि

आपके अनुप्रयोग की रीढ़ की हड्डी बनाने वाले और स्प्रिंग आईओसी कंटेनर द्वारा प्रबंधित वस्तुओं को सेम कहा जाता है। बीन एक ऐसी वस्तु है, जो स्प्रिंग आईओसी कंटेनर द्वारा त्वरित, इकट्ठी और अन्यथा प्रबंधित की जाती है। अन्यथा, एक बीन आपके आवेदन में कई वस्तुओं में से एक है। according to वसंत io


4

बीन कॉन्सेप्ट पर बस थोड़ा सा बैकग्राउंड / अपडेट। कई अन्य जवाबों में वास्तव में क्या है लेकिन इतना नहीं है कि उनमें से क्यों।

वे GUIs के निर्माण के हिस्से के रूप में जावा में जल्दी आविष्कार किए गए थे। उन्होंने उन पैटर्न का अनुसरण किया जो टूल के लिए आसान थे ताकि वे एक गुण पैनल बना सकें जिससे आप बीन की विशेषताओं को संपादित कर सकें। सामान्य तौर पर, बीन गुण स्क्रीन पर एक नियंत्रण का प्रतिनिधित्व करते हैं (थिंक x, y, चौड़ाई, ऊंचाई, पाठ, ..)

आप इसे एक मजबूत टाइप की गई डेटा संरचना के रूप में भी सोच सकते हैं।

समय के साथ ये बहुत सारे उपकरणों के लिए उपयोगी हो गए, जिन्होंने एक ही प्रकार की पहुंच का उपयोग किया (उदाहरण के लिए, डेटाबेस में डेटा संरचनाओं को जारी रखने के लिए हाइबरनेट करें)

जैसे-जैसे उपकरण विकसित होते गए, वे एनोटेशन की ओर अधिक बढ़ते गए और सेटर / गेट्टर नामों के अलावा खींचते चले गए। अब अधिकांश प्रणालियों को सेम की आवश्यकता नहीं होती है, वे किसी भी सादे पुराने जावा ऑब्जेक्ट को एनोटेट गुणों के साथ ले जा सकते हैं ताकि उन्हें बता सकें कि उन्हें कैसे हेरफेर करना है।

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

बीन्स खुद एक स्वस्थ पैटर्न नहीं हैं। वे अपने स्वभाव से एनकैप्सुलेशन को नष्ट कर देते हैं क्योंकि वे बाहरी हेरफेर के लिए अपने सभी गुणों को उजागर करते हैं और जैसा कि वे उपयोग किया जाता है बीन के अंदर कोड बनाने के बजाय बाह्य रूप से बीन को हेरफेर करने के लिए कोड बनाने के लिए एक प्रवृत्ति (बिना किसी आवश्यकता के) का उपयोग होता है (उल्लंघन "डॉन) 'यह मानों के लिए एक वस्तु नहीं पूछें, आपके लिए कुछ करने के लिए एक वस्तु पूछें ")। कम से कम गेटर्स के साथ एनोटेट किए गए पोरोज का उपयोग करना और कोई बसने वाला बहुत अधिक ओओ है जो एनकैप्सुलेशन को बहाल करता है और अपरिपक्वता की संभावना के साथ।

वैसे, जैसा कि यह सब कुछ हो रहा था किसी ने कॉन्सेप्ट को एंटरप्राइज़ जावा बीन्स नाम की चीज़ तक बढ़ा दिया। ये ... अलग हैं। और वे काफी जटिल हैं कि कई लोगों को लगा कि वे पूरे बीन की अवधारणा को नहीं समझते हैं और इस शब्द का उपयोग करना बंद कर दिया है। ऐसा मुझे लगता है, क्यों आप आमतौर पर सेम को पीओजेओ के रूप में संदर्भित सुनते हैं (क्योंकि प्रत्येक जावा वस्तु एक पीओजेओ है यह तकनीकी रूप से ठीक है, लेकिन जब आप किसी को कहते हैं कि पीओजेओ वे सबसे अधिक बार उस चीज के बारे में सोच रहे हैं जो सेम पैटर्न का अनुसरण करता है)


राइट ऑन - उल्लंघन "मूल्यों के लिए एक वस्तु न पूछें, आपके लिए कुछ करने के लिए एक वस्तु पूछें")
ARK

3

जावा बीन कोई भी जावा वर्ग है जो निम्नलिखित तीन मानदंडों को पूरा करता है:

  1. इसे क्रमबद्ध इंटरफ़ेस (ए मार्कर इंटरफ़ेस) लागू करना चाहिए।
  2. कंस्ट्रक्टर को सार्वजनिक होना चाहिए और कोई तर्क नहीं होना चाहिए (अन्य लोग "नो-आर्ग कंस्ट्रक्टर" कहते हैं)।
  3. इसमें गेटटर और सेटर होना चाहिए।

सीरियल स्टेट को बनाए रखने के लिए सीरियलवर्ल्डयूआईडी फील्ड महत्वपूर्ण है। नीचे दिया गया कोड सेम के रूप में योग्य है:

public class DataDog implements java.io.Serializable {

private static final long serialVersionUID = -3774654564564563L;

private int id;
private String nameOfDog;

//The constructor should NOT have arguments
public DataDog () {}


/** 4. getter/setter */

// getter(s)
public int getId() {
    return id;
}
public String getNameOfDog() {
    return nameOfDog;
}
// setter(s)
public void setId(int id) {
    this.id = id;
}
public void setNameOfDog(String nameOfDog) {
    this.nameOfDog = nameOfDog;
}}

2

JavaBean को समझने के लिए आपको निम्नलिखित बातों पर ध्यान देने की आवश्यकता है: JavaBean एक वैचारिक सामग्री है और विशिष्ट चीजों के वर्ग का प्रतिनिधित्व नहीं कर सकती है

JavaBean एक विकास उपकरण है जिसे पुन: प्रयोज्य सॉफ्टवेयर घटकों के संचालन में देखा जा सकता है

जावाबीन सन जावाबिन स्पेसिफिकेशन पर आधारित है और पुन: प्रयोज्य घटक हो सकते हैं। इसकी सबसे बड़ी विशेषता पुन: प्रयोज्य है।


1

एक सेम है के लिए विधि के नाम है कि जावा बीन दिशा निर्देशों का पालन (भी बुलाया डिजाइन पैटर्न) के साथ एक जावा वर्ग गुण , तरीकों , और घटनाओं। इस प्रकार, बीन वर्ग का कोई भी सार्वजनिक तरीका जो संपत्ति की परिभाषा का हिस्सा नहीं है, एक सेम विधि है। न्यूनतम रूप से, एक जावा वर्ग, यहां तक ​​कि एकमात्र सदस्य के रूप में एक संपत्ति के साथ (निश्चित रूप से, सार्वजनिक गेट्टर और सेटर की आवश्यकता के साथ), एकमात्र सदस्य के रूप में एक सार्वजनिक विधि या सिर्फ एक सार्वजनिक ईवेंट श्रोता पंजीकरण विधि एक जावा बीन है। इसके अलावा, संपत्ति या तो केवल पढ़ी जाने वाली संपत्ति हो सकती है (जिसमें एक गेटर विधि है लेकिन कोई सेटर नहीं है) या केवल-लेखन संपत्ति (केवल एक सेटर विधि है)। जावा बीन को किसी भी बीनबॉक्स टूल या कंटेनर में दिखाई देने के लिए एक सार्वजनिक वर्ग होना चाहिए। कंटेनर को इसे तुरंत करने में सक्षम होना चाहिए; इस प्रकार, इसका सार्वजनिक निर्माणकर्ता भी होना चाहिए। JavaBeans विनिर्देशएक कंटेनर के लिए एक सार्वजनिक शून्य-आर्गों के निर्माता, स्पष्ट या डिफ़ॉल्ट होने के लिए बीन की आवश्यकता नहीं होती है, ताकि इसे तुरंत किया जा सके। यदि आप एक फ़ाइल प्रदान कर सकते हैं (एक्सटेंशन के साथ .ser) जिसमें एक क्रमबद्ध उदाहरण है, तो एक बीनबॉक्स टूल एक प्रोटोटाइप बीन को तुरंत हटाने के लिए उस फ़ाइल का उपयोग कर सकता है। अन्यथा, बीन के पास एक सार्वजनिक शून्य-आर्ग कंस्ट्रक्टर होना चाहिए, या तो स्पष्ट या डिफ़ॉल्ट।

एक बार जब बीन तुरंत तैयार हो जाता है, तो जावा बीन एपीआई (java.beans। *) इसे आत्मसात कर सकता है और इसके लिए तरीकों को बुला सकता है। यदि कोई वर्ग इंटरफ़ेस को लागू नहीं कर रहा है, तो बीनइन्फो या बीनइन्फो कार्यान्वयन को लागू करना, सिंपल बीनइन्फो क्लास उपलब्ध है, आत्मनिरीक्षण में लक्ष्य बीन द्वारा समर्थित विधियों का अध्ययन करने के लिए प्रतिबिंब (अंतर्निहित आत्मनिरीक्षण) का उपयोग करना शामिल है और फिर सरल डिजाइन पैटर्न (दिशानिर्देश) से कटौती करना है। वे विधियाँ जो गुण, घटनाएँ और सार्वजनिक पद्धतियाँ समर्थित हैं। यदि इंटरफ़ेस बीनइन्फो को लागू करने वाला एक वर्ग (बीन फू के लिए, इसे FooBeanInfo नाम दिया जाना चाहिए) उपलब्ध है, एपीआई अंतर्निहित आत्मनिरीक्षण को दरकिनार कर देता है और इस तरीके (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors () का उपयोग करता है। जानकारी। यदि SimpleBeanInfo का विस्तार करने वाला वर्ग उपलब्ध है, साधारण बीनइन्फो के आधार पर सार्वजनिक तरीके (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ()) ओवरराइड हो गए हैं, यह जानकारी प्राप्त करने के लिए उन उपयोग किए गए तरीकों (ओं) का उपयोग करेगा; ऐसी विधि के लिए जिसे ओवरराइड नहीं किया जाता है, यह संबंधित अंतर्निहित आत्मनिरीक्षण के लिए डिफ़ॉल्ट होगा। एक सेम वैसे भी तत्काल प्रभाव की जरूरत है, भले ही उस पर कोई अंतर्निहित आत्मनिरीक्षण न किया गया हो। इस प्रकार, एक सार्वजनिक ज़री-आर्ग कंस्ट्रक्टर की आवश्यकता। लेकिन, निश्चित रूप से, इसे पहचानने के लिए सीरियल योग्य या बाहरी इंटरफ़ेस आवश्यक नहीं है। हालाँकि, जावा बीन विनिर्देशन कहता है, 'हम यह भी चाहेंगे कि यह एक छोटे से बीन के सामान्य मामले के लिए "तुच्छ" हो जो बस अपनी आंतरिक स्थिति को बचाना चाहता है और इसके बारे में सोचना नहीं चाहता है। " इसलिए, सभी बीन्स को सीरियलाइज़ करने योग्य या एक्सरसाइज़ करने वाला इंटरफ़ेस लागू करना होगा। कुल मिलाकर, JavaBeans विनिर्देश बीन के गठन के बारे में कठिन और तेज़ नहीं है। "JavaBeans घटकों को लिखना आश्चर्यजनक रूप से आसान है। आपको किसी विशेष टूल की आवश्यकता नहीं है और आपको किसी भी इंटरफ़ेस को लागू करने की आवश्यकता नहीं है। सेम लिखना केवल कुछ कोडिंग सम्मेलनों का पालन करने की बात है। आपको बस इतना करना है कि आप अपने वर्ग को पसंद करें। एक बीन - बीन का उपयोग करने वाले उपकरण आपके बीन को पहचानने और उसका उपयोग करने में सक्षम होंगे। " सामान्य रूप से, निम्न वर्ग भी जावा बीन है,

public class Trivial implements java.io.Serializable {}

कहो, एक बीन कंस्ट्रक्टर के कुछ पैरामीटर हैं। मान लीजिए कि कुछ सरल प्रकार हैं। कंटेनर को पता नहीं हो सकता है कि उन्हें क्या मान देना है; यहां तक ​​कि अगर यह करता है, तो परिणामी उदाहरण पुन: प्रयोज्य नहीं हो सकता है। यह तभी समझ में आता है जब उपयोगकर्ता एनोटेशन या xml कॉन्फ़िगरेशन फ़ाइलों को स्प्रिंग बीन्स के रूप में कहकर (मानों को निर्दिष्ट) कॉन्फ़िगर कर सकता है। और मान लें कि कुछ पैरामीटर क्लास या इंटरफ़ेस प्रकार हैं। फिर, कंटेनर को पता नहीं हो सकता है कि उसे क्या मान देना है। यह तभी समझ में आ सकता है जब उपयोगकर्ता एनोटेशन या xml कॉन्फ़िगरेशन फ़ाइलों के द्वारा विशिष्ट वस्तुओं को निर्दिष्ट कर सकता है। हालाँकि, यहां तक ​​कि वसंत में (xml कॉन्फ़िगरेशन फ़ाइलों के माध्यम से), विशिष्ट ऑब्जेक्ट्स (स्ट्रिंग नामों के साथ) को कंस्ट्रक्टर तर्कों (कंस्ट्रक्टर तर्कों की विशेषता या तत्व) के लिए असाइन करना प्रकार नहीं है, यह मूल रूप से संसाधन इंजेक्शन की तरह है। अन्य स्प्रिंग बीन्स (जिसे सहयोगी कहा जाता है, एक कंस्ट्रक्टर लॉजिक तत्व में तत्व के माध्यम से) का संदर्भ बनाना मूल रूप से निर्भरता इंजेक्शन है और इस प्रकार यह असुरक्षित है। जाहिर है, एक निर्भरता (सहयोगी बीन) में इंजेक्टर मापदंडों के साथ एक निर्माता हो सकता है; इंजेक्ट की गई निर्भरता (ies) में एक पैरामीटर हो सकता है जिसमें पैरामीटर वगैरह हों। इस परिदृश्य में, अंत में, आपको कुछ बीन क्लासेस (जैसे, MyBean.class) की आवश्यकता होगी कि कंटेनर नए MyBean () को कॉल करने से पहले ही तुरंत काम कर सकता है, इससे पहले कि वह कंस्ट्रक्टरों पर निर्भरता इंजेक्शन के माध्यम से अन्य सहयोगी बीन्स का निर्माण कर सके- इस प्रकार, आवश्यकता के लिए सेम के पास सार्वजनिक शून्य-आर्ग कंस्ट्रक्टर है। मान लीजिए, यदि कोई कंटेनर निर्भरता इंजेक्शन का समर्थन नहीं करता है और / या वसंत में के रूप में कुछ एनोटेशन या xml कॉन्फ़िगर फ़ाइलों के माध्यम से निर्माणकर्ता को सरल-प्रकार के मान निर्दिष्ट करने की अनुमति नहीं देता है; बीन बिल्डरों के पास पैरामीटर नहीं होना चाहिए। यहां तक ​​कि एक स्प्रिंग बीन्स एप्लिकेशन को सार्वजनिक सेम-आर्ग कंस्ट्रक्टर (उदाहरण के लिए, जहां आपके स्प्रिंग एप्लिकेशन में कंस्ट्रक्टर तर्कों के रूप में सरल प्रकार के साथ कोई बीन नहीं है) के लिए कुछ बीन्स की आवश्यकता होगी।

जेएसएफ प्रबंधित बीन्स एक वेब कंटेनर में चलते हैं। उन्हें @ManagedBean एनोटेशन या अनुप्रयोग कॉन्फ़िगरेशन संसाधन फ़ाइल प्रबंधित-bean.xml के साथ कॉन्फ़िगर किया जा सकता है। हालांकि, यह केवल संसाधन इंजेक्शन (टाइपसेफ़ नहीं) के माध्यम से इंजेक्शन का समर्थन करता है; कंस्ट्रक्टर्स पर इंजेक्शन के लिए फिट नहीं है। JSF कल्पनाआवश्यकता है कि प्रबंधित बीन्स में एक सार्वजनिक शून्य-तर्क निर्माता होना चाहिए। आगे यह कहता है, “इस विनिर्देश के संस्करण 2.3 के अनुसार, इस खंड में निर्दिष्ट प्रबंधित बीन सुविधा का उपयोग दृढ़ता से हतोत्साहित किया जाता है। उसी समस्या को हल करने के लिए एक बेहतर और अधिक सुसंगत एकीकृत समाधान जेनेट-365 में निर्दिष्ट कॉन्टेक्ट्स और डिपेंडेंसी इंजेक्शन (सीडीआई) का उपयोग करना है। "दूसरे शब्दों में, सीडीआई प्रबंधित बीन्स का उपयोग किया जा सकता है, जो कंस्ट्रक्टर्स एंकल पर टाइपसेफ निर्भरता इंजेक्शन प्रदान करता है। स्प्रिंग बीन्स के लिए। CDI विनिर्देशन प्रबंधित बीन्स विनिर्देशन को अपनाता है, जो कि JEE प्लेटफ़ॉर्म के सभी कंटेनरों पर लागू होता है, न कि केवल वेब स्तरीय। इस प्रकार, वेब कंटेनर को CDI विनिर्देश को लागू करने की आवश्यकता होती है।

यहाँ से एक अर्क है प्रबंधित बीन विनिर्देशन "प्रबंधित बीन्स न्यूनतम आवश्यकताओं वाली कंटेनर-प्रबंधित वस्तुएं हैं, जिन्हें अन्यथा" POJOs "के तहत जाना जाता है (प्लेन ओल्ड जावा ऑब्जेक्ट्स) ... उन्हें जावा प्लेटफॉर्म पर पाए जाने वाले JavaBeans घटक मॉडल के जावा ईई प्लेटफ़ॉर्म-वर्धित संस्करण के रूप में देखा जा सकता है। ...। यह पाठक द्वारा याद नहीं किया जाएगा कि प्रबंधित बीन्स के पास जावास्वर फ़ेस (जेएसएफ) तकनीक में पाई जाने वाली घर की सुविधा में एक अग्रदूत है ... प्रबंधित बीन्स इस विनिर्देश में परिभाषित के रूप में जेएसएफ में पाए जाने वाले सामान्यीकरण का प्रतिनिधित्व करते हैं। विशेष रूप से, प्रबंधित बीन्स का उपयोग जावा ईई एप्लिकेशन में कहीं भी किया जा सकता है, न केवल वेब मॉड्यूल में। उदाहरण के लिए, बुनियादी घटक मॉडल में, प्रबंधित बीन्स को एक नो-तर्क निर्माता प्रदान करना चाहिए, लेकिन एक विनिर्देश जो प्रबंधित बीन्स पर बनाता है, जैसे कि CDI (JSR-299), उस आवश्यकता को शिथिल कर सकते हैं और प्रबंधित बीन्स को अधिक जटिल हस्ताक्षरों के साथ कंस्ट्रक्टर प्रदान करने की अनुमति दे सकते हैं, जब तक कि वे कुछ अच्छी तरह से परिभाषित नियमों का पालन करते हैं ... एक प्रबंधित बीन नहीं होना चाहिए: एक अंतिम वर्ग, एक सार वर्ग, एक गैर-स्थिर आंतरिक वर्ग। । एक प्रबंधित बीन एक नियमित जावाबीन घटक के विपरीत क्रमिक नहीं हो सकता है। " इस प्रकार, प्रबंधित बीन्स के लिए विनिर्देश, जिसे अन्यथा पीओजेओ या पीओजेओ बीन्स के रूप में जाना जाता है, सीडीआई में विस्तार की अनुमति देता है।

सीडीआई विनिर्देश पुन: परिभाषित बीन्स को प्रबंधित करता है: जब जावा ईई में चल रहा है, तो एक शीर्ष-स्तरीय जावा वर्ग एक प्रबंधित बीन है यदि यह आवश्यकताओं को पूरा करता है:

• यह एक आंतरिक वर्ग नहीं है। • यह एक गैर-अमूर्त वर्ग है, या एनोटेट @ डायकोरेटर है। • यह javax.enterprise.inject.spi.Extension को लागू नहीं करता है। • यह @Vetoed या एनोटेट @Vetoed पैकेज में एनोटेट नहीं है। • इसमें एक उपयुक्त कंस्ट्रक्टर है, या तो: क्लास में कोई पैरामीटर वाला एक कंस्ट्रक्टर है, या क्लास ने एक निर्माणकर्ता @ एनोटेट घोषित किया है।

इन परिस्थितियों को पूरा करने वाले सभी जावा वर्ग प्रबंधित फलियाँ हैं और इस प्रकार प्रबंधित बीन को परिभाषित करने के लिए किसी विशेष घोषणा की आवश्यकता नहीं होती है। या

अगर इसे किसी अन्य जावा ईई विनिर्देश द्वारा प्रबंधित बीन के रूप में परिभाषित किया गया है और यदि

• यह एक EJB घटक-परिभाषित एनोटेशन के साथ एनोटेट नहीं है या ejb-jar.xml में EJB बीन वर्ग के रूप में घोषित किया गया है।

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

EJB एक EJB कंटेनर में चलते हैं। इसकी विशिष्टताकहते हैं: "एक सत्र बीन घटक एक प्रबंधित बीन है।" "कक्षा में एक सार्वजनिक निर्माणकर्ता होना चाहिए जो कोई तर्क नहीं लेता है," यह सत्र बीन और संदेश-संचालित बीन दोनों के लिए कहता है। इसके अलावा, यह कहता है, "सत्र बीन वर्ग। सत्रबाइन इंटरफ़ेस या सीरियल इंटरफ़ेस लागू करने के लिए आवश्यक नहीं है। " जेएसएफ बीन्स के समान कारण के लिए, कि ईजेबी 3 निर्भरता इंजेक्शन मूल रूप से संसाधन इंजेक्शन है, जेएसएफ बीन्स तर्कों के साथ निर्माणकर्ताओं का समर्थन नहीं करते हैं, जो कि निर्भरता इंजेक्शन के माध्यम से है। हालांकि, अगर ईजेबी कंटेनर सीडीआई को लागू करता है, "वैकल्पिक रूप से: वर्ग हो सकता है। अतिरिक्त निर्माणकर्ता को इंजेक्ट एनोटेशन के साथ एनोटेट किया गया, "यह सत्र बीन और संदेश-संचालित बीन दोनों के लिए कहता है क्योंकि," एक EJB एक CDI बीन संग्रह में पैक किया गया था और javax.enterprise.ject.Vetoed एनोटेशन के साथ एनोटेट नहीं किया गया था, जिसे CDI- सक्षम माना जाता है सेम।"


0

व्यवहार में, बीन्स केवल ऐसी वस्तुएं हैं जिनका उपयोग करना आसान है। उन्हें सीरियलाइज़ करने का मतलब है कि उन्हें आसानी से कायम रखना (एक ऐसे रूप में स्टोर करना जो आसानी से ठीक हो जाए)।

वास्तविक दुनिया में बीन्स के विशिष्ट उपयोग:

  • सरल पुन: प्रयोज्य वस्तुओं POJO (सादा पुराने जावा वस्तुएँ)
  • दृश्य वस्तुओं
  • वसंत वस्तुओं को संभालने के लिए बीन्स का उपयोग करता है (उदाहरण के लिए, उपयोगकर्ता ऑब्जेक्ट जिसे सत्र में क्रमबद्ध करने की आवश्यकता है)
  • EJB (एंटरप्राइज जावा बीन्स), अधिक जटिल वस्तुएं, जैसे JSF बीन्स (JSF पुरानी काफी पुरानी तकनीक है) या PSP जीन्स

तो वास्तव में, बीन्स एक सम्मेलन / मानक हैं एक जावा ऑब्जेक्ट से कुछ उम्मीद करने के लिए है कि यह व्यवहार (क्रमबद्धता) करेगा और इसे बदलने के लिए कुछ तरीके देगा (गुणों के लिए सेटर्स)।

उनका उपयोग कैसे करें, यह सिर्फ आपका आविष्कार है, लेकिन सबसे आम मामलों में मैंने ऊपर सूचीबद्ध किया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.