Spring学習(八)Spring IoC容器原理分析


Springでは、IOCを通じて実装クラスやパラメータ情報などを対応するプロファイルに配置することができますが、実装クラスやパラメータ情報を変更する必要がある場合は、プロファイルを変更するだけで、あるオブジェクトに必要な他のオブジェクトを注入することもできます.
SpringのIOCの実現原理はJavaの反射メカニズムを利用しており、Springは工場の役割も果たしており、私たちは自分で工場クラスを構築する必要はありません.Springの工場クラスはプロファイルの読み取り、反射メカニズムでオブジェクトを注入するなどの作業を完了させ、beanの名前で対応するオブジェクトを取得することができます.
次に、SpringIoCコンテナの原理を説明するSpringのBeanファクトリクラスを作成します.
public class BeanFactory {

	private Map<String, Object> beanMap = new HashMap<String, Object>();

	/**
	 * bean      .
	 * 
	 * @param xml xml    
	 */
	public void init(String xml) {
		try {
			//1.         reader  
			SAXReader reader = new SAXReader();
            //2.              
			ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            //3. class        xml  
			InputStream ins = classLoader.getResourceAsStream(xml);
            Document doc = reader.read(ins);
            Element root = doc.getRootElement();
			Element foo;
			
			//4.  xml     Bean  
			for (Iterator i = root.elementIterator("bean"); i.hasNext();) {
				foo = (Element) i.next();
				
				//5.      Bean  ,  bean   id class
				Attribute id = foo.attribute("id");
				Attribute cls = foo.attribute("class");
				
				//6.  Java    ,  class     Class  
				Class bean = Class.forName(cls.getText());
				//7.    class   
				java.beans.BeanInfo info = java.beans.Introspector.getBeanInfo(bean);
				//8.       
				java.beans.PropertyDescriptor pd[] = info.getPropertyDescriptors();

				//9.      ,                 
				Object obj = bean.newInstance();
				
				//10.   bean property  
				for (Iterator ite = foo.elementIterator("property"); ite.hasNext();) {
					Element foo2 = (Element) ite.next();
					
					//11.   property name  
					Attribute name = foo2.attribute("name");
					String value = null;
					
					//12.   property    value  
					for (Iterator ite1 = foo2.elementIterator("value"); ite1.hasNext();) 
					{
						Element node = (Element) ite1.next();
						value = node.getText();
						break;
					}
					
					//13.  Java            set  ,        
					for (int k = 0; k < pd.length; k++) {
						if (pd[k].getName().equalsIgnoreCase(name.getText())) 
						{
							Method mSet = null;
							mSet = pd[k].getWriteMethod();
							mSet.invoke(obj, value);
						}
					}
				}

				//14.     beanMap ,  key id ,value   
				beanMap.put(id.getText(), obj);
			}
		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}

	/**
	 *   bean id  bean   .
	 * 
	 * @param beanName
	 *            bean id
	 * @return       
	 */
	public Object getBean(String beanName) {
		Object obj = beanMap.get(beanName);
		return obj;
	}

	/**
	 *     .
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		BeanFactory factory = new BeanFactory();
        factory.init("src/conf/config.xml");
        JavaBean javaBean = (JavaBean) factory.getBean("javaBean");
		System.out.println("userName=" + javaBean.getUserName());
		System.out.println("password=" + javaBean.getPassword());
	}
}