Javaインタビュー間違った質問セット1

SpringBootに関する注記:

SpringBootApplication @ 1:
このアノテーションは、一部に相当するプログラムのために必要な設定、実行する宣言springbootに使用され
、これはXML構成ファイルと同等の構成ファイルであることを宣言:@Configuration
@EnableAutoConfiguration:自動設定機能、
@ComponentScan成分スキャン
により、一部のBeanについて、上記の3つのアノテーションの統合バージョンを自動的に検出してアセンブルできます。

2. @ ResponseBody:このメソッドによって返される結果がresponsebodyに直接書き込まれることを示します。これは通常、データを非同期で取得するときに使用され、RESTfulスタイルのAPIを構築するために使用されます。
@RequesMappingを使用した後、戻り値は通常ジャンプパスとして解析されます。@ ResponseBodyを追加した後は、ジャンプパスとして解析されず、http応答本文に直接書き込まれます。
たとえば、jsonデータを非同期で取得するには、@ responsebodyを追加した後、jsonデータが直接返されます。このアノテーションは通常、@ RequestMappingと組み合わせて使用​​されます。

3. @ Controller:コントロールクラスを定義するために使用されます。Springプロジェクトでは、コントローラーは、ユーザーから渡されたURL要求を対応するサービスインターフェイス(サービスレイヤー)に転送する役割を果たします。アノテーションは通常、コントローラーレイヤーのクラスに配置され、@ RequestMappingと組み合わせて使用​​されます。

4. @ RestController:アクションなどのコントロールレイヤーコンポーネントをマークするために使用されます。@Controllerと@ResponseBodyの統合に相当します。

5. @ RequestMapping:コントローラー内の特定の機能へのURLのマッピングを担当するルーティング情報を提供します。

6. @ EnableAutoConfiguration:Spring Boot自動構成:追加したjar依存関係に従ってSpringアプリケーションを自動的に構成します。
@EnableAutoConfigurationまたは@SpringBootApplicationアノテーションを@Configurationクラスに追加して、自動構成を選択できます。不要な特定の自動構成クラスが適用されていることがわかった場合は、@ EnableAutoConfigurationアノテーションの除外属性を使用してそれらを無効にすることができます。

7. @ ComponentScan:このタイプのスキャンコンポーネントが自動的に検出されることを示します。個人的な理解は、@ Component、@ Controller、@ Service、@ Repositoryなどのアノテーション付きクラスをスキャンしてBeanとして登録すると、@ Configurationクラスを含むすべてのSpringコンポーネントを自動的に収集できることと同じです。@ComponentScanアノテーションを使用してBeanを検索し、@ Autowiredアノテーションと組み合わせてインポートすることがよくあります。@Configurationクラスを含むすべてのSpringコンポーネントを自動的に収集できます。

8. @ ImportResource:xml構成ファイルをロードするために使用されます。@ Component、@ Controller、@ Service、および@Repositoryは、
クラスをコンポーネントとして登録
するために使用されます。@ componentは、MVC 3に従って、Web開発のサービス層、コントローラー層、およびdao層(上記と同じ順序)で異なるアノテーションを持ちます。-層アーキテクチャ。ただし、効果は同じです。

9. @Autowiredと@Resourceは、Beanの自動アセンブリを実現するために使用されます
。10。@ PathVariableはパラメーターを取得します。

サーブレットのライフサイクル

1つは、読み込みとインスタンス化です

最初の段階では、サーブレットコンテナがサーブレットのロードとインスタンス化を担当していることがわかります。サーブレットコンテナが起動するか、コンテナが最初のリクエストに応答するためにこのサーブレットが必要であることを検出すると、サーブレットインスタンスが作成されます。サーブレットコンテナが開始された後、必要なサーブレットクラスがどこにあるかを認識している必要があります。これにより、サーブレットコンテナは、クラスローダーを介してローカルファイルシステム、リモートファイルシステム、またはその他のネットワークサービスからサーブレットクラスをロードできます。コンテナはサーブレットのインスタンスを作成します。

2、サーブレットの初期化

第2段階では、サーブレットがインスタンス化された後、コンテナはinit()メソッドを呼び出してオブジェクトを初期化します。これにより、サーブレットオブジェクトは、データベース接続の確立やデータベース接続の確立など、クライアント要求を処理する前にいくつかの初期化タスクを完了できます。構成情報の取得。すべてのサーブレットインスタンスで、init()メソッドを呼び出すことができるのは1回だけです。初期化中、サーブレットインスタンスは、コンテナによって準備されたServletConfigオブジェクトを使用して、Webアプリケーションの構成情報から初期化パラメータ情報を取得できます。

3、クライアント要求処理

