インタビューの準備:Spring / Spring MVCの一般的なインタビューの質問の概要

1. Springフレームワークの利点は何ですか?

  1. 軽量:コードの汚染が極めて少ない、邪魔にならない設計
  2. SpringのDIメカニズムは、ビジネスオブジェクトの置き換えの複雑さを軽減し、コンポーネント間のデカップリングを改善し、統合を容易にし、Mybatis、Hibernate、Shiroなどの構成および単純なオブジェクトインジェクションを通じて他のフレームワークと統合できます...
  3. SpringのAOPサポートにより、セキュリティ、トランザクション、ログなどの一般的なタスクの集中管理が可能になり、再利用性が向上します
  4. SpringのORMおよびDAOは、サードパーティの永続層フレームワークとの良好な統合を提供し、基盤となるデータベースアクセスを簡素化します
  5. Springはアプリケーションを完全にSpringに依存させることはしません。開発者は、Springフレームワークの一部またはすべてを自由に選択できます。

2. AOPとは何ですか?

AOP:アスペクト指向プログラミングのためのアスペクト指向プログラミング。
「アスペクト」は、ビジネスに関係しないがビジネスモジュールによって通常呼び出されるロジックまたは責任をカプセル化することです。これは、システムの反復コードを減らし、モジュール間の結合を減らすのに便利です。これは、操作性と保守性に有益です。

3. AOPの実装方法は?Spring AOPはどのように実装されますか?

  • 静的AOP:

コンパイル中に、アスペクトはバイトコードの形式でターゲットバイトコードファイルに直接コンパイルされます。コンパイル中にAOPロジックをコードに織り込むには、専用のコンパイラーとウィーバーが必要です。

利点:織物クラスのパフォーマンスは影響を受けません。
短所:十分な柔軟性がない

  • 動的AOP(JDK動的プロキシ):

実行時に、ターゲットクラスが読み込まれた後、インターフェイスのプロキシクラスが動的に生成され、アスペクトがプロキシクラスに埋め込まれます。Javaは1.3から動的プロキシを導入しました実装の原則は、プロキシのビジネスインターフェースのプロキシクラスを生成し、 AOPロジックをプロキシクラスに書き込み、実行時に動的にAOPを織り込み、リフレクションを使用して織りロジックを実行することです。
主な実装は、java.lang.reflectパッケージのInvocationHandlerクラスとProxyクラスに依存します。

利点:Java標準ライブラリのネイティブサポート。使いやすく、追加のパッケージを参照する必要はありません。静的AOPよりも柔軟性があります。
短所:プロキシを含むクラスはインターフェースである必要があり、柔軟性が制限されます。リフレクションを使用すると、パフォーマンスに影響します。

  • 動的コードバイト生成(CGLib):

実行時、ターゲットクラスが読み込まれた後、バイトコードファイルが動的にビルドされ、ターゲットクラスのサブクラスが生成され、アスペクトロジックがサブクラスに追加されます。
CGLibは、動的コードバイト生成の実装です。これは、バイトコード生成ツールAsmをカプセル化します。原理は、操作中にターゲットバイトコードが読み込まれた後にターゲットクラスのサブクラスを生成し、アスペクトロジックをサブクラスに追加するため、Cglibを使用します。 AOPの実装には、インターフェイスベースのは必要ありません

利点:インターフェイスなしで織ることができ、高い柔軟性があります。
短所:拡張クラスのインスタンスメソッドがfinalの場合、それを織ることができません


Spring AOPのプロキシ使用ロジック:

  • ターゲットオブジェクトがインターフェイスを実装する場合、デフォルトでJDKの動的プロキシを使用してAOPを実装します。
  • ターゲットオブジェクトがインターフェイスを実装していない場合は、CGLIBライブラリが使用され、SpringはJDK動的プロキシとCGLIB動的プロキシの間で自動的に変換します。

4.動的プロキシを実装するには?

リファレンス:Javaデザインパターン-エージェントパターン

動的プロキシがインターフェースのみをサポートするのは、Javaが多重継承をサポートしていないためです。
具体的には、Proxyクラスの実装を確認できます

