引言:容器是什么?什么是容器?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原理)的更多相关文章

  1. Spring_01 spring容器、控制反转(IOC)、依赖注入(DI)

    目录 1 什么是spring框架 2 spring框架的特点 3 spring容器 3.1 什么是spring容器 3.2 spring容器创建对象的编程步骤 3.4 spring容器创建对象的方式 ...

  2. 使用Spring容器最简单的代码姿势

    如果仅仅是为了测试简单使用一下Spring的IOC容器,或者研究一下Spring的容器的源码实现,那么在搭建Spring工程的时候,不需要复杂的xml配置.Spring3.0之后提供了Java注解配置 ...

  3. spring容器BeanFactory简单例子

    在Spring中,那些组成你应用程序的主体及由Spring Ioc容器所管理的对象,都被称之为bean.简单来讲,bean就是Spring容器的初始化.配置及管理的对象.除此之外,bean就与应用程序 ...

  4. Spring源码学习之IOC容器实现原理(一)-DefaultListableBeanFactory

    从这个继承体系结构图来看,我们可以发现DefaultListableBeanFactory是第一个非抽象类,非接口类.实际IOC容器.所以这篇博客以DefaultListableBeanFactory ...

  5. Spring IOC原理补充(循环依赖、Bean作用域等)

    文章目录 前言 正文 循环依赖 什么是循环依赖? Spring是如何解决循环依赖的? 作用域实现原理以及如何自定义作用域 作用域实现原理 自定义Scope BeanPostProcessor的执行时机 ...

  6. Spring系列2:Spring容器基本概念和使用

    本文内容 简单回顾IoC和DI概念 Spring容器的概念 的xml配置和初始化 容器的基本使用 bean的定义和初始化配置 简单理解IoC和DI概念 什么是IoC控制反转? 通俗地但不严谨地讲,以前 ...

  7. 手写一个最简单的IOC容器,从而了解spring的核心原理

    从事开发工作多年,spring源码没有特意去看过.但是相关技术原理倒是背了不少,毕竟面试的那关还是得过啊! 正所谓面试造火箭,工作拧螺丝.下面实现一个最简单的ioc容器,供大家参考. 1.最终结果 2 ...

  8. IoC原理-使用反射/Emit来实现一个最简单的IoC容器

    从Unity到Spring.Net,到Ninject,几年来陆陆续续用过几个IoC框架.虽然会用,但也没有一直仔细的研究过IoC实现的过程.最近花了点时间,下了Ninject的源码,研究了一番,颇有收 ...

  9. 最简单的ioc容器代码(低仿Spring )

    Spring 的一大核心就是IOC,控制反转(依赖注入). 对象交由容器去控制,降低耦合性. Spring 的ioc实现原理其实很简单,容器启动后读取并解析配置文件,根据配置文件中<bean&g ...

随机推荐

  1. mysql安装完成之后为root用户添加密码

    编辑MySql的配置文件:my.ini(在MySql安装目录下). 打开配置文件,在文件最后一行添加:skip-grant-tables,然后保存退出. 意思为就是在启mysql时不启动grant-t ...

  2. Python sax模块(SAX解析XML)

    XML样例: <?xml version="1.0"?> <collection shelf="New Arrivals"> <m ...

  3. JHipster生成单体架构的应用示例

    本文演示如何用JHipster生成一个单体架构风格的应用. 环境需求:安装好JHipster开发环境的CentOS 7.4(参考这里) 应用名:app1 实体名:role 主机IP:192.168.2 ...

  4. 2018(2017)美图java服务端笔试(回忆录)

    选择题有几道,是比较基础的 填空题两道:一道是类似c语言的给出abc的值求 ++a+b+++c++  ,另一道是说出两个常见的垃圾回收算法 编程题 找出出现次数为1的数字然后改进(要求O(n)) 数据 ...

  5. 关于Box Anemometer的安装配置遇到的几个坑

    Box Anemometer是一个非常不错的MySQL慢查询可视化工具平台,具体就不多详述了,官网是https://github.com/box/Anemometer 最近动自己动手搭了一个,具体搭建 ...

  6. e lisp 常用缓冲区函数详解

    e lisp 常用缓冲区函数详解 函数名 函数概要 buffer-name 返回当前缓冲区的名字 buffer-file-name 返回当前缓冲区所指文件的名字,包括路径 current-buffer ...

  7. SQL Server 创建用户报错:消息 15023,级别 16,状态 1,第 1 行 用户、组或角色 'XXX' 在当前数据库中已存在。

    问题描述: 原因: 当数据库恢复到其他服务器时,原数据库中包含一组用户和权限,但可能没有相应的登录或者登录所关联的用户可能不是相同的用户. 这种情况可能会出现上面的问题.该问题是无法通过新建登录或者是 ...

  8. Ecto 总结

    ecto 简介 ecto 相当于 elixir 的 ORM,但是得益于 elixir 语言,和传统的 ORM 相比,更加简洁和强大. ecto 主要分为 4 部分: Repo: 这是和真正数据库交互的 ...

  9. 枚举应用demo

    package com.xx; public enum PositionEM{ ONE(1,"领导"), TWO(2,"员工"); private Long v ...

  10. 平方根的C语言实现(一) —— 浮点数的存储

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7203254.html 作者:窗户 Q ...