JavaBeanとは正確には何ですか?


1793

「Bean」は、プロパティとゲッター/セッターを備えたJavaクラスであることを理解しました。私が理解している限り、これはC構造体に相当します。本当?

また、Beanと通常のクラスの間に実際の構文の違いはありますか?特別な定義やインターフェースはありますか?

基本的に、なぜこれに用語があるのですか?

また、Serializableインターフェースはどういう意味ですか?


14
参照のJava Beansの使用場所を?。これは、特定の規則に従うクラスです。
Matthew Flaschen、2010

5
完全を期すために、JavaBeans仕様へのリンクを次に示します。
informatik01

2
ただのメモ。人々がPOJOという言葉を使い回しているのを耳にしたことがあるなら、彼らはしばしば実際にはBeanを意味します。POJOを見ると、ほとんど常にセッターとゲッターがあり、シリアライズ可能です。…実際、POJOはセッターとゲッター、シリアライズ可能なインターフェイスなどを必要としません。特定の要件のない単純な古いJavaオブジェクトです。
ビルK

回答:


2013

JavaBeanは単なる標準です

  1. すべてのプロパティはプライベート(ゲッター/セッターを使用)
  2. 引数なしのパブリックコンストラクタ
  3. 実装しSerializableます。

それでおしまい。それは単なる慣習です。多くのライブラリはそれに依存しています。

に関してSerializableは、APIドキュメントから:

クラスの直列化可能性は、java.io.Serializableインターフェースを実装するクラスによって有効になります。このインターフェイスを実装しないクラスは、シリアル化または非シリアル化された状態を持ちません。直列化可能クラスのすべてのサブタイプは、それ自体が直列化可能です。シリアル化インターフェースにはメソッドやフィールドがなく、シリアル化可能であることのセマンティクスを識別するためにのみ機能します。

つまり、シリアライズ可能なオブジェクトはストリームに書き込むことができるため、ファイル、オブジェクトデータベースなど、実際には何でも書き込むことができます。

また、JavaBeanと別のクラスの間に構文上の違いはありません。クラスが標準に従っている場合、そのクラスはJavaBeanです。

標準では、ライブラリにより、定義済みの方法で定義したクラスインスタンスを使用してプログラムで処理を行うことができるため、この用語は使用されます。たとえば、ライブラリがそれに渡すオブジェクトをストリーミングしたい場合は、オブジェクトが直列化可能であるため、それが可能であることをライブラリが認識します(ライブラリがオブジェクトに適切なJavaBeanを必要とすると仮定します)。


198
まさに、私の意見では、豆を中心に展開するほとんどすべてのドキュメントでは、あなたが持っているほど簡潔に用語を説明することはできません。+1
AndaP 2012

10
豆のメンバーは豆も必要ですか?合理的な要件のように思える...
worldsayshi

14
@worldsayshi-いいえ、必要ありません。たとえば、Beanには文字列を含めることができます。StringはBeanではありません。(文字列は不変なので、空のコンストラクターとセッターを呼び出して作成することはできません。)Serializableオブジェクトが何らかの方法で外部からシリアル化しない限り、SerializableオブジェクトにSerializableメンバーが必要なのは理にかなっているようです。そのため、Java Beanのメンバーは、Java Beanのいかなる側面も持つ必要はありません。それはより多くのですが、単純な、彼らはあまりにも、豆であれば。
ViliamBúr2013

12
「すべてのプロパティプライベート」は正しくありません。プロパティはゲッターとセッターから推論されます(メソッドXがある場合getFoo()-> Beanには「foo」という読み取り可能なプロパティがあります。メソッドsetFoo(X foo)がある場合-> Beanには書き込み可能なプロパティがあります「foo」)。プロパティは、通常はプライベートであるメンバーフィールドによってサポートされます(必須ではありません)。
Puce

2
「クラスはパブリックでなければならない」というJava Beanになることを願っています。そして、それは本当にシリアライズ可能なインターフェースを実装する必要があるのでしょうか?
Satyabrata sahoo、2016年

