ホームページ  >  記事  >  Java  >  2023 年の最新の SSH フレームワーク面接の質問の概要

2023 年の最新の SSH フレームワーク面接の質問の概要

王林
王林転載
2020-10-19 17:02:593404ブラウズ

2023 年の最新の SSH フレームワーク面接の質問の概要

Hibernate はどのように機能するのでしょうか?また、なぜ Hibernate を使用する必要があるのでしょうか?

(より関連性の高い面接の質問に関する推奨事項: java 面接の質問と回答)

動作原理:

1. 構成の読み取りと解析file

2. マッピング情報を読み取って解析し、S​​essionFactory

を作成します。 3. Session

# を開きます。 4. トランザクション Transation

# # を作成します。
# 5. 永続化操作

# 6. トランザクションの送信

# 7. セッションを閉じる


# 8. SessionFactory を閉じる

Hibernate を使用する理由 (つまり、その利点):

1. データベースへの JDBC アクセスのコードはカプセル化されており、データ アクセス層の退屈で反復的なコードが大幅に簡素化されます。


2. Hibernate は、JDBC と優れた ORM 実装に基づく主流の永続化フレームワークです。これにより、DAO 層のコーディング作業が大幅に簡素化されます。


3. Hibernate は、バイトコード拡張プログラムの代わりに Java リフレクション メカニズムを使用して、透過性を実現します。


4. Hibernate マッピングの柔軟性は優れています。 1 対 1 から多対多の複雑な関係まで、さまざまなリレーショナル データベースをサポートします。

2. Hibernate の get メソッドとload メソッドの違い

load メソッドの場合、hibernate はデータがデータベースに存在する必要があると認識します。プロキシを安全に使用してロードを遅らせることができます。使用中に、問題が解決した場合は例外をスローするだけであることがわかります;

hibernate get メソッドの場合、hibernate は実際のデータを取得する必要があり、そうでない場合は null を返します。

詳細な紹介:

1. get メソッドの場合、Hibernate は ID に対応するデータが存在するかどうかを確認し、最初にセッション キャッシュを検索し、次に 2 次キャッシュを検索します。 、まだ データベースにクエリを実行し、データベース内に見つからない場合は null を返すだけです。

2. ロード メソッドがエンティティ オブジェクトをロードすると、マッピング ファイルのクラス レベルの遅延属性に従って構成されます (デフォルトは true)。

ケースバイケースで検討してください:

(1) それが true の場合、まずセッション キャッシュを検索して、その ID に対応するオブジェクトが存在するかどうかを確認します。存在しない場合は、遅延ロードを使用してエンティティを返します。プロキシ クラス オブジェクト (プロキシ クラスはエンティティ クラスのサブクラスであり、CGLIB によって動的に生成されます)。オブジェクトが実際に使用されるとき (OID の取得を除く)、2 次キャッシュとデータベースが照会され、一致するレコードが見つからない場合は、ObjectNotFoundException がスローされます。

(2) falseの場合、検索順序はgetメソッドと同じですが、最終的に条件を満たすレコードが見つからなかった場合はObjectNotFoundExceptionがスローされます。

3. Hibernate はどのように読み込みを遅延させますか?

Hibernate3 はプロパティの遅延読み込み機能を提供します。 Hibernate がデータをクエリするとき、データはメモリ内に存在しません。代わりに、プログラムが実際にデータを操作するときにオブジェクトがメモリ内に存在します。これにより遅延読み込みが実装され、サーバーのメモリ オーバーヘッドが節約され、サーバーのパフォーマンスが向上します。 。

4. Hibernate でクラス間の関係を実現するにはどうすればよいですか?

クラス間の関係は主にテーブルとテーブル間の関係に反映されます。すべてのテーブルとクラスをプログラム内で一緒にマップし、構成ファイル内で多対 1、1 対多、および多対多を通じて動作します。

5. Hibernate の update() と saveOrUpdate() の違いは何ですか?

saveOrUpdate():

1. オブジェクトがこのセッションにすでに永続化されている場合は、何もしません

2. このセッションに関連付けられている別のオブジェクトがある場合は、同じものを持ちます永続的な識別子 (識別子) の場合、例外をスローします

