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

最近看到一个很好的思想来理解Spring IOC,故记录下来。

资源获取方式

  1. 主动式:(要什么资源都自己创建)

  2. 被动式:(资源的获取不是我们创建,而是交给一个容器来创建和设置)

工厂模式获取资源

主要思想:

  1. 使用工厂模式以及Java反射机制来获取资源(类)。
  2. 使用容器(Map)来存储所有资源,当需要的时候由工厂从容器中取出。
  3. 使用读取配置文件的方式向容器中注入组件(类)。

作用:

  1. 降低组件之间的耦合性。

代码

com.lin.dao下:

  1. package com.lin.dao;
  2. /**
  3. * Create by ljc on 2019/10/31
  4. */
  5. public interface IAccountDao
  6. {
  7. public void save();
  8. }

com.lin.dao.impl下:

  1. package com.lin.dao.impl;
  2. import com.lin.dao.IAccountDao;
  3. /**
  4. * Create by ljc on 2019/10/31
  5. */
  6. public class AccountDao implements IAccountDao
  7. {
  8. public void save()
  9. {
  10. System.out.println("AccountDao save.....");
  11. }
  12. }

com.lin.service下:

  1. package com.lin.service;
  2. /**
  3. * Create by ljc on 2019/10/31
  4. */
  5. public interface IAccountService
  6. {
  7. public void saveService();
  8. }

com.lin.service.impl下:

  1. package com.lin.service.impl;
  2. import com.lin.MyBeanFactory;
  3. import com.lin.dao.IAccountDao;
  4. import com.lin.service.IAccountService;
  5. /**
  6. * Create by ljc on 2019/10/31
  7. */
  8. public class AccountService implements IAccountService
  9. {
  10. IAccountDao iTestDao = (IAccountDao) MyBeanFactory.getBean("accountDao");
  11. public void saveService()
  12. {
  13. iTestDao.save();
  14. }
  15. }

com.lin下:最重要的工厂类

  1. package com.lin;
  2. import org.springframework.beans.factory.BeanFactory;
  3. import java.io.InputStream;
  4. import java.util.Enumeration;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. import java.util.Properties;
  8. /**
  9. * 工厂类,用来管理所有组件(类)
  10. * Create by ljc on 2019/10/31
  11. */
  12. public class MyBeanFactory
  13. {
  14. // 从配置文件中读取所需组件(类)
  15. private static Properties properties;
  16. //使用容器来保存所有组件
  17. private static Map<String, Object> beans;
  18. static
  19. {
  20. try
  21. {
  22. //读取配置文件
  23. properties = new Properties();
  24. InputStream in = BeanFactory.class.getClassLoader()
  25. .getResourceAsStream("bean.properties");
  26. properties.load(in);
  27. //实例化容器
  28. beans = new HashMap<String, Object>();
  29. //装载所有组件
  30. Enumeration keys = properties.keys();
  31. while (keys.hasMoreElements())
  32. {
  33. String key = keys.nextElement().toString();
  34. String beanPath = properties.getProperty(key);
  35. //反射创建对象
  36. Object object = Class.forName(beanPath).newInstance();
  37. //将对象加入到容器中
  38. System.out.println("装载类" + beanPath);
  39. beans.put(key, object);
  40. }
  41. System.out.println("初始化容器并装配组件完成");
  42. } catch (Exception e)
  43. {
  44. throw new ExceptionInInitializerError("初始化properties失败");
  45. }
  46. }
  47. public static Object getBean(String beanName)
  48. {
  49. return beans.get(beanName);
  50. }
  51. }

com.lin下:

  1. package com.lin;
  2. import com.lin.service.IAccountService;
  3. /**
  4. * Create by ljc on 2019/10/31
  5. */
  6. public class Test
  7. {
  8. public static void main(String[] args)
  9. {
  10. IAccountService iTestService = (IAccountService) MyBeanFactory.getBean("accountService");
  11. iTestService.saveService();
  12. }
  13. }

resources下bean.properties文件:很重要的配置清单文件

  1. accountService=com.lin.service.impl.AccountService
  2. accountDao=com.lin.dao.impl.AccountDao

可以看到类的新建不再使用new关键字明确指定,而是使用容器管理,需要的时候直接从容器中获得需要的组件。

