IoCとスプリングが提供するIoC容器


1. Inversion of Control or DI(Dependency Injection)


IoCまたはDIの基本概念は「制御権逆転」である.
一般的に、依存性を解決する方法は、自分が使う依存性を自分で創造し、使用することである.つまり、自分は依存性に対する制御権を持っている.
class OwnerController {
   private OwnerRepository repository = new OwnerRepository();
}
しかし、依存性に対する制御権は逆転し、依存性はあるものの、自ら創造したものではない.そのため、依存性に対する制御権は自分ではなく、外部にある.そのため、制御権が逆転したと言える.
class OwnerController {
   private OwnerRepository repo;

   public OwnerController(OwnerRepository repo) {
       this.repo = repo;
   } 

   // repo를 사용합니다.
}
上記の例では、所有者コントローラ以外に依存性を注入する人がいます.この例では、ジェネレータによって依存性が取得されます.したがって,依存独立性(DI)は独立制御(IOC)としても考えられる.

2.スプリングが提供するIoCコンテナ(アプリケーションコンテキスト、BeanFactory)


フレームワークは制御逆転概念を応用する代表的な技術である.フレームワークは、予め作成されたブランクのセットや拡張可能な抽象ライブラリの準備だけではありません.ライブラリのアプリケーションコードを使用して、アプリケーションフローを直接制御します.
逆に、フレームワークは逆にアプリケーションコードを使用します.通常、開発したクラスをフレームワークに登録し、フレームワークがフローを主導する過程で開発者が作成するアプリケーションコードを使用する方法です.