3. オブジェクトに永続的な識別子 (識別子) 属性がない場合は、そのオブジェクトに対して save() を呼び出します

4. オブジェクトの場合は、save() を呼び出します。永続的な識別子 (識別子) は、新しくインスタンス化されたオブジェクトであることを示し、save()

を呼び出します。 5. オブジェクトにバージョン情報 ( または 経由) が付属している場合、バージョン プロパティの値は、それが新しくインスタンス化されたオブジェクトであることを示し、save() を呼び出します。それ以外の場合は、このオブジェクトを update() します。

update():

は、無料のエンティティ オブジェクトを直接更新します。

6、Hibernate のキャッシュ メカニズムについて話しましょう。

1. 1 次キャッシュ: 内部キャッシュは Hibernate に存在し、アプリケーションのトランザクション レベルのキャッシュです。

2. 2 次キャッシュ: アプリケーション レベル キャッシュ、分散キャッシュ。

使用シナリオ: データは第三者によって変更されない、データ サイズは許容範囲内、データ更新頻度は低い、システムで同じデータが頻繁に使用される、重要ではないデータ

3. サードパーティのキャッシュ (ehcache など) を導入します。

7, Hibernate を最適化するにはどうすればよいですか?

1. 一方向の 1 対多の関連付けではなく、双方向の 1 対多の関連付けを使用します。

2. 一方向の 1 対多の関連付けを柔軟に使用します

3. 1 対 1 の関連付けは必要ありません。多対 1 に置き換えます。

4. オブジェクト キャッシュを設定し、コレクション キャッシュを使用しないでください。

5. Bag を使用する1 対多のコレクション、および多対多のコレクションの Set

6 . 継承されたクラスで明示的なポリモーフィズムを使用する

7 . テーブル フィールドが少なくても心配する必要はありません多くのテーブルアソシエーション、およびセカンドレベルのキャッシュ

8のサポートがあります。Hibernateの怠zyなロードとOpenSessionInview

について話しましょう。

(ビデオ推奨: java コース)

9、struts のワークフローを簡単に説明します2

1. クライアントのブラウザーが HTTP ask を送信します。 。

2. web.xml 設定に従って、リクエストは FilterDispatcher によって受信されます。

3. struts.xml 設定に従って、呼び出す必要がある Action クラスとメソッドを見つけ、IoC を通じてその値を Aciton に注入します。

4. アクションはビジネス ロジック コンポーネントを呼び出してビジネス ロジックを処理します。このステップにはフォームの検証が含まれます。

5. アクションの実行後、struts.xml の設定に従って対応する戻り結果を見つけ、対応するページにジャンプします。

6. HTTP 応答をクライアントのブラウザに返します。

10、Struts の設計パターンについて話しましょう

MVC パターン

1. Web アプリケーションの開始時に ActionServlet がロードされ、初期化されます;

2. ユーザーがフォームを送信すると、構成された ActionForm オブジェクトが作成され、フォームの対応するデータが入力されます;

3. ActionServlet は、構成された設定に基づいてフォームが必要かどうかを判断します。 Struts-config.xml ファイルを確認します。必要に応じて、ActionForm の Validate() を呼び出し、確認後にリクエストを送信するアクションを選択します。アクションが存在しない場合、ActionServlet は最初にオブジェクトを作成し、その後、execute() を呼び出します。 Action のメソッド;

4, Execute() は、ActionForm オブジェクトからデータを取得し、ビジネス ロジックを完了し、ActionForward オブジェクトを返します。その後、ActionServlet は顧客のリクエストを、ActionForward オブジェクトで指定された JSP コンポーネントに転送します。

## 5. ActionForward オブジェクトで指定された JSP は動的 Web ページを生成し、クライアントに返します。

11、Struts の利点と欠点

利点:


1. 明確な構造で MVC モデルを実装するため、開発者は Struts の実装のみに集中できます。ビジネスロジック.

2. 豊富なタグが用意されており、Strutsタグライブラリ(Taglib)を柔軟に活用することで開発効率が大幅に向上します。また、国内の JSP 開発者に関しては、JSP に付属の共通タグを使用するだけでなく、独自のタグを開発することはほとんどないため、Struts から始めるのがよいでしょう。

