zoukankan      html  css  js  c++  java
  • 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关键字明确指定,而是使用容器管理,需要的时候直接从容器中获得需要的组件。

    ~~但愿绝望和无奈远走高飞~~
  • 相关阅读:
    ACM/ICPC 之 一道不太简单的DP面试题(Geeksforgeeks)
    ACM/ICPC 之 简单DP-记忆化搜索与递推(POJ1088-滑雪)
    ACM/ICPC 之 递归(POJ2663-完全覆盖+POJ1057(百练2775)-旧式文件结构图)
    ACM/ICPC 之 枚举(POJ1681-画家问题+POJ1166-拨钟问题+POJ1054-讨厌的青蛙)
    JAVA手记 JAVA入门(安装+Dos下运行)
    ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))
    ACM/ICPC 之 优先级队列+设置IO缓存区(TSH OJ-Schedule(任务调度))
    ACM/ICPC 之 BFS(离线)+康拓展开 (HDU1430-魔板)
    JAVA中的数据结构——集合类(序):枚举器、拷贝、集合类的排序
    JAVA中的数据结构——集合类(线性表:Vector、Stack、LinkedList、set接口;键值对:Hashtable、Map接口<HashMap类、TreeMap类>)
  • 原文地址:https://www.cnblogs.com/jinchengll/p/11772131.html
Copyright © 2011-2022 走看看