第3段階では、サーブレットコンテナがサーブレットのservice()メソッドを呼び出してリクエストを処理します。service()メソッドが呼び出される前に、init()メソッドが正常に実行される必要があることに注意してください。service()メソッドでは、サーブレットインスタンスがServletRequestオブジェクトを介してクライアントの関連情報とリクエスト情報を取得し、リクエストを処理した後、ServletResponseオブジェクトのメソッドを呼び出してレスポンス情報を設定します。service()メソッドの実行中にエラーが発生した場合、サーブレットインスタンスはServletExceptionまたはUnavailableExceptionをスローする可能性があります。UnavailableExceptionがインスタンスが永続的に利用できないことを示している場合、サーブレットコンテナはインスタンスのdestroy()メソッドを呼び出します。このインスタンスに対する後続のリクエストはすべて、コンテナから送信されたHTTP404応答を受信します。UnavailableExceptionがインスタンスが一時的に利用できないことを示している場合、一時的に利用できない期間中のインスタンスへのリクエストは、コンテナによって送信されたHTTP503応答を受信します。

4、サーブレットの破壊

最終段階で、サーブレットコンテナがサーブレットインスタンスをサービスから削除する必要があることを検出すると、コンテナはインスタンスのdestroy()メソッドを呼び出して、インスタンスが使用するリソースを解放し、データを永続に保存できるようにします。ストレージデバイス。メモリを解放する必要があるか、コンテナを閉じると、コンテナはサーブレットインスタンスのdestroy()メソッドを呼び出します。destroy()メソッドが呼び出された後、コンテナはサーブレットインスタンスを解放し、このインスタンスはJavaガベージコレクタによってリサイクルされます。リクエストを再度処理するためにサーブレットが必要な場合、サーブレットコンテナは新しいサーブレットインスタンスを作成します。サーブレットのライフサイクル全体で、サーブレットインスタンスの作成とインスタンスのinit()およびdestroy()メソッドは1回だけ実行できます。初期化が完了すると、サーブレットコンテナはインスタンスをメモリに保存します。 、service()メソッドを呼び出すことにより、受信したリクエストを処理します。

フローチャート:
ここに画像の説明を挿入します

SpringMVCプロセス

1.ユーザーはフロントコントローラーDispatcherServletにリクエストを送信します
2.フロントコントローラーはリクエストを受信した後にマッピングプロセッサーMappingHandlerを呼び出します
3.マッピングプロセッサーはxml構成またはアノテーションに従って特定のプロセッサー情報を見つけ、それをフロントコントローラーに返します
4 。フロントコントローラーアダプターHandlerAdapterを呼び出し
ます。5 。アダプターは、実行する特定のプロセッサーコントローラーを見つけて、結果をフロントコントローラー
6に返します。フロントコントローラーは、結果を受信した後、結果をビューパーサーに渡します(6の結果は一部のモデルとビュー)
7。分析データをフロントコントローラーに渡した後
8.フロントコントローラーがユーザーに応答します

JDBC接続データベースの手順

1.登録およびデータベースドライバをロード
Class.forNameの(「はcom.mysql.jdbc.Driverを」);成功したローディング後、ドライバクラスのインスタンスは、DriverManagerクラスに登録されます。

2.データベース接続を取得します
String url = "jdbc:mysql:// localhost:3306 / test";
String username = "root";
String password = "root";
Connection con = DriverManager.getConnection(url、username、password) ;

3.ステートメントステートメントオブジェクトの作成
SQLステートメントを実行するには、java.sql.Statementのインスタンスを取得する必要があります。ステートメントインスタンスは、次の3つのタイプに分けられ
ます。1。静的SQLステートメントを実行します。通常、Statementインスタンスを介して実現されます。
2.動的SQLステートメントを実行します。通常、PreparedStatementインスタンスを介して実装されます。
3.データベースのストアドプロシージャを実行します。通常、CallableStatementインスタンスを介して実装されます。
•特定の実装:
Statement stmt = con.createStatement();
PreparedStatement pstmt = con.prepareStatement(sql);
CallableStatement cstmt = con.prepareCall( "{CALL demoSp(?、?)}");

4. SQLステートメントを記述して実行します
。Statementインターフェイスには、SQLステートメントを実行するための3つのメソッドがあります
。executeQuery 、executeUpdate、execute 1です。ResultSetexecuteQuery(String sqlString):データベースにクエリを実行してResultSetオブジェクトを返すSQLステートメントを実行します。
2. int executeUpdate(String sqlString):INSERT、UPDATE、またはDELETEステートメントと
SQLDDLステートメント(CREATETABLEやDROPTABLEなど)を実行するために使用されます。3。execute(sqlString):複数の結果セットと複数の更新を実行するために使用されます。カウントするステートメント、または2つの組み合わせ。

