Java工厂模式解耦 —— 理解Spring IOC
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关键字明确指定,而是使用容器管理,需要的时候直接从容器中获得需要的组件。
Java工厂模式解耦 —— 理解Spring IOC的更多相关文章
- Java工厂模式浅析理解
由于本人缺乏工作经验,本篇文章作为随笔,只是对工厂模式有一个简单的认识 工厂模式分为以下三种: 1:简单工厂(Simple Factory).2:工厂方法(Factory Method).3:抽象工厂 ...
- 工厂模式讲解, 引入Spring IOC
目录 引入 简单工厂 抽象工厂 Spring的bean工厂 模拟Spring工厂实现 模拟IOC 引入 假设有一个司机, 需要到某个城市, 于是我们给他一辆汽车 public class Demo { ...
- 使用工厂模式解耦和IoC思想
使用工厂模式解耦. 一.需求场景: 某一层功能需要改动,但其他层代码不变 实现类1:MyDaoImpl查询自己的数据库. ====改为====> 实现类2:MyDaoImpl2从其它地址得到数据 ...
- 深入理解Spring IOC容器
本文将从纯xml模式.xml和注解结合.纯注解的方式讲解Spring IOC容器的配置和相关应用. 纯XML模式 实例化Bean的三种方式: 使用无参构造函数 默认情况下,会使用反射调用无参构造函数来 ...
- 深入理解Spring IOC容器及扩展
本文将从纯xml模式.xml和注解结合.纯注解的方式讲解Spring IOC容器的配置和相关应用. 纯XML模式 实例化Bean的三种方式: 使用无参构造函数 默认情况下,会使用反射调用无参构造函数来 ...
- java工厂模式
(1)概念大白话:java工厂模式就是客户端(main函数)要创建对象觉得麻烦就让另外一个叫工厂的类帮它创建,然后自己每次要创建对象就叫工厂帮它弄,举个例子,在没有工厂这个"手下" ...
- .NET抽象工厂模式微理解--教你在项目中实现抽象工厂
.NET抽象工厂模式微理解--教你在项目中实现抽象工厂 最近在学习MVC,对于MVC里面的一些项目上的东西都和抽象模式有关,今天就微说明一下个人对于抽象工厂模式的理解,以方便学习MVC及工厂模式相关的 ...
- 阶段3 2.Spring_02.程序间耦合_6 工厂模式解耦
使用类加载器去加载文件 定义getBean的方法 运行测试方法报错. 在工厂类里面打印输出BeanPath 删除dao的实现类 没有dao的实现类.再次运行程序.编译不报错.运行时报错 以上就是工厂模 ...
- 自己理解的java工厂模式,希望对大家有所帮助
[http://www.360doc.com/content/11/0824/17/3034429_142983837.shtml] 这两天突然想学学java源代码,不过看到一篇文章说看java源代码 ...
随机推荐
- More 'long-life' plastic bags being used
1 1.1 roll out v. 推广,或实行 1.2 pilot v. 试行 n. 飞行员 1.3 bags for life 可重复使用的环保购物袋 2 2.1 How many times a ...
- 前端-HTLM
前端简介: 什么是前端? 任何与用户直接打交道的操作界面都可以被称为前端,如:网页界面,手机界面.... 前端的学习历程和内容: 要学习的内容: 三大重点: 1.Web服务的本质: 浏览器中敲入网址回 ...
- [ZJOI2019]浙江省选(半平面交)
一眼看上去就应该能用半平面交去做. 首先考虑怎么求可能得第1名的人:每个人的函数为直线,就是在所有人的半平面交中的上边界者即可获得第一名,这个可以单调队列求解. 再考虑如何求可能得第2名的人:满足2个 ...
- dubbo同步/异步调用的方式
我们知道,Dubbo 缺省协议采用单一长连接,底层实现是 Netty 的 NIO 异步通讯机制:基于这种机制,Dubbo 实现了以下几种调用方式: 同步调用(默认) 异步调用 参数回调 事件通知 同步 ...
- TPO4-1 Deer Populations of the Puget Sound
The causes of this population rebound are consequences of other human actions. First, the major pred ...
- 熊海CMS_1.0 代码审计
熊海是一款小型的内容管理系统,1.0版本是多年前的版本了,所以漏洞还是比较多的,而且审计起来难度不大,非常适合入门,所以今天我进行这款cms的代码审计.程序安装后使用seay源代码审计系统打开,首先使 ...
- Mybatis的generator自动生成代码
mybatis-generator有三种用法:命令行.ide插件.maven插件.本次使用maven生成 环境:IDEA,mysql8,maven (1):新建项目,本次以SpringBoot项目为例 ...
- 花生壳的ddns 关键时刻又掉链子,准备迁到阿里万网
https://www.oray.com/news/affiche/?aid=628 免费版花生壳服务故障 因免费版机房线路节点负荷突然暴增,导致花生壳免费版登录缓慢或异常,或出现域名指向到127.0 ...
- 常用的mysql操作
总结一下常用的mysql操作,避免下次遇到类似情况重复地去百度. 方法不是唯一的,但记录一种可行的方法就可以了. 遇到新的问题再继续补充. 1.增加一个列 ALTER TABLE 表名 ADD COL ...
- [LC] 295. Find Median from Data Stream
Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...