神へのジャワの道:ジャワのインタビューの準備(13)

3、Springフレームワーク

1.春とは

Springは、ビジネスロジックとエンタープライズレベルのアプリケーション開発の他のレイヤーの結合問題を解決し、開発を簡素化することを目的として、RodJohnsonによって最初に作成された軽量のJava開発フレームワークです。

2.Springフレームワークを使用する利点は何ですか

3. Springフレームワークの設計目標、設計哲学、およびコアは何ですか?

** Springの設計目標:** Springは、開発者にワンストップの軽量アプリケーション開発プラットフォームを提供します

Springの設計哲学: JavaEEの開発では、POJOおよびJavaBean開発メソッドをサポートし、アプリケーションをインターフェース指向の開発にし、OO(オブジェクト指向)設計メソッドを完全にサポートします。SpringはIoCコンテナーを介してオブジェクト結合関係の管理を実装します。依存関係の反転を実現します。オブジェクト間の依存関係は、デカップリングを実現するためにIoCコンテナに渡されます。

Springフレームワークのコア:IOCコンテナーとAOPモジュール。IOCコンテナを介してpojoオブジェクトとそれらの結合関係を管理し、AOPを介して動的プロキシ方式でサービスを強化します

IOCは、協調するコンポーネントを疎結合に保ちますが、AOPプログラミングでは、アプリケーションのすべてのレイヤーに分散している関数を分離して、再利用可能な関数型コンポーネントを形成できます。

4.春の長所と短所

利点:

  • デカップリングを容易にし、開発を簡素化します。Springは、すべてのオブジェクトの作成と依存関係の保守を管理のためにSpringに委任できる大規模なファクトリです。
  • AOPプログラミングのサポート。Springはアスペクト指向プログラミングを提供し、プログラムによるパーミッションのインターセプト、操作の監視などの機能を便利に実装できます。
  • 宣言型トランザクションのサポート。手動プログラミングなしで、物事の管理を完了するように構成する必要があるだけです
  • プログラムのテストに便利なSpringはJunit4をサポートしており、アノテーションを使用してSpringプログラムを簡単にテストできます。
  • さまざまな優れたフレームワークの便利な統合であるSpringは、さまざまな優れたオープンソースフレームワークを排除せず、さまざまな優れたフレームワークを内部で直接サポートします。
  • JavaEEAPIの使用の難しさを軽減します

短所:

  • 春は反射に依存し、反射はパフォーマンスに影響します
  • 使用するための高い障壁
  • その他の構成

5.Springフレームワークで使用されているデザインパターン

1.ファクトリモード:BeanFactoryは、オブジェクトのインスタンスを作成するために使用される単純なファクトリモードの実施形態です。

2.シングルトンモード:Beanのデフォルトはシングルトンモードです

3.プロキシモード:SpringAop関数は、JDK動的プロキシとCGLIBバイトコード生成テクノロジを使用します

4.テンプレートメソッドモード:RestTemplate、JmsTemplateなどのコード重複の問題を解決するために使用されます

5.オブザーバーモード:オブジェクトキーへの1対多の依存関係を定義します。オブジェクトの状態が変化すると、Spring-ApplicationListenerでのリスナーの実装など、オブジェクトに依存するすべてのオブジェクトがブレーキによって通知および更新されます。

6.SpringIOCコンテナとは

制御の反転はIoC(制御の反転)であり、これは従来プログラムコードによって直接操作されていたオブジェクトの呼び出し権をコンテナに転送し、オブジェクトコンポーネントのアセンブリと管理はコンテナを介して実現されます。いわゆる「制御の反転」の概念は、プログラムコード自体から外部コンテナへのコンポーネントオブジェクトに対する制御の転送です。

Spring IOCは、オブジェクトの作成、オブジェクトの管理(依存性注入(DI)、オブジェクトのアセンブル、オブジェクトの構成、およびこれらのオブジェクトのライフサイクル全体の管理)を担当します。

7.IOCの利点

  • IOCまたは依存性注入により、アプリケーションコードの量が最小限に抑えられます
  • これにより、アプリケーションのテストが容易になり、単体テストでシングルトンおよびJNDIルックアップメカニズムが不要になります。
  • 最小限のコストと最小限の侵入により、疎結合が可能になります
  • IOCコンテナーは、サービスをロードするときに、空腹の初期化と遅延ロードをサポートします

8. SpringIOCの実装メカニズム

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

interface Fruit {
    
    
   public abstract void eat();
 }

class Apple implements Fruit {
    
    
    public void eat(){
    
    
        System.out.println("Apple");
    }
}

class Orange implements Fruit {
    
    
    public void eat(){
    
    
        System.out.println("Orange");
    }
}

