Java工廠模式解耦 —— 理解Spring IOC


Java工廠模式解耦 —— 理解Spring IOC

最近看到一個很好的思想來理解Spring IOC,故記錄下來。

資源獲取方式

  1. 主動式:(要什么資源都自己創建)

  2. 被動式:(資源的獲取不是我們創建,而是交給一個容器來創建和設置)

工廠模式獲取資源

主要思想:

  1. 使用工廠模式以及Java反射機制來獲取資源(類)。
  2. 使用容器(Map)來存儲所有資源,當需要的時候由工廠從容器中取出。
  3. 使用讀取配置文件的方式向容器中注入組件(類)。

作用:

  1. 降低組件之間的耦合性。

代碼

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關鍵字明確指定,而是使用容器管理,需要的時候直接從容器中獲得需要的組件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM