模拟spring工作原理
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工作原理的更多相关文章
- Spring工作原理
一. IoC(Inversion of control): 控制反转1.IoC:概念:控制权由对象本身转向容器:由容器根据配置文件去创建实例并创建各个实例之间的依赖关系核心:bean工厂:在Sprin ...
- Spring工作原理与单例
最近看到spring管理的bean为单例的,当它与web容器整合的时候始终搞不太清除,就网上搜索写资料, Tomcat与多线程, servlet是多线程执行的,多线程是容器提供的能力. servlet ...
- Spring工作原理及其作用
1.springmvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作. 2.DispatcherServlet查询一个或多个Hand ...
- Spring工作原理及应用
spring原理 内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建.调用对象,Spring就是在运行时 ...
- Spring学习之旅(四)Spring工作原理再探
上篇博文对Spring的工作原理做了个大概的介绍,想看的同学请出门左转.今天详细说几点. (一)Spring IoC容器及其实例化与使用 Spring IoC容器负责Bean的实例化.配置和组装工作有 ...
- Spring学习之旅(三)Spring工作原理初探
详细的废话相信很多书籍视频资料都已经很多了,这里说几个小编个人认为对于理解Spring框架很重要的点.欢迎批评指正. 1)Spring的控制反转 先说说“依赖”,在面向对象程序设计中,类A中用到了类B ...
- spring工作原理理解
spring的工作原理 spring是作为一个容器存在的框架,可以加载spring web,spring mvc,spring orm,sprong aop,spring dao等框架和模块,其主要核 ...
- Spring工作原理:初识SpringMVC
1.SpringMVC简介 SpringMVC是Spring框架的一个模块.SpringMVC和Spring无需通过中间层进行整合.是一个轻量级的,基于请求响应的MVC框架. 2.1.什么是MVC? ...
- Spring 工作原理
1.spring原理 内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建.调用对象,Spring就是在运 ...
- Struts1、Struts2、Hibernate、Spring框架工作原理介绍
Struts1工作原理 Struts1工作原理图 1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控 ...
随机推荐
- Java Reactive Programming
Java Reactive Programming 响应式编程 在 Spring Boot 中,支持了响应式编程,带来了性能和内存使用方面的优化. 详见: Spring: Blocking vs no ...
- 固态硬盘使用f2fs作为根分区安装linux
目录 前言 碰到的问题 对策 我的实际操作步骤 0.警告 1. 准备 2. 分区 3. 使用网络安装debian10 4. 备份根分区 5. 修改固态硬盘linux根分区为f2fs 6.恢复备份 7. ...
- Nebula Graph 源码解读系列|客户端的通信秘密——fbthrift
概述 Nebula Clients 给用户提供了多种编程语言的 API 用于和 Nebula Graph 交互,并且对服务端返回的数据结构进行了重新封装,便于用户使用. 目前 Nebula Clien ...
- 青少年CTF-Crypto(新手版本2.0,无factor1)
凯撒大帝的征讨之路 题目: lnixoa{1x2azz7w8axyva7y1z2320vxy6v97v9a} 知识点:凯撒加密 我的题解: import base64 #shift得出移位多少,移位后 ...
- C++ //常用拷贝和替换算法 //copy //replace 将指定区间范围内的旧元素修改为新元素 //replace_if(满足条件的元素,替换指定的元素) //swap 互换两个容器的元素
//常用拷贝和替换算法 //copy //replace 将指定区间范围内的旧元素修改为新元素 //replace_if(满足条件的元素,替换指定的元素) //swap 互换两个容器的元素 #incl ...
- Git 如何删除本地分支和远程分支
查看已有的本地及远程分支:git branch -a 删除远程分支(当前删除的是origin/dev分支):git push origin --delete dev 删除后,再次查看分支情况: ...
- roadmap - json格式的 思维导图
roadmap - json格式的 思维导图 前端路线图 http://www.bitcountrys.com/frontend.html https://gitee.com/ironman1987/ ...
- Vue3 写业务逻辑不适合用TS(TypeScript)
TypeScript 最重要的就是装饰器 Vue3最重要更新就是Setup 装饰器就是为了打散功能点,Vue3的Setup功能也是打散功能点,那用Vue3上TS,感觉就是自己给自己多一层工作量. 我这 ...
- printJS 打印 无头无尾 style 加 @page { margin: 0; } body { padding: 100px;}
// 使用npm模块 print-js printJS({ printable: this.printData, type: 'json', documentTitle: ' ', propertie ...
- RGB、HSV、HSL和CMYK颜色空间
目录 简介 RGB(红绿蓝)颜色空间 HSV(色调.饱和度.亮度)颜色空间 HSL(色调.饱和度.亮度)颜色空间 CMYK(青.品红.黄.黑)颜色空间 简介 这四种颜色空间在不同的应用领域有不同的用途 ...