ioc実践


Spring ioc inversion of control. Springの反転制御はspringのすべてのフレームワークの実装コアであり、フレームワークとクラス依存のデカップリングに対して、エンティティ間には対応する参照がなくなり、インタフェースで定義し、実行時/起動時に対応する実装クラスをロードするだけでよいという新しい考え方を提供しています.目標:1、解結合、プログラムの複雑さを簡略化し、クラスライブラリパッケージではなくフレームワークに依存させる.2、性能を向上させ、単一のbeanの実現により、サンプルの作成と消滅の性能オーバーヘッドを大幅に削減した.3、開発を簡素化し、開発効率を高める4、コード多重率を高めるoo設計思想5を十分に使用し、コードの移植性を高める.構想:1、beanの管理外化、javacode以外の方式で配置を行い、オプションの方式は:属性ファイル、xml、注釈、ejbのjarパケットまたはwarパケット、データベースなどがある.2、beanの作成はrtパケット中のbeanパケットに依存してもよいし、自分の個性によって実現してもよい.基本的には反射によって実現されるjdkエージェントとcglibエージェントである.3、beanのストレージは1つのmapで、keyはbeanのnameで、valueはbeanのインスタンスで、プログラムの実行時には読み取り専用のmapなので、スレッドの安全問題は存在せず、hashmapで直接実現することができる.
BeanContainer:
public class BeanContainer {
private static final BeanContainer 	container1 = new  BeanContainer();
private final Map container;

private  BeanContainer(){
    this.container = new HashMap();
}

/**
 *     ,       
 * @return
 */
public static  BeanContainer getIntance(){
    return container1;
}

/**
 *   bean ,        ,       
 * @param name
 * @param bean
 * @return
 */
public Object addBean(String name , Object bean){
    container.put(name,bean);
    return bean;
}

/**
 *   bean, ioc        
 * @param name
 * @return
 */
public Object getBean(String name){
  Object obj =   container.get(name);
    return obj;
}

public Object removeBean(String name){
    return container.remove(name);
}

}

BeanCreator:
public class BeanCreator {

private ClassLoader classLoader = ClassLoader.getSystemClassLoader();

/**
 *           ,              ,       classload   
 * @param path
 * @return
 * @throws ClassNotFoundException
 * @throws IllegalAccessException
 * @throws InstantiationException
 */
public Object createBean(String path) throws ClassNotFoundException, IllegalAccessException, InstantiationException {

    Object obj =  classLoader.loadClass(path).newInstance();
    return obj;

}
}

BeanManager:
public class BeanManager {
/**
 *  bean         ,      propeerties,           
 * @return
 * @throws IOException
 */
public Properties getProperties() throws IOException {
    FileInputStream fis = new FileInputStream("eureka-server\\src\\test\\java\\com\\example\\ioc\\test.properties");
    Properties props = new Properties();
    props.load(fis);
    return props;
}

/**
 *         bean,    
 * @throws IOException
 * @throws IllegalAccessException
 * @throws InstantiationException
 * @throws ClassNotFoundException
 */
public void loadBean() throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException {
    BeanContainer container = BeanContainer.getIntance();
    BeanCreator creator = new BeanCreator();
    Properties props = getProperties();
    container.addBean(props.getProperty("name"),creator.createBean(props.getProperty("path")));
	}

}

test.properties:
name=testbean
path=com.example.ioc.TestBean

テストクラス:
BeanManager manager = new BeanManager();
    BeanContainer container = BeanContainer.getIntance();
    try {
        manager.loadBean();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    TestBean bean = (TestBean).getBean("testbean");
    bean.test();

上記の例から、すべてのbeanロードはフレームワークで完了しており、getbeanメソッドを使用するだけでインスタンスが得られるため、全体が単一の例のプロセスであることがわかります.後で、単一インスタンスやマルチインスタンス切り替えなどの怠け者ロードなどのオプションを豊富にすることもできます.これらはcreatebeanの実装を変更することで実現できます.簡単に言えば、以上の例はooの設計思想を示していないが、簡単な実現過程全体を説明しただけで、設計上、iocはインタフェースを組み合わせた方式を使用して、全体のフレームワークをより柔軟に多変させ、基礎フレームワークの拡張に適応することができる.