1.配置文件

Service=service.Impl.ServiceImpl

saveDao=dao.daoImpl.saveDaoImpl

2.模拟业务层

--接口 Service

package service;
/**
* service层
* @date 2019/10/29 16:42
*/
public interface Service {
void save() throws IllegalAccessException, InstantiationException, ClassNotFoundException;
}

--实现 ServiceImpl

package service.Impl;
import factory.BeanFactory;
import service.Service;
import dao.*;
/**
* 服务层
* @date 2019/10/29 22:33
*/
public class ServiceImpl implements Service {
//saveDao dao=new saveDaoImpl();//依赖很高 而且控制权在被调用者 public void save() throws IllegalAccessException, InstantiationException, ClassNotFoundException {
int i = 1 ;
//对象的实例不再由调用者来创建,而是由容器来创建
saveDao dao =(saveDao) BeanFactory.getBean("saveDao");//使用配置文件和反射解耦(这就是IOC)
dao.save();
System.out.println(i+"service");
i++;
}
}
//控制反转和依赖注入 一样

3.工厂BeanFactory

package factory;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
* 一个创建bean对象的工厂
* bean: 在计算机中,有可重用的组件含义
* javaBean:用java语言编写的可重用组件
* javaBean>实体类
*
* 第一个:需要一个配置文件配置service和dao
* 第二个:通过读取配置文件内容,反射创建对象
* @date 2019/10/29 20:01
*/
public class BeanFactory {
private static Properties properties;
//定义一个map,用于存放我们要创建的对象,我们把它称之为容器
private static Map<String,Object> beans;
static {
properties=new Properties();
InputStream stream = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
try {
properties.load(stream);
//实例化容器
beans= new HashMap<String, Object>();
//取出所有配置文件中所有的key
Enumeration keys = properties.keys();
//遍历枚举
while (keys.hasMoreElements()){
//取出每个key
String key=keys.nextElement().toString();
//根据key获取value
String beanPath = properties.getProperty(key);
//反射创建对象
Object value = Class.forName(beanPath).newInstance();
//存入map
beans.put(key,value);
}
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} }
//根据bean的 名字获取bean对象(单例)
public static Object getBean(String beanName) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
/* Object bean= null;
String property = properties.getProperty(beanName);
bean = Class.forName(property).newInstance();*/ //此次实例化就使用map了...上面 return beans.get(beanName); }
}

4.模拟dao层

--接口saveDao

package dao;
/**
* dao层
* @date 2019/10/29 16:42
*/
public interface saveDao {
void save();
}

--实现类saveDaoImpl

package dao.daoImpl;

import dao.saveDao;

public class saveDaoImpl implements saveDao {
public void save() {
System.out.println("dao保存...");
}
}

----------测试--------

import factory.BeanFactory;
import service.Impl.ServiceImpl; /**
* 模拟三层架构(使用new 会增加耦合性 所以通过 配置文件和反射就会降低耦合 这也就是spring的核心)
* @date 2019/10/29 16:40
*/
public class test {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
/* Service service=new ServiceImpl();//在使用new时增强了程序之间的耦合性
service.save();*/ for (int i = 0; i < 5; i++) {
//使用反射 (此方法相当于上面的代码只是解耦了 也就是编译期间不会报错,运行期间会)
ServiceImpl service =(ServiceImpl) BeanFactory.getBean("Service");
System.out.println(service);//此时打印的对象都不相同(多例)
//使用容器后打印的是同一个对像(那么也就提高了代码的性能)
service.save();
}
}
}

