模拟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,在启动时总控 ...
随机推荐
- NodeJS本地公用类库
git + npm link 先来看一下npm install 文档. npm 支持安装 git 仓库,支持 git , git+ssh , git+http , git+https , or git ...
- 【Azure 环境】Windows中安装Python azure-eventhub-checkpointstoreblob-aio模块时出错 ERROR: Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory:
问题描述 在使用Python代码接受EventHub的消息时,根据文档要求安装azure-eventhub-checkpointstoreblob-aio模块时,出现了如下错误: ERROR: Cou ...
- 【Azure 应用程序见解】在Azure门户中,创建App Service(应用服务)时,无法一起创建Application Insights的问题
问题描述 创建Web应用时启用监视的问题.Azure管理员(Admin)用户下分配了 一个子用户.但是在使用子用户创建WEB应用的时候,启用 Application Insights 选项的 &quo ...
- 基于图数据库 NebulaGraph 实现的欺诈检测方案及代码示例
本文是一个基于 NebulaGraph 图算法.图数据库.机器学习.GNN 的 Fraud Detection 方法综述.在阅读本文了解欺诈检测的基本实现方法之余,也可以在我给大家准备的 Playgr ...
- 浅析图数据库 Nebula Graph 数据导入工具——Spark Writer
从 Hadoop 说起 近年来随着大数据的兴起,分布式计算引擎层出不穷.Hadoop 是 Apache 开源组织的一个分布式计算开源框架,在很多大型网站上都已经得到了应用.Hadoop 的设计核心思想 ...
- C++ //STL---常用算法 //常用遍历 for_each //transform
1 //STL---常用算法 2 //常用遍历 for_each 3 //transform 4 #include<iostream> 5 #include<string> 6 ...
- C++ //vector 容器构造 vector赋值操作 vector 容量大小 vector插入和删除 //vector数据存取 vector互换容器 vector预留空间
1 //vector 容器构造 vector赋值操作 vector 容量大小 vector插入和删除 2 //vector数据存取 vector互换容器 vector预留空间 3 #include&l ...
- 安卓开发基础适配器,SimpleAdapter 快速演示
第一,主视图如下: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns: ...
- XAF Blazor 中使用 Blazor 组件
前言 文章的标题是不是感觉有点奇怪,但实际我们在XAFBlazor中使用Blazor组件是很繁琐的,我们需要将Blazor组件封装成属性编辑器(PropertyEditor),再用非持久化对象(Non ...
- git 撤销本地 git提交的commit记录 (git reset --hard ID)
git 撤销本地 git提交的commit记录 (git reset --hard ID) ID的获取方法 这个id,就是你要退回的那个id,我这里截图的时候已经回退了,正常是你提错了的下面那个git ...