動的に生成されるプロキシクラスの継承図であり、プロキシと呼ばれる共通の親クラスを持つことになります。多重継承は基本的にJavaでは実行できないため、Javaの継承メカニズムにより、これらの動的プロキシクラスはクラスに動的プロキシを実装できなくなりました。

5. PageHelperはどのように実装されていますか?

PageHelperを理解するには、ソースコードを参照してください

6. IoCとは何ですか?DIとは

IoC、制御の反転。

制御の反転(IOC)は、従来はプログラムコードによって直接制御されていたオブジェクトの呼び出し権をコンテナーに渡し、コンテナーを介してオブジェクトコンポーネントをアセンブルおよび管理することです。

このようにして、オブジェクトは疎結合され、テストが容易で、機能的に再利用できるため(オブジェクトの作成とメモリの消費を抑えます)、プログラム構造全体の保守性、柔軟性、およびスケーラビリティが向上します。
利点:

  1. 依存性注入により、アプリケーションコードの量が削減されます。
  2. これにより、アプリケーションのテストが容易になり、単体テストでシングルトンやJNDIルックアップメカニズムが不要になります。
  3. 最小限のコストと最小限の侵入で疎結合が可能になります。
  4. IOCコンテナーは、サービスをロードする際のハングリースタイルの初期化と遅延ロードをサポートします。
  • Springは、アノテーション+ Javaコードの明示的な構成に基づくアノテーション構成に基づく
    XMLファイル構成に
    基づいてIoCコンテナー内のBeanを構成する3つの主要な方法を提供し
    ます

DI(依存性注入)依存性注入は、IoCコンテナーのアセンブリとオブジェクトの注入の方法です。

依存関係注入メカニズムにより、単純な構成で必要なリソースを注入して、リソースのソースや特定の実装を気にすることなく、独自のビジネスロジックを完了することができます。

DIインジェクションメソッド:
Springは、セッターインジェクションとコンストラクターインジェクションをサポートしています。通常、コンストラクターインジェクションは、必要な依存関係を注入するために使用されます。オプションの依存関係の場合は、セッターインジェクションの方が適しています。セッター注入では、オブジェクトを作成するために、クラスにパラメーターなしのコンストラクターまたはパラメーターなしの静的ファクトリーを提供する必要があります。

7. IoCはどのように機能しますか?

セクションアプリケーションコンテキストの初期化を参照してください

IoCの実現原理は、ファクトリーモードとリフレクションメカニズムです。

8.春の主要なモジュールは何ですか?

Springフレームワークの7つのモジュール

1. Spring Core
フレームワークの最も基本的な部分は、Beanを管理するためのIoCコンテナーを提供します。

2. Spring Context
は、Beanに基づくコンテキスト情報を提供し、JNDI、EJB、電子メール、国際化、検証、およびスケジューリング機能を拡張します。

3。Spring DAO
は、JDBCの抽象化レイヤーを提供します。これにより、長いJDBCコーディングとデータベースベンダー固有のエラーコードの解析が不要になり、宣言型トランザクション管理メソッドも提供されます。

4. Spring ORM
は、一般的に使用される「オブジェクト/関係」マッピングAPIの統合レイヤーを提供します。これらには、JPA、JDO、Hibernate、MyBatisなどが含まれます。

5. Spring AOP
は、AOP Alliance仕様に準拠するアスペクト指向のプログラミング実装を提供します。

6. Spring Web
は、他のWeb と統合できる基本的なWeb開発コンテキスト情報を提供します。

7. Spring Web MVC
は、Webアプリケーション用のModel-View-Controllerのフル機能の実装を提供します。

9.春の豆はスレッドセーフですか?

春は豆の糸の安全性を保証しません。
デフォルトのSpringコンテナのBeanはシングルトンです。シングルトンに競合状態がある場合、スレッドの安全性の問題があります。

10. SpringはいくつかのBeanのスコープをサポートしていますか?

  • シングルトン:シングルトンモード。SpringIoCコンテナ全体では、シングルトンで定義されたBeanのインスタンスは1つだけです。
  • プロトタイプ:プロトタイプモード。プロトタイプによって定義されたBeanがコンテナのgetbeanメソッドを通じて取得されるたびに(別のBeanに挿入するか、プログラムでコンテナのgetBean()メソッドを呼び出す)、新しいBeanインスタンスが生成されます。

