目次
二.springframework-core(bean容器)
DI の基本的な実装原理は、リフレクションと ASM バイトコード フレームワークに依存しています (バイトコード フレームワークは、バイトコードの操作においてより効率的かつ強力です)。
@Autowired と @Resource の違いは何ですか? (男)
同じタイプの Bean をプロパティに正しく注入するにはどうすればよいでしょうか? (男)
1. フレームワークの概念:
1. フレームとは何ですか?
Java開発においてフレームワークとは、独自に設計・開発することなく、異なる依存パッケージを導入することで異なる機能を実現するクラスやインターフェースを指し、その後の開発はフレームワークに基づいて行われます。プロジェクトはフレームワークと呼ぶことができます (ネットワーク送信時のジャクソン文字列と Java ペアの間のジャクソン パッケージなど) 広い意味では、フレームワークは比較的リッチで強力な実装です 関数の依存パッケージ、各依存パッケージを呼び出すことができますモジュール。Java エンタープライズ開発で通常使用するフレームワークは ssm、つまり spring/springboot (基本的なスキャフォールディング)、springMvc (Web 開発フレームワーク)、mybatis (データベース開発) です。
2. フレームワークの役割は何ですか?
フレームワークを利用して開発を行うと、開発効率が大幅に向上するだけでなく、後々のプロジェクトのメンテナンス作業にも便利です。
二.springframework-core(bean容器)
ほとんどすべての Spring Framework は Spring Framework のコア ライブラリに基づいて動作し、そのコア ライブラリは Bean に関する知識であり、Bean を通常の Java オブジェクトとして理解することができます。
1. 豆コンテナとは何ですか?
Bean コンテナは、データ構造におけるコレクション フレームワークに似ています。Beanオブジェクトを格納および操作するためのコンテナです。コンテナはキーと値のペア (ハッシュマップに似ています) として理解できます。コレクション フレームワークとの違いは次のとおりです。オブジェクトの操作は、外部へのメソッド インターフェイスの提供がすべてではなく、部分的にアノテーションを使用して要素の操作を実現します。
Beanコンテナの理解(M)
上記の Bean コンテナーの紹介は比較的下品であり、通常の表現は次のようになります: Bean コンテナーは IOC 設計パターンの実装であり、コンテナーは Bean オブジェクトとオブジェクト間の依存関係を均一に管理するために使用されます。ロールには主に 2 つのポイントがあります (1) Bean コンテナを使用してオブジェクトのライフサイクルを管理する (2) Bean コンテナを使用してオブジェクト間の依存関係を管理します。Bean コンテナを作成するための 2 つの主な API は、BeanFactory と ApplicationContext (2 つのトップレベル実装インターフェイス) です。その中で、BeanFactory は基本的なコンテナ機能 (Bean オブジェクトのインスタンス化と Bean オブジェクトの依存関係注入) のみを提供します。BeanFactory が採用する Bean ロード方法は遅延ロードです。つまり、getBean() メソッドを呼び出した場合にのみ Bean オブジェクトがロードされます。インスタンス化された操作。ApplicationContext は BeanFactory のサブインタフェースです。プリロードによって Bean オブジェクトに追加されます。これは、Bean コンテナの作成時に Bean オブジェクトをロードします。基本的なコンテナ関数の実装に加えて、ApplicationContext はいくつかのより強力な関数も実装します。 ①Beanオブジェクトのライフサイクルを統合する(Beanオブジェクト全体のライフサイクルを管理する) ②I18の国際機能を実装する(異なる地域に異なる言語を表示すると理解できる) ③複数(継承した)コンテキストをロードすることで、それぞれがコンテキストはそれ自体のレベルに焦点を当てます (コンテキストは互いに独立していることも、関連していることもあります (継承関係、参照関係など))。
IOCとDIの理解(M)
IOC は制御の反転であり、主に Bean オブジェクトを均一に管理し、サードパーティの IOC コンテナを通じてオブジェクト間の依存関係を整理します。依存オブジェクトの取得は、プログラム自身の制御からIOCコンテナによるアクティブインジェクションに変換されるため、制御の反転と呼ばれます。IOC は DI とも呼ばれ、IOC と DI は 2 つの観点から同じ概念を表しており、次のような関係があります。
① IOC は、オブジェクトとオブジェクト間の依存関係を管理するために Bean コンテナの使用を重視します。依存オブジェクトの取得は、プログラム自体の制御から IOC コンテナによるアクティブな注入に変換されます。DI (Dependency Injection) は、Bean オブジェクト間に確立された依存関係を重視します。
② IOC が定義するのは仕様とアイデアであり、具体的な実装はないが、DI は IOC のアイデアを具体的に実現するものである
③IOCとDIの複合効果でデカップリングを実現
一般に、DI を実装するには、属性依存関係と構築依存関係の 2 つの方法があります。@Autowired で変更された属性は属性依存関係であり、@Autowired で変更された構築メソッドは構築依存関係です。構築依存関係の実装ロジックは次のとおりです。メソッドは、オブジェクト名を使用してコンテナ内の Bean オブジェクトを取得し、クラス内の属性に仮パラメータを割り当てます。
DI の基本的な実装原理は、リフレクションと ASM バイトコード フレームワークに依存しています (バイトコード フレームワークは、バイトコードの操作においてより効率的かつ強力です)。
春の豆の範囲は何ですか?(男)
①singleton: 同一スコープ内で取得したBeanオブジェクトは全てBeanオブジェクトであり、getbean()で取得したBeanと@Autowiredで注入したBeanも同じBeanオブジェクト
②プロトタイプ (プロトタイプ): 同じスコープで取得された Bean オブジェクトはすべて新しい Bean オブジェクトであり、getbean() および @Autowired で注入された Bean によって取得された Bean オブジェクトはすべて新しい Bean オブジェクトです
③リクエスト:リクエストとレスポンスは同じBeanオブジェクトを共有します(このリクエストとレスポンスでのみ有効)
④セッション: 1人のユーザーの複数のリクエストとレスポンスが同じBeanオブジェクトを共有します(1人のユーザーのリクエストとレスポンスでのみ有効)
⑤ application: アプリケーションのサーブレットコンテキスト宣言サイクルで、新しい Bean オブジェクトが生成されます
⑥ websocket: Websocket ライフサイクルで、新しい Bean オブジェクトを生成します。
Bean オブジェクトのライフサイクル (M)
①Beanをインスタンス化する
Bean オブジェクト用のメモリ領域を作成する
②プロパティを設定する
Bean オブジェクトのプロパティを挿入および接続する
③Beanの初期化
1) Awareの各種通知メソッドの実装:BeanNameAware、BeanFactoryAware、ApplicationContextAwareのインターフェースメソッド
2) BeanPostProcessor初期化プレメソッドを実行します。
3) @PostConstruct 初期化メソッドを実行し、依存関係注入操作の後に実行します。
4) 自分で指定した init-method メソッドを実行します (存在する場合)。
5) BeanPostProcessor初期化ポストメソッドを実行します。
④豆の使用
⑤豆を破壊する
Bean コンテナに格納される Bean オブジェクトは通常、ステートレス Bean オブジェクトです。
ステートフル Bean : データを保存できるインスタンス変数を持つオブジェクトですが、スレッドセーフではありません。各ユーザーには独自の一意のインスタンスがあります。ユーザーの存続期間中、Bean はユーザーの情報を保持します (つまり「ステートフル」)。ユーザーが死亡すると (呼び出しの終了またはインスタンスの終了)、Bean の存続期間は保持されます。豆も終わりました。つまり、各ユーザーは最初に初期 Bean を取得します。
Stateless Bean (Stateless Bean) : インスタンス変数を持たないオブジェクトであり、データを保存できず、不変クラスであり、スレッドセーフです。Bean がインスタンス化されると、セッション プールに追加され、各ユーザーが共有できるようになります。ユーザーが死亡した場合でも、Bean の寿命は必ずしも終了するわけではなく、他のユーザーが呼び出せるようにセッション プールにまだ存在している可能性があります。特定のユーザーが存在しないため、特定のユーザーの状態を維持できないため、ステートレス Bean と呼ばれます。ただし、ステートレス セッション Bean はステートレスではありません。独自の属性 (変数) がある場合、これらの変数はそれを呼び出すすべてのユーザーの影響を受けるため、実際のアプリケーションでは注意する必要があります。
これは簡単に理解できます。ステートレス オブジェクトとは、Bean オブジェクトのプロパティがシーンとともに変化しないことを意味し、ステートフル オブジェクトとは、そのプロパティがシーンとともに変化することを意味します (ID に応じて異なるオブジェクトを取得するなど)。
2. Beanオブジェクトの注入と登録
登録とは、Bean オブジェクトを Spring コンテナに格納することを指しますが、注入とは、コンテナ内の Bean オブジェクトを別の場所に移動することを指します (メソッドのパラメータである場合もあれば、インスタンス オブジェクトの属性である場合もあります)。
Spring コンテナの場合、Bean オブジェクトの登録と注入はアノテーションを通じて行われます。
①登録:
1. クラス登録の場合: 通常は@component アノテーションを使用します
@component アノテーションを使用すると、コンテナはアノテーションが付けられたクラスの最初の小文字をコンテナ内の Bean オブジェクトのキーとして使用します。
エンタープライズレベルのプロジェクトの開発では、通常、プロジェクトのさまざまなモジュール間の結合を減らすために、プロジェクト全体をさまざまなモジュールに分割します。さまざまなモジュールに対応して、シングルトン Bean オブジェクトの登録もさまざまなアノテーションに対応します。
@Controller:コントローラー ストレージ。Web 開発、Web リクエストとレスポンスの処理に使用されます。
@Service:サービス ストレージ、ビジネス ロジックのオブジェクト登録: プロジェクト全体にサービスを提供します。
@repository:倉庫ストレージ、データ アクセス操作、一般にデータベースの操作を指します。
@component: 一般的なコンポーネント、上記 3 つの機能以外のその他の機能
@configuration: エンタープライズレベル/大規模プロジェクトの開始時にロードする必要があるリソースファイルを指します。
2. メソッドの登録には、通常@Bean アノテーションを使用します
@Bean アノテーションを使用すると、コンテナはアノテーション付きメソッドをコンテナ オブジェクトのキーとして使用し、値はコンテナのオブジェクトになります。異なるメソッドが同じタイプのオブジェクトを返す場合、複数の Bean オブジェクトを Bean に格納できます。容器
②注射
3. Bean オブジェクトの注入には、通常 @Autowired アノテーションが使用されます: (注入後、2 つの間に依存関係があり、人はモバイルに依存します)
autowired を使用して、コンテナ内の Mobile オブジェクトを Person クラスに注入します (オブジェクト名とオブジェクト タイプに従って注入します。オブジェクト名が一致しない場合は、コンテナ内のオブジェクト タイプと一致します。そのようなクラスが複数ある場合は、コンテナ内のオブジェクト タイプと一致します)。 Spring コンテナ内のオブジェクトはエラーを直接報告します)。
警告: コンテキストの初期化中に例外が発生しました - 更新の試行をキャンセルしています: org.springframework.beans.factory.UnsatisfiedDependencyException: 'person' という名前の Bean の作成中にエラーが発生しました: フィールド 'mobile3' を通じて表現される満たされていない依存関係。ネストされた例外は org.springframework.beans.factory.NoUniqueBeanDefinitionException です: 利用可能なタイプ「org.ljl.Mobile」の適格な Bean がありません: 単一の一致する Bean が予期されましたが、2 が見つかりました: mobile,mobile2
また、lombok依存パッケージの導入や@Dataアノテーションの利用により、setter、getter、tostring、equals、hashcodeなどのメソッドの書き換えが実現でき、コード開発の効率が向上し、後のメンテナンスにも役立ちます。コード
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> </dependency>
@Autowired を実装してプロパティ インジェクションを実現することに加えて、@Resource を使用してプロパティ インジェクションを実現することもできます。
@Autowired と @Resource の違いは何ですか? (男)
1. @Autowired は Spring Framework によって提供されるアノテーション、@Resource は JDK によって提供されるアノテーションです
2. @Autowired はフレームワークで使用する必要があり、それ以外の場合はエラーが報告されます @Resource をフレームワークで使用する必要はありませんが、JDK はアノテーションが付けられた特定の関数の実装を担当しません。
3. これは、Bean を指定する実装が異なることを示しています: @Resource (name=" ") の実装ですが、@Autowired は @Qualifer と組み合わせて実装する必要があります。
同じタイプの Bean をプロパティに正しく注入するにはどうすればよいでしょうか? (男)
3. Springコンテナをベースとしたプロジェクト開発
プロジェクト開発の手順は次のとおりです。
①Mavenプロジェクトを作成する
②Spring依存パッケージを導入する
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.22</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.22</version>
</dependency>
③ コンテナを作成し、パッケージをスキャンします
ApplicationContext context=new AnnotationConfigApplicationContext("org.ljl");
④ アノテーションに従って依存関係を登録する
⑤注射依存性