286

特別に聞こえるようにするための用語があります。現実はそれほど神秘的ではありません。

基本的に、「Bean」:

  • シリアル化可能なオブジェクトです(つまり、を実装しjava.io.Serializable、正しく実行します)。
  • ゲッターとセッターが特定の名前を持つメソッドである「プロパティ」を持っている(たとえば、getFoo()「Foo」プロパティのゲッターである)。
  • パブリック0-argコンストラクターがあります(そのため、自由に作成して、そのプロパティを設定することで構成できます)。

更新:

はどうかと言うと Serializable:それは、実装クラスが「シリアライゼーション」に同意する(そしてそれが可能であることを意味する)ことをJavaに伝える「マーカーインターフェース」(関数を宣言しないインターフェース)にすぎません-変換するプロセスバイトのストリームへのインスタンス。これらのバイトは、ファイルに保存したり、ネットワーク接続を介して送信したりすることができ、JVM(少なくとも、オブジェクトのタイプを知っているもの)が後でオブジェクトを再構築できるようにするのに十分な情報があります-おそらく別のインスタンスでアプリケーション、または他のマシン全体でも!

もちろん、それを行うには、クラスは特定の制限に従う必要があります。それらの主なものは、すべてのインスタンスフィールドがプリミティブ型(int、boolなど)、シリアライズ可能なクラスのインスタンス、またはtransientJavaがそれらを含めようとしないようにマークされている必要があることです。(これはもちろん、transientフィールドがストリーム上を移動しても存続しないことを意味します。transientフィールドがあるクラスは、必要に応じてフィールドを再初期化できるように準備する必要があります。)

これらの制限を遵守することはできませんクラスが実装すべきではありませんSerializable(と、IIRC、Javaコンパイラでもないだろうしましょう、それはそう。)


これはおそらく愚かな質問ですが、プリミティブ型またはクラスのインスタンス以外にインスタンスフィールドは何でしょうか?
kingfrito_5005 2016年

8
@ kingfrito_5005:どちらかになります。しかし、それがクラスのインスタンスである場合、そのクラスがシリアライズ可能かどうかが重要です。クラスをシリアライズ可能にするためには、その非transientパーツがシリアライズ可能なタイプである必要があります。
cHao 2016年

おそらくコンストラクタは引数を持っていてはいけないということを忘れていました。パブリックデフォルトコンストラクターがあります(そのため、自由に作成して、そのプロパティを設定することで構成できます)。
Amos Kosgei 2018年

@AmosKosgei:忘れていませんでした。冗長になるだけです。デフォルトのコンストラクタは、引数なしで呼び出すことができます。
cHao 2018年

@Amos:調べてみると、「デフォルトコンストラクター」はJavaとC ++で少し異なるものを意味しているようです。:P「デフォルト」を「0-arg」に置き換えました。
cHao 2018年

94

JavaBeansは、非常に単純なコーディング規約に準拠したJavaクラスです。あなたがしなければならないのは

  1. 実装java.io.Serializableインターフェイス-オブジェクトの状態を保存する
  2. 空のパブリック引数コンストラクタを使用-オブジェクトをインスタンス化する
  3. パブリックゲッター/セッターメソッドを提供する-プライベート変数(プロパティ)の値を取得および設定する

こんな簡単な説明が私が探していたものです。ありがとうございました!
Modo

62

JavaBeansのプロパティ

JavaBeanは、特定のプログラミング規則を満たすJavaオブジェクトです。

  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
アノテーションは必要ですか、それともJava Beanの一部ですか?
giannis christofakis

7
@giannischristofakisいいえ、注釈は必要ありません。アノテーションは、Java Beansを広範囲に使用するSpring Frameworkの一部として使用されます。
Tianxiang Xiong 2015年

1
引数なしのコンストラクタが必要なのはなぜですか?
Renato

