Spring IoCに関する概念原理を簡単に理解する。


Spring IocはSpringフレームの基本です。ここではSpring Iocを簡単に紹介します。
Sprong Iocすなわち制御反転は、説明(javaではXMLまたは注釈)によって、第三者によって特定のオブジェクトを生成または取得する方法である。
Spring IoC容器
1、Spring IoC容器の設計
Spring IoC容器の設計は主にBeanFactoryとAppleication Contact textの二つのインターフェースに基づいています。その中でAppplication ContectはBenFactoryのサブインターフェースです。つまり、BeanFactoryはSpring IoC容器で定義されている最下層インターフェースであり、Application Contactはその高級インターフェースの一つであるため、後者はSpring IoC容器として使用されることが多い。
1.1 Class PathXml ApplicationContect
まず、アプリContectのサブクラスClass PathXml ApplitionConttextを紹介します。まず一つを作成します。xmlコードは以下の通りです。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
  <bean id="source" class="com.ssm.chapter.pojo.Source">
    <property name="fruit" value="  " />
    <property name="sugar" value="  " />
    <property name="size" value="  " />
  </bean>
  <bean id="juiceMaker" class="com.ssm.chapter.pojo.JuiceMaker" >
    <property name="beverageShop" value="  " />
    <property name="source" ref="source" />
  </bean>
  </beans>
ここで2つのbeanを定義しています。このようにSpring IoC容器は初期化時にそれらを見つけられます。そしてClass PathXml ApplicationConteet容器を使って初期化できます。コードリストは以下の通りです。

ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-cfg.xml");
    JuiceMaker juiceMaker = (JuiceMaker) ctx.getBean("juiceMaker");
    System.out.println(juiceMaker.makeJuice());
このように、Applicationの実現クラスClass PathXml ApplicationContectを使ってSpring IoCを初期化し、開発者はIoc容器を通じてリソースを取得することができます。
1.2 Spring Beanのライフサイクル
Spring IoC容器の本質はビーンを管理するためです。ライフサイクルは主にSpring IoC容器の初期化と破壊の過程を知るために、その学習を通じて、どのように初期と廃棄の時にカスタムの方法を加えて特定の需要を満たすかを知ることができます。注:Spring IoC容器の初期化と破壊の過程はここでは紹介しません。ネットで見つけやすいです。ここでは主にコードでライフサイクルを実現する過程です。
ライフサイクルのステップを知る以外に、ライフサイクルのインターフェースはどのように設定されているかを知るために、まずライフサイクルのステップを紹介します。
①BeanがインターフェースBenNameAwareを実現すれば、setBenNameメソッドを呼び出します。
②ビーンがインターフェースBenFactoryAwareを実現すると、set BenFactoryメソッドを呼び出します。
③BeanがインターフェースApplication ContactextAwareを実現し、Spring IoC容器もApplication Contectの一つの実現クラスである場合、setApplication Controtメソッドを呼び出します。
④BeanがインターフェースBenPostProcessorを実現すれば、postProcess Before Initiazation方法を呼び出します。
⑤ビーンがインターフェースBenFactoryPostProcessを実現すれば、afterPropertiessetメソッドを呼び出します。
⑥ビーンが初期化方法をカスタマイズすると、定義された初期化方法をそのまま使用します。
⑦BeanがインターフェースBenPostProcessorを実現すれば、postProcess After Initialization方法を呼び出し、その後このbeanは初期化が完了し、開発者はSpring IoCからBenのサービスを取得することができます。
⑧ビーンがインターフェースDispposable Beanを実現すれば、destroyの方法を呼び出します。
⑨カスタム破壊方法が定義されていると呼び出されます。
さらに、上記のほとんどのインターフェースは、単一のBeaビンについてのものである。BenPostProcessorインターフェースは、すべてのBeanに対してです。BeanPostProcessorインターフェースをテストするために、実現クラスを書くことができます。

package com.ssm.chapter.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class BeanPostProcessorImpl implements BeanPostProcessor {
  @Override
  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    System.out.println("[" + bean.getClass().getSimpleName() + "]  " + beanName + "     ");
    return bean;
  }

  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    System.out.println("[" + bean.getClass().getSimpleName() + "]  " + beanName + "     ");
    return bean;
  }
}
このようにBeanPostProcessorはコードで実現されます。彼はSpring IoC容器の中のBeanを全部処理します。
ライフサイクルの内容をよりよく示すために、上のコードのJuiice Maker類を修正します。

