面试官特别爱问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所关联依赖的属性
类之间关系模型
前期准备
创建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