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. 【Azure 应用服务】遇见“无法创建hybrid connection for App Service”的解决办法

    Hybrid Connection (混合连接) 在两个联网应用程序之间启用了双向.请求-响应和二进制流通信以及简单的数据报流.通过混合连接,可以实现应用部署在公网环境中,而数据库保存在本地私网环境中 ...

  2. 【Azure Developer】AAD API如何获取用户“Block sign in”信息(accountEnabled)

    问题描述 使用API获取所有Azure AD中的用户列表,API所参考的文档:https://docs.microsoft.com/en-us/graph/api/user-list?view=gra ...

  3. Codeforces Round 923 (Div. 3)(A~F)

    目录 A B C D E F A #include <bits/stdc++.h> #define int long long #define rep(i,a,b) for(int i = ...

  4. 在winform中如何嵌入第三方软件窗体✨

    相关win32api的学习 SetParent [DllImport("user32.dll ", EntryPoint = "SetParent")] pri ...

  5. Linux性能监控(一)-sar

    sar是一个非常全面的一个分析工具,对文件的读写,系统调用的使用情况,磁盘IO,CPU相关使用情况,内存使用情况,进程活动等都可以进行有效的分析.sar工具将对系统当前的状态进行取样,然后通过计算数据 ...

  6. Python根据时间命名并创建文件源码

    自己写的,产品中验证ok的代码,直接上实例: import time def file_create_func(): loca = time.strftime('%Y-%m-%d-%H-%M-%S') ...

  7. python中往json中添加文件的方法

    一 前言: python中常用的一种方式,这里给大家列出来一下. 二 实例 比如,最简单的一个json文件 test_json = { "a": 1, "b": ...

  8. 数据库表到java类转换工具

    //该工具类可以实现:给定一个指定的数据库表名,即可自动生成对应的java实体类 package com.iamzken.utils; import java.io.BufferedWriter; i ...

  9. Linux高级IO

    readv.writev API: #include <sys/uio.h> ssize_t readv(int fd, const struct iovec* vector, int c ...

  10. Libcurl & Log4cplus 移植和使用 以及 Jsoncpp 简单使用

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