模拟spring工作原理的更多相关文章

  1. Spring工作原理

    一. IoC(Inversion of control): 控制反转1.IoC:概念:控制权由对象本身转向容器:由容器根据配置文件去创建实例并创建各个实例之间的依赖关系核心:bean工厂:在Sprin ...

  2. Spring工作原理与单例

    最近看到spring管理的bean为单例的,当它与web容器整合的时候始终搞不太清除,就网上搜索写资料, Tomcat与多线程, servlet是多线程执行的,多线程是容器提供的能力. servlet ...

  3. Spring工作原理及其作用

    1.springmvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作. 2.DispatcherServlet查询一个或多个Hand ...

  4. Spring工作原理及应用

    spring原理 内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建.调用对象,Spring就是在运行时 ...

  5. Spring学习之旅(四)Spring工作原理再探

    上篇博文对Spring的工作原理做了个大概的介绍,想看的同学请出门左转.今天详细说几点. (一)Spring IoC容器及其实例化与使用 Spring IoC容器负责Bean的实例化.配置和组装工作有 ...

  6. Spring学习之旅(三)Spring工作原理初探

    详细的废话相信很多书籍视频资料都已经很多了,这里说几个小编个人认为对于理解Spring框架很重要的点.欢迎批评指正. 1)Spring的控制反转 先说说“依赖”,在面向对象程序设计中,类A中用到了类B ...

  7. spring工作原理理解

    spring的工作原理 spring是作为一个容器存在的框架,可以加载spring web,spring mvc,spring orm,sprong aop,spring dao等框架和模块,其主要核 ...

  8. Spring工作原理:初识SpringMVC

    1.SpringMVC简介 SpringMVC是Spring框架的一个模块.SpringMVC和Spring无需通过中间层进行整合.是一个轻量级的,基于请求响应的MVC框架. 2.1.什么是MVC? ...

  9. Spring 工作原理

    1.spring原理 内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建.调用对象,Spring就是在运 ...

  10. Struts1、Struts2、Hibernate、Spring框架工作原理介绍

    Struts1工作原理 Struts1工作原理图 1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控 ...

随机推荐

  1. EL表达式处理字符串

    示例 JSP页面页头添加 <%@ taglib uri="/WEB-INF/taglib/c.tld" prefix="c"%> <%@ ta ...

  2. 二: sql模式(sql_mode)

    # sql_mode 1 介绍 sql_mode 会影响 MySQL支持的SQL语法以及它执行的数据验证检查.通过设置sql_mode,可以完成不同严格程度 的数据校验,有效地保障数据准确性. MyS ...

  3. Java --- 多线程 创建线程的方式四: 使用线程池

    1 package bytezero.thread2; 2 3 import java.security.Provider; 4 import java.util.concurrent.Executo ...

  4. Java 多态性的使用

    1 package com.bytezreo.duotai3; 2 3 /*** 4 * 5 * @Description 练习多态性的使用 6 * @author Bytezero·zhenglei ...

  5. C++ //STL---常用算法 //常用遍历 for_each //transform

    1 //STL---常用算法 2 //常用遍历 for_each 3 //transform 4 #include<iostream> 5 #include<string> 6 ...

  6. pycharm/Intellij idea双击打不开,没有反应,下列方法亲测有用!

    第一种方法: 看看你的微软C++运行库是不是误删了.....我就这么干过...以前有个软件捆绑这个 安装了 结果我后来给删了 ,导致我pycharm 和intellij idea全都打不开 !!!各位 ...

  7. 使用C#和MemoryCache组件实现轮流调用APIKey以提高并发能力

    文章信息 标题:使用C#和MemoryCache组件实现轮流调用API Key以提高并发能力的技巧 摘要:本文介绍了如何利用C#语言中的MemoryCache组件,结合并发编程技巧,实现轮流调用多个A ...

  8. HISI3520DV300 折腾记录(二)之《内存映射、存储(DDRC,FMC)、启动模式分析》

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  9. 【2311. 小于等于 K 的最长二进制子序列】贪心

    class Solution { public static void main(String[] args) { Solution solution = new Solution(); System ...

  10. GaussDB(分布式)实例故障处理

    本文分享自华为云社区<GaussDB(分布式)实例故障处理>,作者:subverter. 一.说明 GaussDB Kernel实例出现故障时,可以按照本节的办法进行实例快速修复. 1.执 ...