「Bean」は、プロパティとゲッター/セッターを備えたJavaクラスであることを理解しました。私が理解している限り、これはC構造体に相当します。本当?
また、Beanと通常のクラスの間に実際の構文の違いはありますか?特別な定義やインターフェースはありますか?
基本的に、なぜこれに用語があるのですか?
また、Serializable
インターフェースはどういう意味ですか?
「Bean」は、プロパティとゲッター/セッターを備えたJavaクラスであることを理解しました。私が理解している限り、これはC構造体に相当します。本当?
また、Beanと通常のクラスの間に実際の構文の違いはありますか?特別な定義やインターフェースはありますか?
基本的に、なぜこれに用語があるのですか?
また、Serializable
インターフェースはどういう意味ですか?
回答:
JavaBeanは単なる標準です
Serializable
ます。それでおしまい。それは単なる慣習です。多くのライブラリはそれに依存しています。
に関してSerializable
は、APIドキュメントから:
クラスの直列化可能性は、java.io.Serializableインターフェースを実装するクラスによって有効になります。このインターフェイスを実装しないクラスは、シリアル化または非シリアル化された状態を持ちません。直列化可能クラスのすべてのサブタイプは、それ自体が直列化可能です。シリアル化インターフェースにはメソッドやフィールドがなく、シリアル化可能であることのセマンティクスを識別するためにのみ機能します。
つまり、シリアライズ可能なオブジェクトはストリームに書き込むことができるため、ファイル、オブジェクトデータベースなど、実際には何でも書き込むことができます。
また、JavaBeanと別のクラスの間に構文上の違いはありません。クラスが標準に従っている場合、そのクラスはJavaBeanです。
標準では、ライブラリにより、定義済みの方法で定義したクラスインスタンスを使用してプログラムで処理を行うことができるため、この用語は使用されます。たとえば、ライブラリがそれに渡すオブジェクトをストリーミングしたい場合は、オブジェクトが直列化可能であるため、それが可能であることをライブラリが認識します(ライブラリがオブジェクトに適切なJavaBeanを必要とすると仮定します)。
特別に聞こえるようにするための用語があります。現実はそれほど神秘的ではありません。
基本的に、「Bean」:
java.io.Serializable
、正しく実行します)。getFoo()
「Foo」プロパティのゲッターである)。更新:
はどうかと言うと Serializable
:それは、実装クラスが「シリアライゼーション」に同意する(そしてそれが可能であることを意味する)ことをJavaに伝える「マーカーインターフェース」(関数を宣言しないインターフェース)にすぎません-変換するプロセスバイトのストリームへのインスタンス。これらのバイトは、ファイルに保存したり、ネットワーク接続を介して送信したりすることができ、JVM(少なくとも、オブジェクトのタイプを知っているもの)が後でオブジェクトを再構築できるようにするのに十分な情報があります-おそらく別のインスタンスでアプリケーション、または他のマシン全体でも!
もちろん、それを行うには、クラスは特定の制限に従う必要があります。それらの主なものは、すべてのインスタンスフィールドがプリミティブ型(int、boolなど)、シリアライズ可能なクラスのインスタンス、またはtransient
Javaがそれらを含めようとしないようにマークされている必要があることです。(これはもちろん、transient
フィールドがストリーム上を移動しても存続しないことを意味します。transient
フィールドがあるクラスは、必要に応じてフィールドを再初期化できるように準備する必要があります。)
これらの制限を遵守することはできませんクラスが実装すべきではありませんSerializable
(と、IIRC、Javaコンパイラでもないだろうしましょう、それはそう。)
transient
パーツがシリアライズ可能なタイプである必要があります。
JavaBeansのプロパティ
JavaBeanは、特定のプログラミング規則を満たすJavaオブジェクトです。
JavaBeanクラスは、Serializable
またはのいずれかを
実装する必要がありますExternalizable
JavaBeanクラスには引数のないコンストラクタが必要です
すべてのJavaBeanプロパティには、パブリックセッターメソッドとゲッターメソッドが必要です
すべての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;
}
}
例を挙げて説明します。
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;
}
}
setId(int id)
あなたが言うつもりだった体のためだと思いますthis.id = id;
this.id = is;
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を使用します。
シリアライゼーションについて:
オブジェクトのシリアル化では、オブジェクトは、オブジェクトのデータ、およびオブジェクトのタイプとオブジェクトに格納されているデータのタイプに関する情報を含む一連のバイトとして表すことができます。
シリアル化されたオブジェクトがファイルに書き込まれた後、ファイルから読み取って逆シリアル化できます。つまり、オブジェクトとそのデータを表す型情報とバイトを使用して、メモリ内にオブジェクトを再作成できます。
Beanは永続化され、サーバー間で転送されるため、プロジェクトを複数のサーバーにデプロイするときにシリアライゼーションが便利です。
Java Beansは標準であり、その基本的な構文要件は他の回答によって明確に説明されています。
ただし、IMO、それは単純な構文標準以上のものです。Java Beansの本当の意味または使用目的は、標準に関するさまざまなツールサポートとともに、コードの再利用とコンポーネントベースのソフトウェアエンジニアリングを容易にすることです。コード(または、小さなグルーコードのみを記述する必要があります)。残念ながら、このテクノロジーは業界で過小評価され、十分に活用されていません。これは、このスレッドの回答から知ることができます。
Java Beansに関する Oracleのチュートリアルを読むと、理解を深めることができます。
ウィキペディアによると:
クラスには、デフォルトのパブリックコンストラクター(引数なし)が必要です。これにより、編集およびアクティブ化フレームワーク内で簡単にインスタンス化できます。
クラスのプロパティは、標準の命名規則に従って、get、set、is(getではなくbooleanプロパティに使用できます)、およびその他のメソッド(いわゆるアクセサーメソッドとミューテーターメソッド)を使用してアクセスできる必要があります。これにより、フレームワーク内でBeanの状態を簡単に自動検査および更新できます。その多くには、さまざまなタイプのプロパティのカスタムエディターが含まれています。セッターは1つまたは複数の引数を持つことができます。
クラスはシリアライズ可能でなければなりません。[これにより、アプリケーションとフレームワークは、VMやプラットフォームに依存しない方法でBeanの状態を確実に保存、保存、および復元できます。]
詳細については、このリンクをクリックしてください。
Java Beanは、次の規則に従うJavaクラス[概念]です。
再利用可能なソフトウェアコンポーネントです。多くのオブジェクトを1つのオブジェクトにカプセル化できるので、同じオブジェクトに複数の場所からアクセスでき、コードのメンテナンスを容易にするためのステップです。
これらはシリアル化可能で、引数のないコンストラクターがあり、ゲッターメソッドとセッターメソッドを使用してプロパティにアクセスできます。「Bean」という名前は、Javaの再利用可能なソフトウェアコンポーネントを作成することを目的としたこの標準を包括するために付けられました。according to
wiki
アプリケーションのバックボーンを形成し、Spring IoCコンテナによって管理されるオブジェクトは、Beanと呼ばれます。Beanは、Spring IoCコンテナによってインスタンス化、アセンブル、または管理されるオブジェクトです。それ以外の場合、Beanはアプリケーション内の多くのオブジェクトの1つにすぎません。
according to
春io。
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パターンに従うものについて考えています)
Java Beanは、次の3つの基準を満たすJavaクラスです。
オブジェクトの状態を維持するには、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;
}}
JavaBeanを理解するには、次のことに注意する必要があります。JavaBeanは概念的なものであり、特定のもののクラスを表すことはできません。
JavaBeanは、再利用可能なソフトウェアコンポーネントの操作で視覚化できる開発ツールです。
JavaBeanはSun JavaBeans仕様に基づいており、再利用可能なコンポーネントにすることができます。その最大の特徴は再利用性です。
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の両方を意味します。豆。"
実際には、Beanは便利なオブジェクトです。それらをシリアル化することは、それらを簡単に永続化できることを意味します(簡単に回復できる形式で保存します)。
実世界でのBeanの一般的な使用法:
つまり、実際にはBeansは単なる慣習/標準です Javaオブジェクトから動作(シリアライズ)を期待し、特定の方法でそれを変更するいくつかの方法(プロパティのセッター)を提供するためのです。
それらを使用する方法は、あなたの発明ですが、私が上で参加した最も一般的なケースです。