java ioc 简单实现原理_手动实现IOC容器:SpringIOC底层实现原理

本文通过手动实现一个简单的IOC容器,详细介绍了Spring IOC的底层实现原理。从XML配置bean信息、getBean方法、依赖注入、单例多例管理等方面入手,逐步解析并实现每个关键步骤,帮助读者深入理解Spring源码。
摘要由CSDN通过智能技术生成

面试官特别爱问SpringIOC底层实现,Spring源码晦涩难懂怎么办呢? 跟着老师手动实现一个mini ioc容器吧,实现后再回头看Spring源码事半功倍哦,就算直接和面试官讲也完全可以哦,类名完全按照源码设计,话不多说开干~!

手动实现IOC容器的设计

需要实现的IOC功能:

·可以通过xml配置bean信息

·可以通过容器getBean获取对象

·能够根据Bean的依赖属性实现依赖注入

·可以配置Bean的单例多例

实现简易IOC设计的类

类/接口

说明

BeanFactory

IOC容器的基础接口,提供IOC容器的基本功能

DefaultListableBeanFactory

IOC容器的核心实现类,提供多个map集合用来存储bean的定义对象,提供getBean方法的核心实现

XmlBeanFactory

IOC容器的实现类,基于xml构建bean信息

XmlBeanDefinitionReader

用于解析xml信息,并提供解析Document文档的方法,并将解析到的BeanDefinition对象注册到核心容器中

BeanDefinition

封装Bean的定义对象,如: bean的id class,scope ..等等

Property

封装Bean所关联依赖的属性

类之间关系模型

839c171b7123ada4356c0b71c1400a42.png

前期准备

创建maven项目引入依赖

dom4j

dom4j

1.1

commons-beanutils

commons-beanutils

1.9.3

准备3个bean的实体类

/**

* 学生类

* 学生类依赖班级对象

* 并提供 sayHello() 方法

* @作者 itcast

* @创建日期 2020/3/7 19:46

**/

public class Student {

private String name;

private TClass tClass;

public void sayHello(){

System.out.println("大家好,我是" +this.name+" 我的班级是==>"+tClass.getCname() + " 我的老师是"+tClass.getTeacher().getTname());

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public TClass gettClass() {

return tClass;

}

public void settClass(TClass tClass) {

this.tClass = tClass;

}

}

/**

* 班级类

* 班级类依赖教师对象

* @作者 itcast

* @创建日期 2020/3/7 19:45

**/

public class TClass {

private String cname;// 班级名称

private Teacher teacher; // 老师

public String getCname() {

return cname;

}

public void setCname(String cname) {

this.cname = cname;

}

public com.itcast.ioc.bean.Teacher getTeacher() {

return teacher;

}

public void setTeacher(com.itcast.ioc.bean.Teacher teacher) {

this.teacher = teacher;

}

}

/**

* 教师类

* @作者 itcast

* @创建日期 2020/3/7 19:44

**/

public class Teacher {

private String tname;// 老师名称

public String getTname() {

return tname;

}

public void setTname(String tname) {

this.tname = tname;

}

}

xml配置对象

配置学生对象: 小明

依赖班级对象: 3年2班

依赖教师对象: 陈老师

mini-IOC容器-定义类

定义BeanFactory

/**

* 容器的基础接口

* 提供容器最基本的功能

*/

public interface BeanFactory {

// 核心方法 获取对象

Object getBean(String beanName);

}

定义DefaultListableBeanFactory

package com.itcast.ioc.core;

import java.util.Map;

import java.util.concurrent.ConcurrentHashMap;

/**

* 基础容器的核心实现

* 提供 beanDefinitionMap 存储bean的定义

* 提供 singletonObjects 存储bean的对象实例

* @作者 itcast

* @创建日期 2020/7/8 15:37

**/

public class DefaultListableBeanFactory implements BeanFactory {

// 提供 beanDefinitionMap 存储bean的定义

private Map beanDefinitionMap = new ConcurrentHashMap<>();

// 提供 singletonObjects 存储bean的对象实例 (scope为singleton的)

private Map singletonObjects = new ConcurrentHashMap<>();

/**

* 实现getBean方法

*@parambeanName

*@return

*/

@Override

public Object getBean(Str

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值