class Factory {
    
    
    public static Fruit getInstance(String ClassName) {
    
    
        Fruit f=null;
        try {
    
    
            f=(Fruit)Class.forName(ClassName).newInstance();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return f;
    }
}

class Client {
    
    
    public static void main(String[] a) {
    
    
        Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple");
        if(f!=null){
    
    
            f.eat();
        }
    }
}

9.BeanFactoryとApplicationContextの違いは何ですか

BeanFactoryとApplicationContextはSpringの2つのコア・インターフェースであり、どちらもSpringコンテナーとして使用できます。ApplicationContextは、BeanFactoryのサブインターフェースです。

依存

BeanFactory:Springで最も低いインターフェースであり、さまざまなBeanの定義が含まれ、Bean構成ドキュメントを読み取り、Beanのロードとインスタンス化を管理し、Beanのライフサイクルを制御し、Bean間の依存関係を維持します。

BeanFactoryの派生として、ApplicationContextインターフェースは、BeanFactoryの機能を提供するだけでなく、より完全なフレームワーク関数も提供します。

  • MessageSourceを継承するため、国際化をサポートします。
  • 統合リソースファイルのアクセス方法。
  • Beanをリスナーに登録するためのイベントを提供します。
  • 複数の構成ファイルを同時にロードします。
  • 複数の(継承された)コンテキストをロードして、各コンテキストがアプリケーションのWebレイヤーなどの特定のレベルに焦点を合わせるようにします。

読み込み方法

BeanFactroyは、遅延読み込みを使用してBeanを注入します。つまり、Beanが使用されている場合(getBean()が呼び出された場合)にのみ、Beanが読み込まれてインスタンス化されます。このように、いくつかの既存のSpring構成の問題を見つけることができません。Beanの特定の属性が注入されていない場合、BeanFacotryがロードされた後、getBeanメソッドが最初に呼び出されるまで例外はスローされません。

ApplicationContext。コンテナの起動時にすべてのBeanを一度に作成します。このようにして、コンテナーの起動時に、Springで構成エラーを見つけることができます。これは、依存するプロパティーが注入されているかどうかを確認するのに役立ちます。ApplicationContextの開始後、すべてのシングルインスタンスBeanがプリロードされます。シングルインスタンスBeanをプリロードすることで、必要なときに、すでに作成されているために待つ必要がないようにすることができます。

基本的なBeanFactoryと比較すると、ApplicationContextの唯一の欠点はメモリスペースです。アプリケーション構成Beanが多いと、プログラムの起動が遅くなります。

メソッドの作成

BeanFactoryは通常プログラムで作成されますが、ApplicationContextは、ContextLoaderを使用するなど、宣言的な方法で作成することもできます。

登録する方法

BeanFactoryとApplicationContextはどちらもBeanPostProcessorとBeanFactoryPostProcessorの使用をサポートしていますが、両者の違いは次のとおりです。BeanFactoryは手動で登録する必要がありますが、ApplicationContextは自動的に登録されます。

10.ApplicationContextの通常の実装は何ですか

FileSystemXmlApplicationContext:このコンテナーはXMLファイルからBeanの定義をロードし、XMLBean構成ファイルのフルパス名をそのコンストラクターに提供する必要があります。

ClassPathXmlApplicationContext:このコンテナはXMLファイルからBeanの定義もロードします。このコンテナはクラスパスでBean構成を検出するため、ここではクラスパスを正しく設定する必要があります。

WebXmlApplicationContext:このコンテナは、WEBアプリケーションのすべてのBeanを定義するXMLファイルをロードします。

11.SpringでサポートされているいくつかのBeanのスコープ

  • シングルトン:Beanには各SpringIOCコンテナに1つのインスタンスしかありません
  • プロトタイプ:Bean定義は複数のインスタンスを持つことができます
  • リクエスト:各httpリクエストはBeanを作成します。スコープは、WebベースのSpringApplicationContextのコンテキストでのみ有効です。
  • セッション:httpセッションでは、Bean定義はインスタンスに対応し、スコープはWebベースのSpringApplicationContextのコンテキストでのみ有効です。
  • global-session:グローバルHttpセッションでは、Bean定義はインスタンスに対応し、スコープはWebベースのSpringApplicationContextのコンテキストでのみ有効です。

12. SpringフレームワークスレッドのシングルトンBeanは安全ですか?

いいえ、SpringフレームワークのシングルトンBeanはスレッドセーフではありません。

SpringのBeanはデフォルトでシングルトンモードであり、SpringフレームワークはシングルトンBeanを複数のスレッドにカプセル化しません。

実際、ほとんどの場合、SpringBeanはステートレスであるため、ある程度はBeanも安全ですが、Beanがステートフルである場合、開発者はスレッドの安全性を確保する必要があります。最も簡単な方法はBeanを変更することです。 「シングルトン」のスコープがプロトタイプに変更され、リクエストBeanがnew Bean()と同等になるため、スレッドセーフが保証されます。