package com.ssm.chapter.pojo;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;


public class JuiceMaker implements BeanNameAware, BeanFactoryAware, ApplicationContextAware,
    InitializingBean, DisposableBean{

  private String beverageShop = null;

  private Source source = null;

  public String getBeverageShop() {
    return beverageShop;
  }

  public void setBeverageShop(String beverageShop) {
    this.beverageShop = beverageShop;
  }

  public Source getSource() {
    return source;
  }

  public void setSource(Source source) {
    this.source = source;
  }

  public void init() {
    System.out.println("[" + this.getClass().getSimpleName() + "]          ");
  }

  public void myDestroy() {
    System.out.println("[" + this.getClass().getSimpleName() + "]         ");
  }

  public String makeJuice() {
    String juice = "     " + beverageShop + "   ,   " + source.getSize() +source.getSugar() +
        source.getFruit();
    return juice;
  }

  @Override
  public void setBeanName(String name) {
    System.out.println("[" + this.getClass().getSimpleName() + "]  BeanNameAware   setBeanName  ");
  }

  @Override
  public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
    System.out.println("[" + this.getClass().getSimpleName() + "]  BeanFactoryAware   setBeanFactory  ");
  }

  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    System.out.println("[" + this.getClass().getSimpleName() + "]  ApplicationContextAware   setApplicationContext  ");
  }

  @Override
  public void destroy() throws Exception {
    System.out.println("[" + this.getClass().getSimpleName() + "]  DisposableBean   destroy  ");
  }

  @Override
  public void afterPropertiesSet() throws Exception {
    System.out.println("[" + this.getClass().getSimpleName() + "]  InitializingBean   afterPropertiesSet  ");
  }
}
このように、ライフサイクルを観察するためのライフサイクルの方法を実現しました。init方法はカスタム初期化方法であり、myDestroy方法はカスタム破壊方法であり、さらにこの2つのカスタム方法を使用するために、Benを記述する際にも、xmlでは次のように声明します。

<bean id="beanPostProcessor"
     class="com.ssm.chapter.bean.BeanPostProcessorImpl" />
  <bean id="source" class="com.ssm.chapter.pojo.Source">
    <property name="fruit" value="  " />
    <property name="sugar" value="  " />
    <property name="size" value="  " />
  </bean>
  <bean id="juiceMaker" class="com.ssm.chapter.pojo.JuiceMaker" init-method="init" destroy-method="myDestroy">
    <property name="beverageShop" value="  " />
    <property name="source" ref="source" />
  </bean>
ここでは、idをJuiice MakerのBeanと定義していますが、その属性init-menthはカスタム初期化方法であり、destroy-methodはカスタム廃棄方法です。以下はテストコードリストです。

 ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring-cfg.xml");
    JuiceMaker juiceMaker = (JuiceMaker) ctx.getBean("juiceMaker");
    System.out.println(juiceMaker.makeJuice());
    ctx.close();
ログは以下の通りです
[Source]対象のsourceを初期化します。
[Source]対象のsourceの実装が完了しました。
【Juiice Maker】BenNameAwareインターフェースを呼び出すsetBenName方法
[Juiice Maker]BenFactory Awareインターフェースを呼び出すset BenFactory方法
[Juiice Maker]Application Contect Awareインターフェースを呼び出すsetApple Controtext方法
[Juice Maker]オブジェクトjuice Makerを初期化します。
[Juiice Maker]InitializingBenインターフェースのafterPropertiessetメソッドを呼び出します。
[Juiice Maker]カスタム初期化方法を実行します。
【Juiice Maker】対象のjuice Makerを実例化しました。
これは貢茶飲料店から提供された大きいサイズのオレンジジュースです。
[Juiice Maker]DispsableBenインターフェースのdestroyメソッドを呼び出します。
[Juice Maker]カスタム廃棄方法を実行する
ログからはライフサイクルの方法が実行されていることが分かります。ビーンPostProcessorがターゲットとしているのは全部ビーンです。ビーンを初期化して廃棄する方法もカスタマイズできます。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。