spring框架之工厂模式

package com.cy.factory;

import com.cy.dao.EmpDao;
import jdk.nashorn.internal.runtime.regexp.JoniRegExp;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/*
bean在计算机中,其实就是可重用的组件
 */
public class BeanFactory {
    static Properties prop = null;
    static {
        try {
            //使用类加载器获取文件
            // 回去类加载器,加载项目中所有的文件
            ClassLoader loader = BeanFactory.class.getClassLoader();
            InputStream in = loader.getResourceAsStream("config.properties");
            // 专门读取.properties配置文件的工具类
            prop = new Properties();
            //将配置文件转载到了prop工具类的对象中
            prop.load(in);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public static Object getBean(String key) throws Exception{
        Object obj = null;
        String value = prop.getProperty(key);
        //利用value这个全路径值,获取对应的实例对象
        Class<?> aClass = Class.forName(value);
        // 利用字节码对象创建实例对象
        obj = aClass.newInstance();

        return obj;
    }

    public static void main(String[] args) throws Exception {
        EmpDao empDao = (EmpDao) BeanFactory.getBean("EmpDao");
        System.out.println(empDao);
    }

}
package com.tedu.factory;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/*
 * 工厂类:专门用来创建对象的
 * Bean:计算机专有名词,可重用的组件
 * JavaBean:指的是java语言中可重用的组件
 * 		业务bean:用于处理业务逻辑的可重用组件
 * 		实体bean:用于封装数据的可重用组件
 * 工厂类代码编写思路:
 * (1)需要提供一个配置文件,起名(config.properties),在配置文件中,
 * 配置上要通过工厂创建的对象的内容:
 * 	key(唯一标识)=value(配置实现类的权限定类名)
 * (2)读取配置文件中的权限定类名,然后利用反射创建对象
 */
public class BeanFactory {
	//声明静态成员变量,要不然静态不能调用非静态
	private static Properties prop=null;
	static {//读取配置
		try {
			//1.读取config.properties配置文件
			//Properties是专门用于读取properties后缀文件的类
			prop = new Properties();
			//>>如果想要获取配置文件对象,需要使用类加载器
			//>>需要先获取BeanFactory类加载器
			ClassLoader classLoader = 
					BeanFactory.class.getClassLoader();
			//>>基于BeanFactory的类加载器加载config.properties
			//alt+shift+l
			InputStream in = 
					classLoader.getResourceAsStream("config.properties");
			//>读取配置文件
			prop.load(in);
			//2.根据key获取配置文件中的value
			//getProperty是根据指定的key获取配置文件的value
			//System.out.println(prop.getProperty("EmpService"));
			//System.out.println(prop.getProperty("EmpDao"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/*
	 * 调用getBean方法,可以去实例化我们指定的对象
	 * getBean需要我们提供配置文件中指定的key值,
	 * 可以给我们提供key所对应的value值,然后根据value值,
	 * 利用反射创建对象
	 */
	public static Object getBean(String key) {
		Object obj=null;
		try {
			//1.根据传进来的key获取到对应配置文件中的value值
			String value = prop.getProperty(key);
			//2.利用value来创建对应的字节码对象
			Class classObject = Class.forName(value);
			//3.使用字节码对象去实例化对象
			obj = classObject.newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return obj;
	}
}
posted @ 2022-11-14 21:39  竹石2020  阅读(44)  评论(0编辑  收藏  举报