6
@Renatoこれは非常に簡単です。arg-constructorを使用してBeanを自動的にインスタンス化する必要があるSpringについて考えてみてください...引数として何を渡しますか?;)
Alex75

24

例を挙げて説明します。

1. java.io.Serializableをインポートする

シリアライゼーションについては、ドキュメントを参照してください。

2.プライベートフィールド

外部クラスがこれらのフィールドを簡単に変更できないようにするには、フィールドをプライベートにする必要があります。これらのフィールドに直接アクセスする代わりに、通常のゲッター/セッターメソッドが使用されます。

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;
steven7mwesigwa

18

Java Beansは、より少ないコードとより多くの作業アプローチに使用しています... Java Beansは、実行時の検出とアクセスのためのユニバーサルコントラクトとしてJava EE全体で使用されています。たとえば、JavaServer Pages(JSP)は、ページ間またはサーブレットとJSP間のデータ転送オブジェクトとしてJava Beanを使用します。Java EEのJavaBeans Activation Frameworkは、MIMEデータ型のサポートをJava EEに統合するためにJava Beansを使用します。Java EE管理APIは、Java EE環境で管理されるリソースのインスツルメンテーションの基盤としてJavaBeanを使用します。

シリアライゼーションについて:

オブジェクトのシリアル化では、オブジェクトは、オブジェクトのデータ、およびオブジェクトのタイプとオブジェクトに格納されているデータのタイプに関する情報を含む一連のバイトとして表すことができます。

シリアル化されたオブジェクトがファイルに書き込まれた後、ファイルから読み取って逆シリアル化できます。つまり、オブジェクトとそのデータを表す型情報とバイトを使用して、メモリ内にオブジェクトを再作成できます。


17

Beanは永続化され、サーバー間で転送されるため、プロジェクトを複数のサーバーにデプロイするときにシリアライゼーションが便利です。


1
複数のサーバーにプロジェクトをデプロイする方法について詳しく教えてください。ありがとう
Hanfeng 2013年

4
サーバーが2つあるクラスターと言います。Websphereの場合、このリンクstackoverflow.com/questions/3193345/…が役立つ可能性があります。
Truong Ha

10

Java Beansは標準であり、その基本的な構文要件は他の回答によって明確に説明されています。

ただし、IMO、それは単純な構文標準以上のものです。Java Beansの本当の意味または使用目的は、標準に関するさまざまなツールサポートとともに、コードの再利用とコンポーネントベースのソフトウェアエンジニアリングを容易にすることです。コード(または、小さなグルーコードのみを記述する必要があります)。残念ながら、このテクノロジーは業界で過小評価され、十分に活用されていません。これは、このスレッドの回答から知ることができます。

Java Beansに関する Oracleのチュートリアルを読むと、理解を深めることができます。


便利な投稿とリンク。私が豆について考えるとき、私は実際にOracleの記事に示されているように、「ビジュアルビルダー」タイプのものについて考えます。他にも多くのフレームワークを使用しているフレームワークがあるかどうか疑問に思います...
マイクげっ歯類

9

ウィキペディアによると:

  1. クラスには、デフォルトのパブリックコンストラクター(引数なし)が必要です。これにより、編集およびアクティブ化フレームワーク内で簡単にインスタンス化できます。

  2. クラスのプロパティは、標準の命名規則に従って、get、set、is(getではなくbooleanプロパティに使用できます)、およびその他のメソッド(いわゆるアクセサーメソッドとミューテーターメソッド)を使用してアクセスできる必要があります。これにより、フレームワーク内でBeanの状態を簡単に自動検査および更新できます。その多くには、さまざまなタイプのプロパティのカスタムエディターが含まれています。セッターは1つまたは複数の引数を持つことができます。

  3. クラスはシリアライズ可能でなければなりません。[これにより、アプリケーションとフレームワークは、VMやプラットフォームに依存しない方法でBeanの状態を確実に保存、保存、および復元できます。]