リクエスト、セッション、およびグローバルセッションのスコープは、WebアプリケーションでSpringを使用する場合にのみ有効です。

  • request:HTTPリクエストごとに、requestで定義されたBeanが新しいインスタンスを生成します。つまり、各HTTPリクエストは異なるBeanインスタンスを生成します。
  • セッション:同じセッションがBeanインスタンスを共有します。
  • グローバルセッション:セッションのスコープとは異なり、すべてのセッションはBeanインスタンスを共有します。

11.スプリングmvc実行プロセス?

参照:DispatchServlet処理フロー
参照:Rest処理フロー

12. @RequestMappingの役割は何ですか?

@RequestMappingは、httpリクエストアドレスとControllerクラスのメソッド間のマッピングを識別するために使用されるアノテーションです。

13. @Autowiredの役割は何ですか?

@Autowiredは、クラスメンバー変数、メソッド、およびコンストラクターに注釈を付けることができる注釈であり、SpringがBeanの自動アセンブリを完了できるようにします。
@Autowiredはデフォルトでクラスによるマッチングになり、@ QualifierはBeanを名前でアセンブルすることを指定します。

14.スプリングブーツとは何ですか?なぜそれを使うのですか?

Spring Boot Springフレームワークに基づく迅速な開発統合パッケージ。
メリット:

コーディングがシンプルになる
構成がシンプルになる
デプロイメントがシンプルに
なるモニタリングがシンプルになる

15. Spring Bootのコア構成ファイルは何ですか?

Spring Bootには、アプリケーションファイルとブートストラップファイルの2種類の構成ファイル
があります。SpringBootは、これら2つのファイルをクラスパスに自動的にロードします。ファイル形式は、プロパティまたはymlです。

* .propertiesファイルはkey = valueの形式です
* .ymlはkey:valueの形式です:value
* .yml読み込まれたプロパティは正しいですが、@ PropertySourceアノテーションは構成をインポートするためにサポートされていません。ymlファイルを使用してより鮮やかに見えるようにすることをお勧めします

ブートストラップ構成ファイルはシステムレベルにあり、外部構成をロードするために使用されます。たとえば、構成センターの構成情報を使用して、変更されない属性を定義することもできます。bootstatpファイルは、アプリケーションファイルの前にロードされます。
アプリケーション構成ファイルはアプリケーションレベルです。現在のアプリケーションプロファイル

16.スプリングブートでホットデプロイメントを実現する方法は何ですか?

後で詳しく説明します。

17. Springの内部Beanとは何ですか?

Beanが別のBeanのプロパティとしてのみ使用される場合、そのBeanは内部Beanとして宣言できます。内部Beanは通常匿名であり、そのスコープは通常プロトタイプです。

など:

	<!-- 利用setter注入Dog -->  
    <bean id="d1" class="com.yang.Dog">  
        <property name="name" value="lala"></property>  
        <property name="age" value="9"></property>  
        <property name="style" value="Hashiqi"></property>  
    </bean>  
    <!--利用构造器注入person-->  
    <bean id="d2" class="com.yang.person">  
        <constructor-arg index="0" value="andreny"></constructor-arg>  
        <constructor-arg index="1" value="15454"></constructor-arg>  
        <constructor-arg index="2" value="teacher"></constructor-arg>  
    </bean>  
    
    <bean id="m1" class="com.yang.myshow">  
        <!--内部bean-->
        <property name="dog" ref="d1"></property>  
        <!--内部bean-->
        <property name="p" ref="d2"></property>  
    </bean>  

18. SpringフレームワークでのBeanのライフサイクルについて説明してください。

1. SpringコンテナがBeanの定義をXMLファイルから読み取り、Beanをインスタンス化します。
2. Springは、Bean定義に従ってすべての属性を設定します。
3. BeanがBeanNameAwareインターフェースを実装している場合、SpringはBean IDをsetBeanNameメソッドに渡します。
4. BeanがBeanFactoryAwareインターフェースを実装している場合、SpringはbeanfactoryをsetBeanFactoryメソッドに渡します。
5. Beanに関連付けられたBeanPostProcessorsがある場合、SpringはそれらをpostProcesserBeforeInitialization()メソッドで呼び出します。
6. BeanがIntializingBeanを実装している場合は、そのafterPropertySetメソッドを呼び出し、Beanが初期化メソッドを宣言している場合は、この初期化メソッドを呼び出します。
7. Beanに関連付けられたBeanPostProcessorsがある場合、これらのBeanのpostProcessAfterInitialization()メソッドが呼び出されます。
8. BeanがDisposableBeanを実装している場合、それはdestroy()メソッドを呼び出します。

