前言
面试官特别爱问SpringIOC底层实现,Spring源码晦涩难懂 怎么办呢? 我们来手动实现一个mini ioc容器吧,实现后再回头看Spring源码事半功倍哦
手动实现IOC容器的设计
-
需要实现的IOC功能:
- 可以通过xml配置bean信息
- 可以通过容器getBean获取对象
- 能够根据Bean的依赖属性实现依赖注入
- 可以配置Bean的单例多例
-
实现简易IOC设计的类:
-
实现简易IOC设计的类:
前期准备
- 创建maven项目引入依赖
<dependencies>
<!-- 解析xml -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.1</version>
</dependency>
<!-- BeanUtils -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
</dependencies>
- bean的实体类
/**
* 学生类
* 学生类依赖班级对象
* 并提供 sayHello() 方法
**/
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;
}
}/**
* 班级类
* 班级类依赖教师对象
**/
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;
}
}/**
* 教师类
**/
public class Teacher {
private String tname;// 老师名称
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
}
- xml配置对象
配置学生对象: 小明
依赖班级对象: 3年2班
依赖教师对象: 陈老师
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<!-- 配置IOC容器要管理的对象 bean作用域: 单例 原型 -->
<bean id="student" class="com.itcast.ioc.bean.Student" scope="singleton" lazy-init="true">
<!-- 依赖注入: 属性注入 构造器注入 注解注入-->
<property name="name" value="小明"></property>
<property name="tClass" ref="tclass"></property>
</bean>
<bean id="tclass" class="com.itcast.ioc.bean.TClass">
<property name="cname" value="3年2班"></property>
<property name="teacher" ref="teacher"></property>
</bean>
<bean id="teacher" class="com.itcast.ioc.bean.Teacher">
<property name="tname" value="陈老师"></property>
</bean>