詳細については、このリンクをクリックしてください。


7

質問の2番目の部分に関して、シリアライゼーションは、オブジェクトを一連の署名付きバイトとして格納するために使用される永続化メカニズムです。形式的には少なく、オブジェクトの状態を保存するため、後で逆シリアル化してオブジェクトを取得できます。


7

Java Beanは、次の規則に従うJavaクラス[概念]です。

  1. 引数のないコンストラクタが必要です。
  2. シリアライズ可能である必要があります。
  3. プロパティの値を設定および取得するためのメソッド(getterおよびsetterメソッド)を提供する必要があります。

再利用可能なソフトウェアコンポーネントです。多くのオブジェクトを1つのオブジェクトにカプセル化できるので、同じオブジェクトに複数の場所からアクセスでき、コードのメンテナンスを容易にするためのステップです。


1
Java Beansについて話すとき、「再利用可能なソフトウェアコンポーネント」というフレーズが好きです。JavaBeansは一般にまったく何もしないからです。
ロドニーP.

6

これらはシリアル化可能で、引数のないコンストラクターがあり、ゲッターメソッドとセッターメソッドを使用してプロパティにアクセスできます。「Bean」という名前は、Javaの再利用可能なソフトウェアコンポーネントを作成することを目的としたこの標準を包括するために付けられました。according to wiki

アプリケーションのバックボーンを形成し、Spring IoCコンテナによって管理されるオブジェクトは、Beanと呼ばれます。Beanは、Spring IoCコンテナによってインスタンス化、アセンブル、または管理されるオブジェクトです。それ以外の場合、Beanはアプリケーション内の多くのオブジェクトの1つにすぎません。 according to 春io


4

Beanの概念に関するほんの少しの背景/更新。他の多くの回答には、実際にはその理由が含まれていますが、その理由はそれほど多くありません。

それらはGUIの構築の一部としてJavaの早い段階で発明されました。それらは、ツールが簡単に分離できるプロパティパターンを作成して、Beanの属性を編集できるようにしました。一般に、Beanプロパティは画面上のコントロールを表します(x、y、width、height、textなどを考えてください)。

強く型付けされたデータ構造と考えることもできます。

時間の経過とともに、これらは同じタイプのアクセスを使用する多くのツール(たとえば、Hibernateがデータベースにデータ構造を永続化する)に役立つようになりました

ツールが進化するにつれ、アノテーションへと移行し、セッター/ゲッターの名前を分離することから離れました。現在、ほとんどのシステムはBeanを必要とせず、注釈付きプロパティを持つプレーンな古いJavaオブジェクトを取得して、それらの操作方法を指示できます。

現在、私はBeanを注釈付きのプロパティボールと見なしています。これらは実際には、Beanが持つ注釈にのみ役立ちます。

豆自体は健康的なパターンではありません。それらはすべてのプロパティを外部操作に公開するため、カプセル化を本質的に破壊し、使用されると、Bean内にコードを作成する代わりに、Beanを外部で操作するコードを作成する傾向があります(決して要件ではありません)。オブジェクトにその値を要求するのではなく、オブジェクトに何かを依頼してください」)。最小限のゲッターを使用し、セッターを使用しないでアノテーション付きのpojoを使用すると、カプセル化が復元され、不変の可能性があります。

ちなみに、これらすべてのことが起こっていたため、誰かがその概念をEnterprise Java Beansと呼ばれるものに拡張しました。これらは...違います。また、複雑すぎて、多くの人がBeanの概念全体を理解していないと感じ、用語の使用をやめました。これが、一般的にPOJOと呼ばれるBeanを聞く理由だと思います(すべてのJavaオブジェクトはPOJOであるため、これは技術的には問題ありませんが、誰かがPOJOと言うのを聞くと、ほとんどの場合、Beanパターンに従うものについて考えています)


右-「オブジェクトの値をオブジェクトに要求せず、オブジェクトに何かを依頼する」に違反する)
ARK

