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