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

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. UML-业务规则

    样例:

  2. 题解 P3061 【[USACO12DEC]疯狂的栅栏Crazy Fences】

    这道题的思想是首先我们找到所有的栅栏围成的空间,然后求每一只奶牛在哪几个栅栏空间之中,最后比较他们在的所有栅栏空间-----如果奶牛a和b同时在空间c,d和e内,那么他们一定在同一群中. 测试围栏的方 ...

  3. 蓝桥杯练习Day 2

    问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...

  4. MonkeyScript常用命令及Uiautomatorview问题解决

    一.MonkeyScript执行脚本的命令 adb shell monkey -f <scriptfile><event-count> 1.Dispatch Trackball ...

  5. 2019-2020-1 20199324《Linux内核原理与分析》第一周作业

    1.问题:使用banner输出图形字符为什么都是大写? 2.实验二:基本概念及操作 作业:命令toilet和figlet的使用 使用如下命令安装 $ sudo apt-get update $ sud ...

  6. LeetCode No.133,134,135

    No.133 CloneGraph 克隆图 题目 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆). 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node ...

  7. every|each|the用于姓氏的复数形式|comrades-in-arms|clothes are|word|steel|affect|effect

    ________ man in the crowd raised his hand.  A. All  B. Each  C. Every  D. Both 题目解析 考查代词的用法.此句意思是:人群 ...

  8. 转载-WebSocket协议解析

    现在,很多网站为了实现推送技术,所用的技术都是轮询.轮询是指在特定的时间间隔(如每一秒),由浏览器对服务器发起HTTP请求,然后由服务器返回数据给浏览器.由于HTTP协议是惰性的,只有客户端发起请求, ...

  9. 89)PHP,跳转练习(1)

    首先是需要两个简单的文件: 目录关系是: 我的beifen.php代码展示,这个先执行: <?php header('Location:b.php'); b.php代码展示: <?php ...

  10. OpenCV Canny 边缘检测

    #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #i ...