3

Java Beanは、次の3つの基準を満たすJavaクラスです。

  1. シリアル化可能なインターフェイス(マーカーインターフェイス)を実装する必要があります。
  2. コンストラクターはパブリックであり、引数はありません(他の人が「引数なしのコンストラクター」と呼ぶもの)。
  3. ゲッターとセッターが必要です。

オブジェクトの状態を維持するには、serialVersionUIDフィールドが重要であることに注意してください。以下のコードは、Beanとしての資格があります。

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は、再利用可能なソフトウェアコンポーネントの操作で視覚化できる開発ツールです。

JavaBeanはSun JavaBeans仕様に基づいており、再利用可能なコンポーネントにすることができます。その最大の特徴は再利用性です。


1

Bean プロパティメソッドのJava Beanガイドライン(デザインパターンとも呼ばれる)に準拠したメソッド名を持つJavaクラスです、およびイベント。したがって、プロパティ定義の一部ではないBeanクラスのパブリックメソッドはBeanメソッドです。最低でも、プロパティを唯一のメンバーとするJavaクラス(もちろん、パブリックゲッターとセッターが必要です)、唯一のメンバーとしてのパブリックメソッド、または1つのパブリックイベントリスナー登録メソッドがJava Beanです。さらに、プロパティは、読み取り専用プロパティ(getterメソッドはあるが、setterはありません)または書き込み専用プロパティ(setterメソッドのみを持つ)のいずれかです。Java Beanは、任意のBeanboxツールまたはコンテナから見えるようにパブリッククラスである必要があります。コンテナはそれをインスタンス化できなければなりません。したがって、パブリックコンストラクタも必要です。のJavaBeans仕様コンテナがインスタンス化するために、Beanが明示的またはデフォルトのパブリックゼロ引数コンストラクターを持つ必要はありません。シリアル化されたインスタンスを含むファイル(拡張子.ser)を提供できる場合、Beanboxツールはそのファイルを使用してプロトタイプBeanをインスタンス化できます。それ以外の場合、Beanには、明示的またはデフォルトのパブリック引数なしのコンストラクターが必要です。

Beanがインスタンス化されると、Java Bean API(java.beans。*)はそれをイントロスペクトし、そのメソッドを呼び出すことができます。インターフェースBeanInfoを実装するクラス、またはBeanInfo実装を拡張するクラスSimpleBeanInfoクラスが使用できない場合、イントロスペクションには、リフレクション(暗黙のイントロスペクション)を使用してターゲットBeanでサポートされるメソッドを調査し、シンプルなデザインパターン(ガイドライン)を適用して、これらのメソッドでサポートされているプロパティ、イベント、およびパブリックメソッド。インターフェースBeanInfo(Bean Fooの場合、FooBeanInfoという名前にする必要があります)を実装するクラスが使用可能な場合、APIは暗黙的なイントロスペクションをバイパスし、このクラスのパブリックメソッド(getPropertyDescriptor()、getMethodDescriptors()、getEventSetDescriptors())を使用して情報。SimpleBeanInfoを拡張するクラスが利用可能な場合、SimpleBeanInfoパブリックメソッド(getPropertyDescriptor()、getMethodDescriptors()、getEventSetDescriptors())のどれがオーバーライドされているかに応じて、オーバーライドされたメソッドを使用して情報を取得します。オーバーライドされないメソッドの場合、対応する暗黙的なイントロスペクションがデフォルトになります。暗黙的な内省が行われていなくても、Beanはインスタンス化する必要があります。したがって、公開zeri-argsコンストラクターの要件。ただし、もちろん、SerializableやExternalizableインターフェースを認識する必要はありません。ただし、Java Beanの仕様には、「内部状態を保存したいだけで、それについて考えたくない小さなBeanの一般的なケースについては、「簡単なもの」にしたいと考えています。」したがって、すべてのBeanはSerializableまたはExternalizableインターフェースを実装する必要があります。全体、JavaBeansの仕様は、何がBeanを構成するのかについて、難しくも速くもありません。「JavaBeansコンポーネントの作成は驚くほど簡単です。特別なツールは必要なく、インターフェースを実装する必要もありません。Beanの作成は、特定のコーディング規則に従うだけです。クラスを次のようにするだけです。豆—豆を使用するツールは、あなたの豆を認識して使用することができます。」当然のことながら、次のクラスもJava Beanです。

