工厂是干什么的?
在实际开发中我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的方法通过读取配置文件,把这些对象创建出来并存起来。在接下来使用的时候,直接拿过来用就好了。
那么这个读取配置文件,创建和获取三层对象的类就是工厂。
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();
}
}
}