Spring容器的简单实现(IOC原理)
引言:容器是什么?什么是容器?Spring容器又是啥东西?我给Spring容器一个对象名字,为啥能给我创建一个对象呢?
一、容器是装东西的,就像你家的水缸,你吃饭的碗等等。
java中能作为容器的有很多,例如Map,List,数组.....还有好多
二、Spring 容器的核心就是一个Map集合(可能不是很准确,见谅!)
Map<String, Object> 这个容器里根据key-value存放了好多键值对。假如你给一个String的key,就能获得相应的Object的对象,各位大佬,对Spring容器是不是有拨开云雾见太阳的感觉了?[/斜眼笑]
Spring工厂的作用:帮助我们创建管理对象。
<一>BeanFactory
1、定义Map容器,key-类名、value-对象
2、解析bean.xml文件
3、根据name返回对象
- package com.demo.ioc.theory.factory;
- import java.util.Map;
- import com.demo.ioc.theory.util.ParseHelper;
- public class BeanFactory {
- //定义的Map<类名,对象>的容器
- private Map<String, Object> map;
- //无参构造器传的是bean.xml文件的路径
- public BeanFactory() {
- this("src/bean.xml");
- }
- //这个构造器调用方法解析xml文件,返回值就是 类名-对象 的关系
- public BeanFactory(String path) {
- try {
- map = ParseHelper.parseXml(path);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- //根据类名获取对象的方法
- public Object getBean(String beanName) {
- return map.get(beanName);
- }
- }
<二>解析bean.xml文件(dom4j解析)
需要导入dom4j的相关jar包,下载地址 http://central.maven.org/maven2/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar
这个解析简单,直接上代码:
- package com.demo.ioc.theory.util;
- import java.io.File;
- import java.lang.reflect.Method;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import org.dom4j.Document;
- import org.dom4j.Element;
- import org.dom4j.io.SAXReader;
- @SuppressWarnings("unchecked")
- public class ParseHelper {
- public static Map<String, Object> parseXml(String path) throws Exception {
- Map<String, Object> map = new HashMap<>();
- // 创建saxReader对象
- SAXReader saxReader = new SAXReader();
- //通过read方法读取一个文件 转换成Document对象
- Document document = saxReader.read(new File(path));
- //获取根节点元素对象
- Element rootElement = document.getRootElement();
- List<Element> elements = rootElement.elements();
- for(Element e:elements){
- String beanName = e.attributeValue("name");
- String className = e.attributeValue("class");
- Object o = Class.forName(className).newInstance();
- map.put(beanName,o);
- List<Element> elements2 = e.elements();
- for(Element e2:elements2){
- //<property name="student" ref="stu"></property>
- String propertyName = e2.attributeValue("name");
- String refName = e2.attributeValue("ref");
- //调用当前类中的一个私有方法 通过参数student获得其对应的set方法名:setStudent
- String methodName = getMethodName(propertyName);
- //通过对象名字stu从map中获得其对应的对象
- Object obj = map.get(refName);
- //获得setStudent方法镜像
- Method method = o.getClass().getMethod(methodName, new Class[]{obj.getClass()});
- //反射调用该方法 相当于 t.setStudent(stu);
- method.invoke(o, obj);
- }
- }
- return map;
- }
- //可以把字符串参数xxx转变为setXxx
- private static String getMethodName(String s) {
- s = s.substring(0,1).toUpperCase() + s.substring(1,s.length());
- return "set"+s;
- }
- }
<三>配置文件bean.xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <beans>
- <bean name="student" class="com.demo.ioc.theory.bean.Student">
- </bean>
- </beans>
<四>实体类,Student.java
- package com.demo.ioc.theory.bean;
- public class Student {
- private String name;
- private String age;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getAge() {
- return age;
- }
- public void setAge(String age) {
- this.age = age;
- }
- }
<五>测试自己做的IOC容器
- package com.demo.ioc.theory;
- import com.demo.ioc.theory.bean.Student;
- import com.demo.ioc.theory.factory.BeanFactory;
- public class IocTest {
- public static void main(String[] args) {
- //创建工厂对象
- BeanFactory beanFactory = new BeanFactory();
- //通过工厂直接拿到Student对象,不用去 new Student();
- Student bean = (Student) beanFactory.getBean("student");
- //测试
- bean.setAge("20");
- System.out.println(bean.getAge());
- }
- }
到此,一个简单的Spring Ioc容器就实现了,这个容器可以根据配置文件配置的信息获取到对应的对象。不需要再去new对象了。当然,这只是最简单的,你也可以再去深入....
下面是我的demo的项目结构,瞧一瞧哦
Spring容器的简单实现(IOC原理)的更多相关文章
- Spring_01 spring容器、控制反转(IOC)、依赖注入(DI)
目录 1 什么是spring框架 2 spring框架的特点 3 spring容器 3.1 什么是spring容器 3.2 spring容器创建对象的编程步骤 3.4 spring容器创建对象的方式 ...
- 使用Spring容器最简单的代码姿势
如果仅仅是为了测试简单使用一下Spring的IOC容器,或者研究一下Spring的容器的源码实现,那么在搭建Spring工程的时候,不需要复杂的xml配置.Spring3.0之后提供了Java注解配置 ...
- spring容器BeanFactory简单例子
在Spring中,那些组成你应用程序的主体及由Spring Ioc容器所管理的对象,都被称之为bean.简单来讲,bean就是Spring容器的初始化.配置及管理的对象.除此之外,bean就与应用程序 ...
- Spring源码学习之IOC容器实现原理(一)-DefaultListableBeanFactory
从这个继承体系结构图来看,我们可以发现DefaultListableBeanFactory是第一个非抽象类,非接口类.实际IOC容器.所以这篇博客以DefaultListableBeanFactory ...
- Spring IOC原理补充(循环依赖、Bean作用域等)
文章目录 前言 正文 循环依赖 什么是循环依赖? Spring是如何解决循环依赖的? 作用域实现原理以及如何自定义作用域 作用域实现原理 自定义Scope BeanPostProcessor的执行时机 ...
- Spring系列2:Spring容器基本概念和使用
本文内容 简单回顾IoC和DI概念 Spring容器的概念 的xml配置和初始化 容器的基本使用 bean的定义和初始化配置 简单理解IoC和DI概念 什么是IoC控制反转? 通俗地但不严谨地讲,以前 ...
- 手写一个最简单的IOC容器,从而了解spring的核心原理
从事开发工作多年,spring源码没有特意去看过.但是相关技术原理倒是背了不少,毕竟面试的那关还是得过啊! 正所谓面试造火箭,工作拧螺丝.下面实现一个最简单的ioc容器,供大家参考. 1.最终结果 2 ...
- IoC原理-使用反射/Emit来实现一个最简单的IoC容器
从Unity到Spring.Net,到Ninject,几年来陆陆续续用过几个IoC框架.虽然会用,但也没有一直仔细的研究过IoC实现的过程.最近花了点时间,下了Ninject的源码,研究了一番,颇有收 ...
- 最简单的ioc容器代码(低仿Spring )
Spring 的一大核心就是IOC,控制反转(依赖注入). 对象交由容器去控制,降低耦合性. Spring 的ioc实现原理其实很简单,容器启动后读取并解析配置文件,根据配置文件中<bean&g ...
随机推荐
- 进入root提示Authentication failure错误
新安装Ubuntu 18.4,想进入root角色,提示“Authentication failure” 失败. 因为是新安装,并无root的密码,所以需要新增加: sudo passwd root,之 ...
- Deep Learning - 3 改进神经网络的学习方式
反向传播算法是大多数神经网络的基础,我们应该多花点时间掌握它. 还有一些技术能够帮助我们改进反向传播算法,从而改进神经网络的学习方式,包括: 选取更好的代价函数 正则化方法 初始化权重的方法 如何选择 ...
- htnl 定位
相对定位 相对定位:position:relative; 相对定位:相对定位是相对于元素在文档中的初始位置——首先它出现在它所在的位置上(即不设置position时的位置,然后通过设置垂直或水平位置, ...
- C#字典Dictionay多线程读是否是安全的
答案:是线程安全的,只读不写多线程下,完全不需要加锁! 测试代码: using System; using System.Diagnostics; using System.Threading; us ...
- wangEditor更改默认高度
在使用WangEditor时觉得高度太低,默认是300px;想调下高度,借鉴https://blog.csdn.net/qq_31384551/article/details/83240188, 网址 ...
- Android--获取手机联系人和Sim卡联系人
最近公司做的一个放贷APP,要求后台偷偷获取用户的联系人来做风控,所以...(大家忽略就好) 获取手机联系人很简单,就是查询android的数据库,用到的是ContentProvider进行跨进程通讯 ...
- 键盘ascll码表
键盘ascll码表-自用
- (后端)Mybatis中#{}和${}传参的区别及#和$的区别小结(转)
原文地址:https://www.cnblogs.com/zqr99/p/8094234.html 最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, ...
- 使用Visual Studio Team Services持续集成(三)——使用工件
使用Visual Studio Team Services持续集成(三)--使用工件 工件是应用程序的可部署组件.Visual Studio Team Services有能力在构建过程中显式地管理工件 ...
- coTurn 运行在Windows平台的方法及服务与客户端运行交互流程和原理
coTurn是一个开源的STUN和TURN及ICE服务项目,只是不支持Windows.为了在window平台上使用coTurn源码,需要在windows平台下安装Cygwin环境,并编译coTurn源 ...