模拟spring底层,工厂模式解耦
DAO层
package com.guoy.factory.dao;
/**
* @author ShuaiGUO
*/
public interface TestDao {
/**
* 查找数据的方法
*/
void findData();
}
package com.guoy.factory.dao;
/**
* @author ShuaiGUO
*/
public class TestDaoImpl implements TestDao {
@Override
public void findData() {
System.out.println("成功查找出来了数据");
}
}
Service层
package com.guoy.factory.service;
/**
* @author ShuaiGUO
*/
public interface TestService {
/**
* 查找数据的方法
*/
void findData();
}
package com.guoy.factory.service;
import com.guoy.factory.BeanFactory;
import com.guoy.factory.dao.TestDao;
/**
* @author ShuaiGUO
*/
public class TestServiceImpl implements TestService {
@Override
public void findData() {
((TestDao) BeanFactory.getBean("testDao")).findData();
}
}
Servlet
package com.guoy.factory.servlet;
import com.guoy.factory.service.TestService;
import com.guoy.factory.BeanFactory;
/**
* @author ShuaiGUO
*/
public class TestServlet {
public void findData(){
((TestService) BeanFactory.getBean("testService")).findData();
}
}
BeanFactory
package com.guoy.factory;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
/**
* 模拟spring底层,工厂模式解耦
* @author ShuaiGUO
*/
public class BeanFactory {
//用于存放组建的实例
private static Map<String,Object> map;
//Properties也是map集合对象 配合流对象读取配置文件
private static Properties properties;
/**
* 将添加组件的过程放在静态代码块中,保证组件是单例的
*/
static {
//初始化map集合的实例
map = new HashMap<>();
//初始化properties的实例
properties = new Properties();
try {
//创建流对象
FileReader fileReader = new FileReader("beans.properties");
//读取配置文件中的数据,装载进集合
properties.load(fileReader);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//获取配置文件中所有的key
Enumeration<Object> keys = properties.keys();
/**
*遍历所有的key
* keys.hasMoreElements判断是否存在下个数据
*/
while (keys.hasMoreElements()){
//获取所有key的object
Object obj = keys.nextElement();
//转换为string类型
String key = obj.toString();
//根据key获取value,返回的是value,也就是我们想要的className
String className = properties.getProperty(key);
try {
//根据反射创建字节码对象
Class aClass = Class.forName(className);
//创建实例对象
Object object = aClass.newInstance();
//将创建出来的实例,添加到map集合中
map.put(key,object);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
/**
* 根据全局表示,获取实例
* @param className 全局表示
* @return
*/
public static Object getBean(String className){
//从map集合中获取实例
return map.get(className);
}
}
beans.propertoies
testDao = com.guoy.factory.dao.TestDaoImpl
testService = com.guoy.factory.service.TestServiceImpl
testServlet = com.guoy.factory.servlet.TestServlet
Test
package com.guoy.factory;
import com.guoy.factory.servlet.TestServlet;
public class Test {
public static void main(String[] args) {
//从工厂中获取表现层的实例
TestServlet testServlet = (TestServlet) BeanFactory.getBean("testServlet");
testServlet.findData();
}
}
输出结果:
成功查找出来了数据