工厂是干什么的?
在实际开发中我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的方法通过读取配置文件,把这些对象创建出来并存起来。在接下来使用的时候,直接拿过来用就好了。
那么这个读取配置文件,创建和获取三层对象的类就是工厂。
Bean工厂是干什么用的?创建service和dao对象。
怎么创建对象的?
第一步:需要一个配置文件来配置我们的service和dao
配置的内容:唯一标识=全限定类名(key=value)
第二步:通过读取配置文件中配置的内容,反射创建对象
我们的配置文件可以是xml也可以是properties
初级版本(配置文件使用properties)
由于是maven工程,在resources文件中新建一个配置文件,名字就叫做bean.properties
配置的内容:唯一标识=全限定类名(key=value)
例如:
bean.properties的内容
accountService=com.company.service.impl.AccountServiceImpl
accountDao=com.company.dao.impl.AccountDaoImpl
package com.company.factory;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* Bean对象实例化工厂
* 1.读取配置文件
* 2.获取类的全限定类名,利用反射实例化对象
*/
public class BeanFactory {
//定义一个Properties对象
private static Properties prop;
//使用静态代码块为Properties对象赋值
static {
try {
//实例化对象
prop=new Properties();
//获取Properties文件的流对象
InputStream inputStream=BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
//读取配置文件
prop.load(inputStream);
} catch (Exception e) {
//有异常就抛出,还可以抛出自定义异常
//throw new ExceptionInInitializerError("初始化properties失败!");
e.printStackTrace();
}
}
/**
* 传入要实例化的对象名称
* 获取类的全限定类名
* 利用反射实例化对象
*/
public static Object getBean(String beanName){
//定义一个Object类型的bean并完成初始化
Object bean = null;
//根据要实例化的对象名称,获取类的全限定类名beanPath
String beanPath = prop.getProperty(beanName);
//利用反射实例化对象
try {
bean = Class.forName(beanPath).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}
}
在main函数中测试每次循环模拟一个线程都会产生一个accountService对象,即多例。
public class WebClient { public static void main(String[] args) { for (int i = 0; i <5 ; i++) { IAccountService accountService =(IAccountService) BeanFactory.getBean("accountServie"); System.out.println(accountService); accountService.save(); } } }