Java工厂模式解耦 —— 理解Spring IOC的更多相关文章

  1. Java工厂模式浅析理解

    由于本人缺乏工作经验,本篇文章作为随笔,只是对工厂模式有一个简单的认识 工厂模式分为以下三种: 1:简单工厂(Simple Factory).2:工厂方法(Factory Method).3:抽象工厂 ...

  2. 工厂模式讲解, 引入Spring IOC

    目录 引入 简单工厂 抽象工厂 Spring的bean工厂 模拟Spring工厂实现 模拟IOC 引入 假设有一个司机, 需要到某个城市, 于是我们给他一辆汽车 public class Demo { ...

  3. 使用工厂模式解耦和IoC思想

    使用工厂模式解耦. 一.需求场景: 某一层功能需要改动,但其他层代码不变 实现类1:MyDaoImpl查询自己的数据库. ====改为====> 实现类2:MyDaoImpl2从其它地址得到数据 ...

  4. 深入理解Spring IOC容器

    本文将从纯xml模式.xml和注解结合.纯注解的方式讲解Spring IOC容器的配置和相关应用. 纯XML模式 实例化Bean的三种方式: 使用无参构造函数 默认情况下,会使用反射调用无参构造函数来 ...

  5. 深入理解Spring IOC容器及扩展

    本文将从纯xml模式.xml和注解结合.纯注解的方式讲解Spring IOC容器的配置和相关应用. 纯XML模式 实例化Bean的三种方式: 使用无参构造函数 默认情况下,会使用反射调用无参构造函数来 ...

  6. java工厂模式

    (1)概念大白话:java工厂模式就是客户端(main函数)要创建对象觉得麻烦就让另外一个叫工厂的类帮它创建,然后自己每次要创建对象就叫工厂帮它弄,举个例子,在没有工厂这个"手下" ...

  7. .NET抽象工厂模式微理解--教你在项目中实现抽象工厂

    .NET抽象工厂模式微理解--教你在项目中实现抽象工厂 最近在学习MVC,对于MVC里面的一些项目上的东西都和抽象模式有关,今天就微说明一下个人对于抽象工厂模式的理解,以方便学习MVC及工厂模式相关的 ...

  8. 阶段3 2.Spring_02.程序间耦合_6 工厂模式解耦

    使用类加载器去加载文件 定义getBean的方法 运行测试方法报错. 在工厂类里面打印输出BeanPath 删除dao的实现类 没有dao的实现类.再次运行程序.编译不报错.运行时报错 以上就是工厂模 ...

  9. 自己理解的java工厂模式,希望对大家有所帮助

    [http://www.360doc.com/content/11/0824/17/3034429_142983837.shtml] 这两天突然想学学java源代码,不过看到一篇文章说看java源代码 ...

随机推荐

  1. 字典|字典和数组嵌套|keys()|value()|item()|del

    python 中没有i++! dic = { 'a':5, 'kelv':'ooo', 5:2333, 2333:'yoo' } print dic[dic[dic['a']]] print dic ...

  2. js 实现时间递增,当前时间功能,javascript格式化当天日期

    直接上代码: function nowTimeStr() {                        var date = new Date();                        ...

  3. Laravel 操作指令

    php artisan migrate —path=database/migrations/v1 更新表数据 php artisan make:migration create_channels_ta ...

  4. 计算a^b==a+b在(l,r)的对数Codeforces Round #597 (Div. 2)

    题:https://codeforces.com/contest/1245/problem/F 分析:转化为:求区间内满足a&b==0的对数(解释见代码) ///求满足a&b==0在区 ...

  5. Office 365管理中心门户

    一.使用Office 365管理员账户登陆到由世纪互联运营的Office 365 登陆地址 https://portal.partner.microsoftonline.cn 1.登陆完成后,选择左上 ...

  6. SSH免密码登陆详解

    为了更好的理解SSH免密码登陆原理,我们先来说说SSH的安全验证,SSH采用的是”非对称密钥系统”,即耳熟能详的公钥私钥加密系统,其安全验证又分为两种级别. 1. 基于口令的安全验证 这种方式使用用户 ...

  7. C#阶段小结

    一.数据类型: (一)内建类型: 整型(int ,short, long ,byte ,uint ,ushort, ulong ,sbyte): 浮点型(double float decimal): ...

  8. python3下scrapy爬虫(第十一卷:scrapy数据存储进mongodb)

    说起python爬虫数据存储就不得不说到mongodb,现在我们来试一下scrapy操作mongodb 首先开启mongodb mongod --dbpath=D:\mongodb\db 开启服务后就 ...

  9. ReentrantLock(重入锁)的源码解析

    转自:从源码角度彻底理解ReentrantLock(重入锁)](https://www.cnblogs.com/takumicx/p/9402021.html)) 公平锁内部是FairSync,非公平 ...

  10. npm参考手册

    一 权限操作 npm允许通过scope组织私有包,通过team细化权限控制 npm官方仓储有两种类型的包,普通包和scope包 普通包特征: - 只能公有,谁都可以下载使用 - 仅可以通过所有者(ow ...