Java工廠模式解耦 —— 理解Spring IOC
最近看到一個很好的思想來理解Spring IOC,故記錄下來。
資源獲取方式
-
主動式:(要什么資源都自己創建)
-
被動式:(資源的獲取不是我們創建,而是交給一個容器來創建和設置)
工廠模式獲取資源
主要思想:
- 使用工廠模式以及Java反射機制來獲取資源(類)。
- 使用容器(Map)來存儲所有資源,當需要的時候由工廠從容器中取出。
- 使用讀取配置文件的方式向容器中注入組件(類)。
作用:
- 降低組件之間的耦合性。
代碼
com.lin.dao下:
package com.lin.dao;
/**
* Create by ljc on 2019/10/31
*/
public interface IAccountDao
{
public void save();
}
com.lin.dao.impl下:
package com.lin.dao.impl;
import com.lin.dao.IAccountDao;
/**
* Create by ljc on 2019/10/31
*/
public class AccountDao implements IAccountDao
{
public void save()
{
System.out.println("AccountDao save.....");
}
}
com.lin.service下:
package com.lin.service;
/**
* Create by ljc on 2019/10/31
*/
public interface IAccountService
{
public void saveService();
}
com.lin.service.impl下:
package com.lin.service.impl;
import com.lin.MyBeanFactory;
import com.lin.dao.IAccountDao;
import com.lin.service.IAccountService;
/**
* Create by ljc on 2019/10/31
*/
public class AccountService implements IAccountService
{
IAccountDao iTestDao = (IAccountDao) MyBeanFactory.getBean("accountDao");
public void saveService()
{
iTestDao.save();
}
}
com.lin下:最重要的工廠類
package com.lin;
import org.springframework.beans.factory.BeanFactory;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
* 工廠類,用來管理所有組件(類)
* Create by ljc on 2019/10/31
*/
public class MyBeanFactory
{
// 從配置文件中讀取所需組件(類)
private static Properties properties;
//使用容器來保存所有組件
private static Map<String, Object> beans;
static
{
try
{
//讀取配置文件
properties = new Properties();
InputStream in = BeanFactory.class.getClassLoader()
.getResourceAsStream("bean.properties");
properties.load(in);
//實例化容器
beans = new HashMap<String, Object>();
//裝載所有組件
Enumeration keys = properties.keys();
while (keys.hasMoreElements())
{
String key = keys.nextElement().toString();
String beanPath = properties.getProperty(key);
//反射創建對象
Object object = Class.forName(beanPath).newInstance();
//將對象加入到容器中
System.out.println("裝載類" + beanPath);
beans.put(key, object);
}
System.out.println("初始化容器並裝配組件完成");
} catch (Exception e)
{
throw new ExceptionInInitializerError("初始化properties失敗");
}
}
public static Object getBean(String beanName)
{
return beans.get(beanName);
}
}
com.lin下:
package com.lin;
import com.lin.service.IAccountService;
/**
* Create by ljc on 2019/10/31
*/
public class Test
{
public static void main(String[] args)
{
IAccountService iTestService = (IAccountService) MyBeanFactory.getBean("accountService");
iTestService.saveService();
}
}
resources下bean.properties文件:很重要的配置清單文件
accountService=com.lin.service.impl.AccountService
accountDao=com.lin.dao.impl.AccountDao
可以看到類的新建不再使用new關鍵字明確指定,而是使用容器管理,需要的時候直接從容器中獲得需要的組件。