public class Trivial implements java.io.Serializable {}

たとえば、Beanコンストラクターにはいくつかのパラメーターがあります。いくつかは単純型であるとします。コンテナはそれらに割り当てる値を知らない場合があります。たとえそうであっても、結果のインスタンスは再利用できない可能性があります。ユーザーがSpring Beanのように注釈またはXML構成ファイルを使用して構成(値を指定)できる場合にのみ意味があります。また、一部のパラメーターがクラスまたはインターフェース型であるとします。繰り返しになりますが、コンテナはどの値を割り当てるかがわからないことがあります。これは、ユーザーが注釈やxml構成ファイルなどで構成(特定のオブジェクトを指定)できる場合にのみ意味があります。ただし、Spring(xml構成ファイルを使用)でも、特定のオブジェクト(文字列名付き)をコンストラクター引数(属性またはコンストラクター引数の要素)に割り当てることはタイプセーフではなく、基本的にリソースインジェクションのようです。他のSpring Bean(コラボレーターと呼ばれる、コンストラクターの引数要素の要素を介して)への参照は、基本的に依存関係の注入であり、したがって型保証されています。明らかに、依存関係(コラボレーターBean)には、注入されたパラメーターを持つコンストラクターがある可能性があります。これらの注入された依存関係には、パラメーターなどのコンストラクターがある場合があります。このシナリオでは、最終的に、コンストラクターへの依存性注入を介して他のコラボレーションBeanを構築する前に、コンテナーがnew MyBean()を呼び出すだけでインスタンス化できるいくつかのBeanクラス(たとえば、MyBean.class)が必要になります。引数なしのパブリックコンストラクターを持つBean。コンテナーが依存関係の注入をサポートしていない、および/またはSpringのようにいくつかの注釈またはxml構成ファイルを介してコンストラクターに単純型の値を割り当てることができない場合、Beanコンストラクターにはパラメーターがあってはなりません。Spring Beanアプリケーションでも、引数なしのパブリックコンストラクターを持つBeanがいくつか必要になります(たとえば、Springアプリケーションにコンストラクターの引数として単純な型のみのBeanがないシナリオでは)。

JSF管理対象Beanは、Webコンテナーで実行されます。@ManagedBeanアノテーションまたはアプリケーション構成リソースファイルmanaged-bean.xmlを使用して構成できます。ただし、リソースインジェクション(タイプセーフではない)によるインジェクションのみをサポートします。コンストラクターへの注入には適していません。のJSF仕様マネージドBeanには、引数なしのパブリックコンストラクターが必要です。さらに、「この仕様のバージョン2.3では、このセクションで指定されている管理対象Bean機能の使用は強くお勧めしません。同じ問題を解決するためのより適切でより統合されたソリューションは、JSR-365で指定されているように、Contexts and Dependency Injection(CDI)を使用することです。 Spring Bean。CDI仕様は、Web層だけでなく、JEEプラットフォームのすべてのコンテナーに適用されるManaged Beans仕様を採用しているため、WebコンテナーはCDI仕様を実装する必要があります。