  • ステートフル、データストレージ機能を指します
  • ステートレス、つまりデータは保存されません

13.Springはスレッドの並行性の問題にどのように対処しますか

一般に、マルチスレッド環境で共有できるのはステートレスBeanのみです。SpringではThreadLocalを使用して一部のBeanの非スレッドセーフ状態を処理するため、SpringではほとんどのBeanをシングルトンスコープとして宣言できます。スレッドセーフの問題を解決します。

ThreadLocalとスレッド同期メカニズムはどちらも、複数のスレッドで同じ変数のアクセス競合の問題を解決するためのものです。同期メカニズムは「スペースの時間」アプローチを採用し、1つの変数のみを提供します。異なるスレッドは、それらにアクセスする前にロックを取得する必要があり、ロックを取得していないスレッドはキューに入れる必要があります。そして、ThreadLocalは「時間のためのスペース」アプローチを使用します。

ThreadLocalは、スレッドごとに独立した変数コピーを提供するため、複数のスレッドのデータアクセスの競合を分離できます。各スレッドには変数の独自のコピーがあるため、変数を同期する必要はありません。ThreadLocalは、スレッドセーフな共有オブジェクトを提供します。マルチスレッドコードを作成する場合、安全でない変数をThreadLocalにカプセル化できます。

14.AOPとは

AOPアスペクト指向プログラミングは、従来のOOPを補完します。OOPでは、クラスを基本単位として使用しますが、AOPの基本単位はアスペクトです。AOPを実現するための鍵はプロキシモードにあります。AOPプロキシは主に静的プロキシと動的プロキシに分けられます。

1. AspectJは静的プロキシの拡張です。AOPプロキシクラスはコンパイルフェーズで生成されるため、コンパイル時の拡張とも呼ばれます。コンパイルフェーズでAspectJをjavaバイトコードに織り込みます。

2. SpringAOPで使用される動的プロキシ動的プロキシはバイトコードを変更しませんが、実行するたびにメモリ内に一時的にAOPオブジェクトを生成します。このAOPオブジェクトには、ターゲットオブジェクトのすべてのメソッドが含まれ、特定のカットポイントにあります。 。拡張

15. SpringAOPの最下層は何ですか?

SpringAOPの最下層は、動的プロキシに基づいて実装されています。動的プロキシには、JDKに基づく動的プロキシとcglibに基づく動的プロキシの2種類があります。Spring AOPではデフォルトの動的プロキシモードは選択されていませんが、プロキシされるオブジェクトがクラスであるかインターフェイスであるかに基づいています。

インターフェイスの場合はJDKの動的プロキシが使用され、クラスの場合はcglibの動的プロキシが使用されます。

16. Springコンテナのメタデータを設定するにはどうすればよいですか?(つまり、Beanを作成することです)

1.XML構成ファイルに基づく

<!-- id可以理解为对象名 -->
<bean id="" class="">
</bean>

2.注釈ベースの構成

@Controller
@Service
@Resposity

//开启注解配置
<context: annotation-config/>

3.Javaベースの構成

@Confirguration@Bean搭配使用

17.依存性注入のいくつかの方法

依存性注入は、実際にはオブジェクトの属性値に初期値を割り当てることです。

xml構成ファイルに基づく実装

1.コンストラクター注入

2.セッターインジェクション

3.インターフェースインジェクション

18. @ Requiredアノテーションの使用方法

@Requiredは、beanプロパティのsetterメソッドを適用します。このアノテーションは、フィールドの属性値に例外がスローされる必要があることを示しています。

19、@ Autowired、@ Resource、@ Qualifier

@Autowired、タイプに応じた自動組み立て

@Resourcee、名前に従って自動的にアセンブルし、次にタイプに従ってアセンブルします

@Qualifier、同じタイプのBeanが複数あり、属性を使用してBeanの1つだけをアセンブルする場合は、@ Qualifierアノテーションと@Autowiredアノテーションを一緒に使用できます。

20、BeanFactoryとFactoryBeanの違い

BeanFactoryはファクトリ、つまりIOCコンテナまたはオブジェクトファクトリであり、FactoryBeanはBeanです。Springでは、すべてのBeanがBeanFactory(つまり、IOCコンテナー)によって管理されます。ただし、FactoryBeanの場合、このBeanは単純なBeanではなく、オブジェクト生成を生成または変更できるファクトリBeanです。その実装は、デザインパターンのファクトリパターンおよびデコレータパターンに似ています。

21.春の豆の組み立てのプロセス

おすすめ

転載: blog.csdn.net/weixin_54707168/article/details/113976977