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;
}
}