5.結果セットの処理
2つの状況があり
ます。1。更新が実行されると、この操作の影響を受けるレコードの数が返されます。
2.クエリを実行した結果がResultSetオブジェクトになります。
•ResultSetには、SQLステートメントの条件を満たすすべての行が含まれ、一連のgetメソッドを介してこれらの行のデータへのアクセスを提供します。
•ResultSetオブジェクトのアクセスメソッドを使用して、データを取得します。

6.閉じるデータベース接続
。•操作が完了した後は、すべての使用JDBCオブジェクトは、JDBCリソースを解放するために閉じなければならない決算の順序が宣言の順序の反対です:
1.最初近いrequestSet
2.次に近いのPreparedStatement
3 。最後に、接続オブジェクト接続を閉じます

フロントエンドからバックエンドに渡されるjsonデータ、バックエンドインターフェイスが受信するアノテーションの種類

@Pathvarible( "id"):URLの直後に渡されるパラメーターを受信するために使用されます(xxx.com/id=1)
@RequestParam( "id"):パラメーターとして渡されるパラメーターを受信するために使用されます(xxx.com?id= 1))

wait()とsleep()の違いは何ですか

1. wait()メソッドは、スレッドがwait()メソッドを実行すると、現在のロックを解放し、CPUを放棄して、待機状態に入るというものです。また、notify()メソッドまたはnotifyAll()メソッドを呼び出して、待機している他のスレッドに通知することができます。notify()メソッドは、1つのスレッド(待機キューの最初のスレッド)のみをウェイクアップし、ロックを取得できるようにします。notifyAll()メソッドは、このオブジェクトを待機しているすべてのスレッドをウェイクアップし、ロックを競合できるようにします。

2. sleep()メソッドはThreadクラスの静的メソッドであり、スレッドが自身のプロセスを制御するために使用します。このスレッドの実行を一定期間中断し、他のスレッドに実行の機会を与えます。 。タイマーが時間切れになると、このスレッドは自動的にウェイクアップします。

ロックメカニズムは異なります。どちらもスレッドの実行を一時停止させる方法です。sleep()メソッドの主な機能は、スレッドの実行を一定期間一時停止することであるため、時間切れになると自動的に再開され、スレッド間の通信は含まれません。したがって、sleep()メソッドを呼び出します。ロックを解除しません。wait()メソッドは異なります。wait()メソッドが呼び出されると、スレッドは占有していたロックを解放するため、スレッドが配置されているオブジェクト内の他の同期データを他のスレッドで使用できます。

使用領域が異なります。同期制御メソッドと同期コードブロックでwait()メソッドを使用する必要があり、sleep()メソッドはどこでも使用できます。sleep()メソッドは例外をキャッチする必要がありますが、wait()、notify()、notifyAll()は例外をキャッチする必要はありません。スリープの過程で、他のオブジェクトが彼のinterrupt()を呼び出し、InterruptedExceptionが発生する場合があります。スリープはロックフラグを解放しないため、デッドロックの問題が発生しやすくなります。したがって、一般的には、wait()メソッドを使用することをお勧めします。

コードブロックの実行順序

静的コードブロック->非静的コードブロック->コンストラクタ->通常コードブロック
静的コードブロックは、クラスのロード時に1回だけ実行され、非静的コードブロックは、クラスがロードされました。
コンストラクターは、オブジェクトが作成されたときの初期化の状態を定義するために使用されるクラスで使用されます。

ブラウザの入力URLとブラウザの応答の間で何が起こったのか

私たちは、URLの入力し、Enterキーを押します後、DNSサーバーがIP経由でこのURLを現在のURLを解決し、以下のようにIPの世話をするために、サーバへのTCP接続要求を開始するブラウザは、要求は、3ウェイハンドシェイクが含まれています。
二第一ハンドシェイク:リンクが確立されると、クライアントブラウザはsynパケットをサーバーに送信し、サーバーの確認を待ってSYS_SENT状態に入ります。

2番目のハンドシェイク:サーバーはsynパケットを受信した後、クライアントのsynを確認し、synとackの間でackパケットを送信する必要があります。このとき、サーバーはSYN_RECV状態になります。このとき、サーバーはクライアントを受信します。パッシブに開かれた後。Synとackの送信ステータス。

3番目のハンドシェイク:クライアントはサーバーからsyn + ackパケットを受信した後、確認応答パケットackをサーバーに送信します。パケットが送信された後、クライアントとサーバーはESTABLISHED(tcp接続成功)状態になり、3番目のハンドシェイクはハンドシェイクが完了しました。
スリーウェイハンドシェイクが終了すると、クライアントとサーバーが接続を確立します。このとき、tcpプロトコルが切断され、サーバーの下のデフォルトのindex.htmlページにアクセスし、アクセスしたリソースファイルを呼び出して表示します。対応するコンテンツ。

おすすめ

転載: blog.csdn.net/gsy_csdn1/article/details/114900349