序文
最初の開発言語としてJavaを使用している友人は、誰もが多かれ少なかれSpring開発フレームワークを使用していると思います。Springフレームワークは本当にJavaプログラマーの春であると言えます。Springでは、Beanは最も重要な概念の1つです。 、は他の高度な知識を学ぶための基礎です。率直に言って、Beanは実際にはSpringフレームワークによって管理されるオブジェクトです。今日はBeanがSpringでどのように作成されるかを見ていきます。
1.Beanを定義する方法
次のようなProgrammerクラスがある場合、このプログラマークラスには、名前(名前)、年齢(年齢)、ガールフレンドがいるかどうか(hasGirlFriend)(PS通常、hasGirlFriendの属性はfalse)、および3つの属性があります。個人情報を表示するメソッドshowMaterial。
/**
* @Author: mghio
* @Date: 2020-10-05
* @Description: Programmer.
*/
public class Programmer {
private String name;
private Integer age;
private Boolean hasGirlFriend;
public void showMaterial() {
System.out.println("name: " + name + ", age: " + age + ", hasGirlFriend: " + hasGirlFriend);
}
}
さて、SpringコンテナでそのようなProgrammerオブジェクトを記述する方法を設計するように求められた場合は、それについて考えてください。
これは、次の情報にすぎません。
1.1クラス名
まず、クラス名でこのクラスにロードできるように、クラス名は必ず必要です。
1.2インスタンスエイリアス
コンテナ内にクラスの複数のインスタンスがある場合、またはクラス名でインスタンスを記述したくない場合は、エイリアスを設定してインスタンスを記述すると便利です。
1.3コンストラクター
Javaでクラスのインスタンスを作成すると、最初にクラスのコンストラクターが呼び出されます。複数のコンストラクターがある場合は、さまざまなパラメータータイプを渡して選択するなど、オブジェクトの作成に使用するコンストラクターを明確に説明する必要があります。さまざまなコンストラクター。
1.4クラス属性設定
たとえば、コンストラクターでプロパティを渡さない場合、上記のプログラマーはパラメーターなしのコンストラクターを介して直接作成できます。後でインスタンスのプロパティを設定する必要がある場合は、プロパティ設定メソッドを呼び出して設定する必要があるため、プロパティメソッドそれも必要です。
1.5初期化方法
インスタンス化の完了後にカスタムビジネスロジックを実行する必要がある場合があります。たとえば、上記の例のプログラマーは、インスタンス化の完了後に個人情報を表示する必要があります(showMaterial()メソッドを呼び出します)。このシナリオでは、初期化メソッドを使用します。とても適しています。
1.6破壊方法
破壊に関しては、誰もがリソースについて考えるかもしれません。たとえば、一般的に、リソースを解放できるようにするために、誰もがリソースを解放する作業をfinallyコードブロックに入れるというコンセンサスがあります。同様に、Beanが接続されて後でいくつかのリソースを使用する場合、破棄後にこれらのリソースを解放する場合は、破棄方法を使用してリソースを解放できます。
1.7範囲
コンテナ全体に1つだけ(シングルトン)必要なBeanもあれば、リクエストごとに対応するBeanが異なる必要があるBeanもあります。現時点では、スコープの概念を使用して、要件の異なるBeanを区別できます。このクラスはシングルトンであり、既存のBeanを再利用します。それ以外の場合は、再作成されます。
もちろん、ここに私がより重要だと思ういくつかの属性だけがあります、そして追加される必要がある他の属性があります。SpringフレームワークのBean定義は、BeanDefinitionクラスによって記述されます。
SpringBootを使用する前に、XML構成とSpringを使用してBeanを解析および生成しました。同時に、BeanDefinitionBuilderを使用してコードごとにBeanを生成することもできます。具体的なコードは次のとおりです。
/**
* @Author: mghio
* @Date: 2020-10-05
* @Description:
*/
public class ProgrammerTest {
public static void main(String[] args) {
new Programmer().showMaterial();
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(Programmer.class);
beanDefinitionBuilder.addPropertyValue("name", "mghio");
beanDefinitionBuilder.addPropertyValue("age", 18);
beanDefinitionBuilder.addPropertyValue("hasGirlFriend", false);
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.registerBeanDefinition("programmer", beanDefinitionBuilder.getBeanDefinition());
Programmer programmer = (Programmer) beanFactory.getBean("programmer");
programmer.showMaterial();
}
}
結果は次のとおりです。
XMLメソッドを使用する場合、Beanは通常ClassPathXmlApplicationContextを呼び出すことによって登録され、そのコンストラクターは特定のXMl構成ファイルのパスを渡すことができます。これは1つ以上、またはワイルドカードにすることもできます。おなじみのrefreshメソッドがコンストラクター内で呼び出されます。
refreshメソッドを詳しく調べると、このメソッドでgetFreshBeanFactoryメソッドが呼び出されて、生成されたBeanが取得されていることがわかります。このメソッドは、実際には抽象実装クラスAbstractRefreshableApplicationContextのrefreshBeanFactoryメソッドを呼び出します。このメソッドは、最初に、この時点でbeanFactoryがあるかどうかを判別します。 BeanFactoryが最初に破棄され、次にBeanFactoryが再作成され(実際にはDefaultListableBeanFactoryタイプ)、最後にloadBeanDefinitionsが呼び出されて、定義したXMl構成がロードされます。このメソッドはXmlBeanDefinitionReaderによって読み取られたXMl構成を使用します。詳しく見てみましょう。 SpringがBeanを生成するプロセスを見てみましょう。
2.Beanを作成するプロセス
まず、以下に示すように、BeanFactoryクラスの図を確認します。
Beanの全体的な作成プロセスは次のとおりです。
3.まとめ
この記事では、SpringがBeanを作成する主なプロセスについて簡単に説明し、ソースコードを理解するために詳細に検討する必要のある詳細がたくさんあります。ここでは、小さな目標を設定してから、Springの簡単なバージョン(IOC、AOP)を自分で実装します。