java进阶之:spring容器模拟与IOC概念

说明

该BeanFactory演示了从配置文件中读取key-value形式的bean对象,放入容器中,并在每回需要用到的时候通过getBean方法获取对象。

IOC概念

IOC = inversion of controll,把创建对象的权力交给框架(在spring框架中交给spring容器),是框架的重要特征,并非面向对象的专用术语。包括依赖注入(depedency injection, DI)和依赖查找。

&&& 传统的APP需要用到对象实例,就new一下;
&&& 而spring框架,把这种创建对象的方式交给某个BeanFactory来控制。BeanFactory一方面控制资源,一方面提供资源。

import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * Bean:可重用组件
 * JavaBean:用java语言编写的可重用组件
 * JavaBean > 实体类
 *
 * 1、需要一个配置子文件来配置service和dao
 * 配置的内容:唯一标识=全限定类名(key=value)
 * 2、通过读取配置文件中的内容,反射创建对象
 */

public class BeanFactory {
     private static Properties properties;

     //定义一个Map,用于存放我们要创建的对象,我们把它称为容器
    private static Map<String, Object> beans;

     static {
         try {
             //实例化对象
             properties = new Properties();
             //获取properties文件的流对象
             InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
             properties.load(in);
             //实例化容器
             beans = new HashMap<String, Object>();
             //取出配置文件中的所有keys
             Enumeration keys = properties.keys();
             while (keys.hasMoreElements()){
                 //取出每个key
                 String key = keys.nextElement().toString();
                 //根据key获取properties文件的value
                 String beanPath = properties.getProperty(key);
                 //反射创建对象
                 Object value = Class.forName(beanPath).newInstance();
                 beans.put(key,value);
             }
             properties.load(in);
         } catch (Exception e) {
             throw new ExceptionInInitializerError("初始化properties失败");
         }
     }

     public static Object getBean(String beanName) {
         return beans.get(beanName);
     }
}

你可能感兴趣的:(java)