学习笔记
手写spring源码系列:
之前已经搭建好了spring源码环境,但是不直接开始阅读spring源码,按照spring的思想自己猜想着先写。分为三个模块,
分别为手写spring IOC,Spring DI ,spring AOP, spring配置。 完成之后,再进行源码的解读。
手写IOC
分析 ioc是个啥?inversion of control 控制反转,也称依赖倒置(反转)简单的讲就是依赖的对象被反转了,由自己创建对象,
反转为从ioc容器中获取(自动注入),再简单讲就是之前自己new的对象,现在直接向spring 容器要。
ioc的特点:1. 使代码更简洁,不需要去new对象了。
2.面向接口编码,使用者和具体类解耦,易替换实现者。
ioc本质: 就是创建,管理我们在整个应用程序中使用到的bean。他是一个工厂,负责对外提供bean实例.
问题1:他应该具备什么行为?
答:对外提供bean实例,getBean() 方法
问题2:getBean()方法需要参数吗?需要几个参数,什么类型的参数。
简单工厂模式中,当工厂能创建很多产品的时候,要创建某类产品,需要告诉工厂。所以需要传入名字,或者类型
问题3: 这个getbean()方法的返回值应该是什么类型的。
Object
BeanFactory接口:
public interface BeanFactory {
Object getBean(String name) throws BeansException;
}
问题4:Bean工厂怎么知道该如何创建bean?
我们需要告诉bean工厂。
bean定义————>BeanFactory——>bean instance;
问题5:怎么告诉Beanfacory呢?
使用注册方式,定义一个注册接口
Bean定义——注册——>BeanDefinitionRegistry
问题6:BeanDefinitionRegistry 应该有什么行为?
1.应该有注册,获取Bean定义
1.1.注册的bean定义信息如何区分?
使用唯一的名称
BeanDefinitionRegistry接口
public interface BeanDefinitionRegistry {
/**
* 注册一个beanDefinition,beanName区分唯一的
*
*/
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException;
/**
* 根据BeanName获取BeanDefinition
*/
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
/**
* 检测是否已经注册一个Bean
*/
boolean containsBeanDefinition(String beanName);
}
问题7:BeanDefinition定义的用途
告诉bean工厂如何创建某个Bean
问题8:获取某个类的实例化方式是啥?
构造方式 反射。
工厂方法:静态工厂,实例工厂
Student student = new Student(); public class StudentFacory{ private static Student student; public static Student getStudent(){ student = new Student(); return student; } } public class StudentFactory{ public Student getStudent(){ return new Student(); } }
问题9:Bean工厂帮我创建Bean的时候,需要知道那些信息。
new 构造的---类名
静态工厂方法:工厂类名,工厂方法名
动态的工厂方法:工厂bean名称 工厂方法名。
问题10:每次从bean工厂获取bean实例,是否创建一个新的对象。
单例不需要,非单例需要
问题11:beanDefinition 是给bean工厂创建bean使用的,beanDefinition 接口应向Bean 工厂提供那些方法。
获取bean的类名 :getBeanClass();
获取工厂方法名:
获取工厂bean的名称:
是否是单例的方法。
问题12:类对象交给IOC容器来管理,类对象的生命周期中还可能要做什么?
比如创建对象后进行一些初始化
对象销毁后,进行一些特定销毁逻辑
beanDefinition 对Bean工厂提供 初始化的方法和销毁的方法
public interface BeanDefinition {
/*
*获取bean类名
*/
Class<T> getBeanClass();
/**
* 作用域
*/
String getScope();
/**
* 工厂bean名称
*/
String getFactoryBeanName();
/**
* 工厂方法名称
*/
String getFactoryMethodName();
/**
*是否是单例的
*/
boolean isSingleton();
/**
*是否是原型的
*/
boolean isPrototype();
/**
* 初始化
*/
String getInitMethodName();
/**
* 销毁
*/
String getDestroyMethodName();
}
定义一个BeanDefinition接口的实现类GenericBeanDefinition
定义个DefaultBeanFactory 类实现BeanFactory 和 BeanDefinitionRegistry
总结:经过上述问题分析后,我们已经有了下面的类图。初步可以完成IOC容器
===================今天到这里,具体代码实现到下节类容=================