3. ページ ナビゲーション: ページ ナビゲーションは将来の開発の方向性となり、実際にそうすることでシステムのコンテキストがより明確になります。設定ファイルを通じてシステム全体の各部のつながりを把握することができ、後のメンテナンスに非常に役立ちます。この利点は、別の開発者グループがプロジェクトを引き継ぐ場合にさらに明らかになります。

4. 例外処理メカニズムを提供します。

5. データベース接続プールの管理

6. I18N

をサポートします。欠点:

1 . 表示層に行くときは、順方向の設定が必要です。表示層に行くたびに、ほとんどが jsp に直接行くと思います。リダイレクトの場合は、順方向の設定が必要です。jsps が 10 個ある場合表示層では、10 回構成する必要があります。Struts では、これには、転送の再変更が必要となるディレクトリやファイルの変更は含まれていません。構成を変更するたびに、プロジェクト全体を変更する必要があることに注意してください。ビジネスの変更が複雑で頻繁なシステムの場合、そのような操作は想像できないほど簡単です。何十人、何百人が同時にオンラインで当社のシステムを使用しています。私がどれほど困っているかご想像いただけると思います。

2. Struts アクションはスレッドセーフである必要があり、1 つのインスタンスのみがすべてのリクエストを処理できます。したがって、アクションで使用されるすべてのリソースを均一に同期する必要があり、これによりスレッド セーフティの問題が発生します。

3. テストが不便 Struts の各アクションは Web 層と結合しているため、テストが Web コンテナに依存しており、単体テストの実装も困難です。ただし、単体テストを実装できる Junit 拡張ツール Struts TestCase があります。

4. 型変換 Struts の FormBean はすべてのデータを String 型として扱い、型変換にはツール Commons-Beanutils を使用できます。ただし、その変換はすべてクラス レベルで行われ、変換タイプは構成できません。型変換中にエラー メッセージをユーザーに返すことも非常に困難です。

5. サーブレットへの依存度が高すぎる Struts は、Action を処理するときに ServletRequest と ServletResponse に依存する必要があるため、Servlet コンテナを取り除くことができません。

6. フロントエンドの表現言語について Struts は JSTL を統合しているため、主に JSTL 表現言語を使用してデータを取得します。ただし、JSTL の式言語は、コレクションとインデックスのプロパティの処理が非常に弱いです。

7. アクションの実行制御が難しい Struts でアクションを作成する場合、その実行順序を制御するのは非常に困難です。機能要件を実現するには、サーブレットを書き直す必要がある場合もあります。

8. アクション実行前後の処理 Struts がアクションを処理する場合、クラス階層に基づいており、アクション処理前後の操作が困難です。

9. イベントのサポートが不十分です。Struts では、フォームは実際には Action クラス (または DispatchAction) に対応します。つまり、Struts では、フォームは実際に 1 つのイベントにのみ対応します。Struts このイベント メソッドは、アプリケーション イベントは、コンポーネント イベントと比較して粒度の粗いイベントです。

12、なぜスプリング (つまり利点) を使用する必要があるのでしょうか?

1. Spring は、EJB の使用を選択するかどうかに関係なく、中間層オブジェクトを効果的に整理できます。 Struts または J2EE API 用に特別に設計されたその他のフレームワークだけを使用している場合、Spring は残りの部分の解決に取り組んでいます。

2. Spring では、多くのプロジェクトでよく見られるシングルトンの過剰な使用を排除できます。シングルトンを過度に使用すると、システムのテスト容易性とオブジェクト指向性が低下します。

3. Spring では、さまざまなアプリケーションやプロジェクトにわたって設定ファイルを一貫した方法で処理することにより、プロパティ ファイルのさまざまなカスタム形式の必要性を排除できます。特定のクラスがどのマジック属性またはシステム プロパティを探しているのか疑問に思ったことはありますか。そのためには Javadoc やソース コードを読む必要がありますか? Spring では、クラスの JavaBean プロパティを確認するだけで済みます。 Inversion ofControl (後述) を使用すると、この単純化を実現できます。

4. Spring は、クラスではなくプログラミング インターフェイスのコストをほぼゼロに削減することで、優れたプログラミング習慣の開発を促進できます。