これは、マネージドBean仕様からの抜粋です。 「マネージドBeanは、最小限の要件を持つコンテナ管理オブジェクトであり、頭字語「POJOs」(Plain Old Java Objects)で知られています。これらは、Java SEプラットフォームにあるJava EEプラットフォーム拡張バージョンのJavaBeansコンポーネントモデルと見なすことができます。 …。マネージドBeanがJavaServer Faces(JSF)テクノロジにある同名の機能の前身であるということは、読者が見逃すことはありません。この仕様で定義されているマネージドBeanは、JSFにあるものの一般化を表しています。特に、マネージドBeanは、Webモジュールだけでなく、Java EEアプリケーションのどこでも使用できます。たとえば、基本コンポーネントモデルでは、マネージドBeanは引数なしのコンストラクタを提供する必要がありますが、CDI(JSR-299)などのマネージドBeanに基づいて構築される仕様です。明確に定義されたルールに従っている限り、その要件を緩和し、マネージドBeanがより複雑なシグネチャをコンストラクタに提供できるようにします...マネージドBeanは、最終クラス、抽象クラス、非静的内部クラスであってはなりません。 。マネージドBeanは、通常のJavaBeanコンポーネントとは異なり、シリアル化できない場合があります。」したがって、マネージドBean(POJOまたはPOJO Beanとも呼ばれます)の仕様では、CDIと同様に拡張が可能です。

CDI仕様では、マネージドBeanを次のように再定義しています。JavaEEで実行する場合、要件を満たす場合、トップレベルのJavaクラスはマネージドBeanです。

•内部クラスではありません。•非抽象クラスであるか、@ Decoratorアノテーションが付けられている。•javax.enterprise.inject.spi.Extensionを実装していません。•@Vetoedと注釈されていないか、@ Vetoedと注釈されたパッケージ内にあります。•適切なコンストラクターがあります。クラスにパラメーターのないコンストラクターがあるか、クラスが@Injectアノテーションが付けられたコンストラクターを宣言しています。

これらの条件を満たすすべてのJavaクラスはマネージドBeanであるため、マネージドBeanを定義するために特別な宣言は必要ありません。または

他のJava EE仕様によって管理対象Beanとして定義されている場合、および

•EJBコンポーネントを定義するアノテーションが付いていない、またはejb-jar.xmlでEJB Beanクラスとして宣言されていない。

Spring Beanとは異なり、simple-typesのコンストラクターはサポートされていません。これは、Springやその他のアノテーションのようにxml構成ファイルによる構成をサポートしている場合に可能です。

EJBはEJBコンテナで実行されます。その仕様「セッションBeanコンポーネントはマネージドBeanです。」「クラスには、引数を取らないパブリックコンストラクターが必要です」と、セッションBeanとメッセージ駆動型Beanの両方について述べています。さらに、「セッションBeanクラスはSessionBeanインターフェースやSerializableインターフェースを実装する必要はありません。」JSF Beanと同じ理由で、EJB3の依存性注入は基本的にリソースの注入であるため、JSF Beanは引数を持つコンストラクターをサポートしません。つまり、依存性の注入を介します。ただし、EJBコンテナーがCDIを実装する場合、 Injectアノテーションが付けられた追加のコンストラクター。これは、セッションBeanとメッセージ駆動型Beanの両方を意味します。豆。"


0

実際には、Beanは便利なオブジェクトです。それらをシリアル化することは、それらを簡単に永続化できることを意味します(簡単に回復できる形式で保存します)。

実世界でのBeanの一般的な使用法:

  • 単純な再利用可能なオブジェクトPOJO(プレーンな古いJavaオブジェクト)
  • ビジュアルオブジェクト
  • Springは、オブジェクトのBeanを使用して処理します(たとえば、セッションでシリアル化する必要があるUserオブジェクト)
  • EJB(Enterprise Java Beans)、JSF Beans(JSFは古く、かなり時代遅れのテクノロジー)やJSP Beansなどのより複雑なオブジェクト

つまり、実際にはBeansは単なる慣習/標準です Javaオブジェクトから動作(シリアライズ)を期待し、特定の方法でそれを変更するいくつかの方法(プロパティのセッター)を提供するためのです。

それらを使用する方法は、あなたの発明ですが、私が上で参加した最も一般的なケースです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.