スプリングIoCコンテナの主な機能は、「空の作成、編み込み、空の提供」(空の作成、空の注入の依存性、空のスキャンの管理)です.ここで、빈(bean)とはIoC 컨테이너가 관리하는 객체である.
すべてのオブジェクトがスプリングコンテナで管理されているわけではありません.空の登録は次の方法で行います.
  • Component Scanning
    - @Component
    - @Repository
    - @Service
    - @Controller
    - @Configuration
    (@Componentメタ宣言付き注記付きオブジェクトを登録)
  • またはXMLまたはJavaプロファイル(@Configuration+@Bean)に直接登録する
  • また、アイドルには以下の設定値があります.
    空の設定
  • 名またはID
  • タイプ
  • スコフ
  • また,登録したスペースを取り出して使用する方法(依存注入使用)は以下の通りである.
  • @Autowiredまたは@Inject
  • ApplicationContextからgetBean()に直接ポップアップ
    では、どのようにして必要な依存性を得るのでしょうか.つまり、@Autowired/@Injectをどこに貼り付けますか?
  • ジェネレータ
  • フィールド
  • Setter
  • このうちSpringフレームワーク研究レポートで推奨される方法は「作成者」です.これは、使用するパラメータがない場合、インスタンスを強制的に作成できるためです.残りのフィールドまたはSetter Injectionでは、これらの依存項目を必要とせずにインスタンスを作成できます.ただし、A参照Bについては、B参照Aのループ参照は、コンストラクション関数内射でインスタンスを作成することはできないため、まずインスタンスを作成して依存性を注入する必要があるため、フィールド内射またはSetter内射を使用する必要がある.
    また、スプリングIoC容器は「空」のみに依存して注入される.

    1. ApplicationContext

    ApplicationContextはスプリングアプリケーション内の中央インタフェースであり、アプリケーションに구성 정보を提供する.
    以下はSpring公式ドキュメントのApplicationContextが提供する機能です.
  • アプリケーションコンポーネントにアクセスするためのbeanファクトリメソッド
  • は、ファイルリソース
  • の通常のロードをサポートする.
  • 登録されたリスナーにイベントを発行するための機能
  • .
  • メッセージを分析して国際化
  • をサポートする
  • 親コンテキストから
  • を継承

    ( https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/ApplicationContext.html )
    特に、ApplicationContextが提供する機能の1つとして、「セーフティファクトリ」という方法があります.つまり、ApplicationContextはBenFactoryを継承している.

    2. BeanFactory

    BeanFactory애플리케이션 컴포넌트의 중앙 저장소であり、空構成ソースから空の定義を読み出し、構築し、空を提供する機能を有する.
    Springの公式ドキュメントを参照してください.BeanFactoryの役割について詳しく説明します.
    SpringBeanコンテナにアクセスするためのルートインタフェース.
    このインタフェースは、複数のbean定義を有するオブジェクトによって実現され、各オブジェクトは1つの文字列名によって一意に識別される.빈 정의에 따라 팩토리는 포함된 객체의 독립 인스턴스 (Prototype 디자인 패턴) 또는 단일 공유 인스턴스 (인스턴스가 범위의 싱글톤인 Singleton 디자인 패턴의 우수한 대안)를 반환한다.が返すインスタンスタイプはbeanファクトリ構成に依存する.Spring 2.0からは、Web環境の「要求」や「セッション」の範囲など、特定のアプリケーションコンテキストに応じて他の範囲を使用できます.
    通常、setterまたはジェネレータでアプリケーション・オブジェクトを構成する場合は、beanfactoryクエリーなどのpull構成フォーマットを使用するよりも、push構成(push構成)に依存することが望ましい.Spring의 Dependency Injection 기능은 이 BeanFactory 인터페이스와 하위 인터페이스를 사용하여 구현된다.この方法の要点は、アプリケーション・コンポーネントの構成(たとえば、単一のオブジェクトがプロパティ・ファイルを読み込む必要がなくなった)を一元化したBeanFactory가 애플리케이션 구성 요소의 중앙 레지스트리です.
    通常、BeanFactoryは、XMLドキュメントなどの構成ソースに格納されているbean定義をロードして整理します.springframework.beansパッケージを使用してbeanを構成します.しかしながら、実装は、Javaコードから直接生成されたJavaオブジェクトを必要に応じて簡単に返すことができる.LDAP、RDBMS、XML、プロパティファイルなど、定義を格納する方法には制約はありません.サポートbean間の参照(注入依存関係)を実施することを提案する.
    空工場の実施は、できるだけ標準빈 라이프 사이클 인터페이스をサポートしなければならない.初期化方法全体と標準手順は次のとおりです.
    空の工場ライフサイクルインタフェースと方法
  • BeanName
  • BeanClassLoaderAwareのsetBeanClassLoader
  • BeanFactoryAwareでの設定BeanFactory
  • EnvironmentAwareのsetEnvironment
  • EmbeddedValue Resolver AwareのsetEmbeddedValue Resolver
  • ResourceLoaderソフトウェア設定ResourceLoader(アプリケーションコンテキストでのみ実行)
  • アプリケーションEventPublisherソフトウェア設定アプリケーションEventPublisher(アプリケーションコンテキストでのみ実行)
  • メッセージソースソフトウェア設定メッセージソース(アプリケーションコンテキストでのみ実行)
  • A p l i c a tionContextAware setApplicationContext(アプリケーションコンテキストでのみ実行)
  • サーブレットContextAware SetサーブレットContext(Webアプリケーションコンテキストでのみ実行)
  • BeanPostProcessorの後処理前初期化方法
  • InitializingBeanのafterProperties Set
  • カスタムinit-method定義
  • BeanPostProcessorの後処理AfterInitialization方法
  • beanファクトリの終了時に、次のライフサイクルメソッドを適用します.
  • 設計AwareBeanPostProcessorの後処理前設計方法
  • DisposableBeanのdestroy
  • カスタムdestroy-メソッド定義

  • ( https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/BeanFactory.html )
    リファレンス
  • インフラストラクチャ:例示的な学習スプリングフレーム入門(ホワイトベースライン)
  • https://martinfowler.com/articles/injection.html
  • https://github.com/spring-guides/understanding/tree/master/application-context
  • https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/BeanFactory.html
  • https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/ApplicationContext.html
  • https://scshim.tistory.com/32