5. Spring は、Spring を使用して作成されたアプリケーションが API にできるだけ依存しないように設計されています。 Spring アプリケーションのほとんどのビジネス オブジェクトは Spring に依存しません。

6. Spring で構築されたアプリケーションは単体テストが簡単です。

7. Spring では、アプリケーション アーキテクチャの必然的な選択ではなく、実装上の選択肢として EJB を使用できます。 POJO またはローカル EJB の使用を選択して、呼び出しコードに影響を与えずにビジネス インターフェイスを実装できます。

8. Spring は、EJB を使用せずに多くの問題を解決するのに役立ちます。 Spring は、多くの Web アプリケーションに適した EJB の代替品を提供できます。たとえば、Spring は EJB コンテナを経由せずに AOP を使用して宣言型トランザクション管理を提供できます。単一のデータベースのみを処理する必要がある場合は、JTA 実装さえ必要ありません。

9. Spring は、JDBC を使用する場合でも、O/R マッピング製品 (Hibernate など) を使用する場合でも、データ アクセスのための一貫したフレームワークを提供します。

13. Spring トランザクションを実装するために知っているいくつかの方法を列挙してください

(1) プログラムによるトランザクション管理: コードを手動で記述する必要があり、実際の開発ではほとんど使用されません。

(2)、TransactionProxyFactoryBean に基づく宣言型トランザクション管理には、各トランザクション管理クラスに対応する設定が必要です

(3)、AspectJ の XML に基づく宣言型トランザクション管理、必要ありません クラスを変更する場合は、XML で設定するだけですファイル

(4)、アノテーションベースの宣言型トランザクション管理、シンプルな構成、ビジネス層クラスにアノテーションを追加する必要があります

14、Springトランザクションの分離レベルと伝播動作について説明します

分離レベル:

- DEFAULT はデータベースのデフォルトの分離レベルを使用します

# - READ_UNCOMMITTED により、ダーティ リード、非反復読み取り、ファントム リードの問題が発生します

- READ_COMMITTED では繰り返し読み取りとファントム読み取りが発生します。

- REPEATABLE_READ ではファントム読み取りが発生します。

- SERIALIZABLE が最も安全ですが、コストが最も高く、パフォーマンスへの影響が非常に深刻です

そして伝播行:

- 必須 トランザクションが存在する場合はトランザクションに統合され、存在しない場合はトランザクションを作成します

- サポートトランザクションが存在する場合はトランザクションに統合され、存在しない場合はトランザクションは作成されません

- トランザクションが MANDATORY に存在する場合は、トランザクションに統合されます。存在しない場合、例外がスローされます

- REQUIRES_NEW は常に新しいトランザクションを作成します

- NOT_SUPPORTED トランザクションが存在する場合、トランザクションは中断され、非実行が継続されます トランザクション操作

- 常に非トランザクションを実行することはありません。現在トランザクションが存在する場合は、例外がスローされます。

- NESTED 埋め込みトランザクション

15. DIの仕組みとは何ですか?
依存性の注入と制御の反転は同じ概念です。具体的には、従来のプログラミング プロセスでは、ロールが別のロールからの支援を必要とする場合、通常、呼び出し先のインスタンスを作成するためにそのロールが呼び出されます。

しかし、Spring では、呼び出し先を作成する作業が呼び出し元によって行われなくなるため、これは制御の反転と呼ばれます。呼び出し先を作成する作業は Spring によって実行され、その後呼び出し元が注入されます。
そのため、依存性注入とも呼ばれます。

Spring では動的かつ柔軟な方法でオブジェクトを管理しますが、インジェクションには設定インジェクションとコンストラクションインジェクションの 2 つの方法があります。
設定インジェクションの利点: 直感的で自然です
コンストラクションインジェクションの利点: 依存関係の順序をコンストラクターで決定できます。

16. AOP とは何ですか?
アスペクト指向プログラミング (AOP) は、Spring の依存関係注入 (DI) を改善します。

アスペクト指向プログラミングは、Spring の主に 2 つの側面で現れます:
1. アスペクト指向プログラミングは、宣言型トランザクション管理を提供します。
2.spring はユーザー定義のアスペクトをサポートします

推奨チュートリアル: Java の入門

以上が2023 年の最新の SSH フレームワーク面接の質問の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はJava知音で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。