19.春にアレイ/コレクションを注入する方法は?

Springは次の構成要素のコレクションを提供します。
<list>タイプは値のリストを挿入するために使用され、同じ値を許可します。
<set>タイプは値のセットを挿入するために使用され、同じ値を持つことはできません。
<map>タイプは、キーと値のペアのセットを挿入するために使用され、キーと値は任意のタイプにすることができます。
<props>タイプは、キーと値のペアのセットを挿入するために使用されます。キーと値のタイプはStringのみです。

<beans>
  <bean id="at" class="test.array.ArrayTest">
    <property name="names">
      <list>
        <value>aaa</value>
        <value>bbb</value>
      </list>
    </property>
  </bean>
</beans>

20. SpringでHttpSessionオブジェクトを取得するメソッドは何ですか?

	@RequestMapping("/session")
    public Map test(HttpSession session, String otherParam) {
        ...
    }

または

    @RequestMapping("/session")
    public String setSession(HttpServletRequest request, HttpServletResponse response){
        HttpSession session = request.getSession();
        ...
   }

21. ApplicationContextを実装する方法は何ですか?

達成するには、次の3つの方法があります。

1. FileSystemXmlApplicationContext:ファイルシステムからIoC構成ファイルを読み込みます
。2
. ClassPathXmlApplicationContext:ファイルシステムからIoC構成ファイルを読み込みます。3. WebXmlApplicationContext:WebApplicationContextUtilsから取得します

        //加载单个xml文件
        ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
        //加载多个xml文件
        String[] locations = new String[]{"bean1.xml", "bean2.xml", "bean3.xml"};
        ctx = new FileSystemXmlApplicationContext(locations);
 
        //加载单个xml文件
        ctx = new ClassPathXmlApplicationContext("bean.xml");
        //加载多个xml文件
        locations = new String[]{"bean1.xml", "bean2.xml", "bean3.xml"};
        ctx = new ClassPathXmlApplicationContext(locations);
 
        
        ServletContext servletContext = request.getSession().getServletContext();
        ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);

22. Springで使用されているデザインパターンは何ですか?

ファクトリーモード、シングルトンモード、プロキシモード、アダプターモード、オブザーバーモード...
参照:https://www.cnblogs.com/hwaggLee/p/4510687.html

23.いくつかのばねの自動組み立て方法を挙げてください。

依存関係の注入に自動アセンブリメソッドを使用するようにSpringコンテナーに指示するために使用できる5つの自動アセンブリメソッドがあります。
(1)no:デフォルトの方法では、自動アセンブリを実行せず、ref属性を明示的に設定してアセンブリを実行します。
(2)byName:パラメータ名を自動ワイヤリングすることにより、SpringコンテナはBeanのautowire属性が設定ファイルでbynameに設定されていることを検出し、コンテナはBean属性と同じ名前でBeanを照合、アセンブル、およびBeanしようとします。
(3)byType:パラメータタイプを自動ワイヤリングすることにより、Springコンテナは、構成ファイルでBeanのautowire属性がbyTypeに設定されていることを検出し、コンテナは一致、アセンブルを試み、Beanの属性は同じタイプのBeanになります。複数のBeanが条件を満たす場合、エラーがスローされます。
(4)コンストラクター:このメソッドはbyTypeに似ていますが、コンストラクターパラメーターに提供する必要があります。パラメーター付きの決定されたコンストラクターパラメータータイプがない場合は、例外がスローされます。
(5)自動検出:最初にコンストラクターを使用して自動的にアセンブルを試みます。機能しない場合は、byTypeメソッドを使用します。

元の記事を431件公開しました 賞賛されました329 170,000回

おすすめ

転載: blog.csdn.net/No_Game_No_Life_/article/details/105387969