Spring框架太大,读源码包装太严重, 抽丝剥茧整理出主要思路,自己模拟一份Spring框架,该框架支持如下功能:
DI,IOC,等基础功能;
主要类如下:
- FLBeanDefinition: 保存XML中Bean被解析后的基本信息,
- FLBeanWrapper: 包装实例化的Bean,以及被代理的bean
- FLDefaultListableBeanFactory,用来模拟DefaultListableBeanFactory, 这就是Ioc容器
- FLWebApplicationContext用来模拟XmlWebApplicationContext,用来存储web程序的上下文
- FLBeanFactory用来模拟BeanFactory, 就是bean工厂,内部就一个getBean()方法
- FLBeanDefinitionReader工具类,用来读取xml文件及向ioc中注册bean
项目格式如图:
各个类详情如下:
1. 自定义注解
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FLAutowired {
String value() default "";
}
public @interface FLController {
String value() default "";
}
public @interface FLRequestMapping {
String value() default "";
}
public @interface FLRequestParam {
String value() default "";
}
public @interface FLService {
String value() default "";
}
2. FLBeanDefinition
FLBeanDefinition 用来存储xml解析得到的类型信息, 如beanName,beanClass等,
public class FLBeanDefinition {
String beanClassName;
String factoryBeanName;
Object beanClass;
public FLBeanDefinition(String beanName, String factoryBeanName) {
this.beanClassName = beanName;
this.factoryBeanName = factoryBeanName;
Class<?> clazz = Class.forName(beanName);
this.beanClass = clazz;
}
3. FLBeanWrapper
Spring中所有Bean都被包装在BeanWrapper中, Spring框架的所有操作都是针对被包装过的BeanWrapper,这样确保不影响原始的Bean对象,
public class FLBeanWrapper {
private Object _originalBean;
private Object _wrapperedBean;
public FLBeanWrapper(Object originalBean) {
_originalBean = originalBean;
this._wrapperedBean = originalBean;
}
}
4. FLDefaultListableBeanFactory
本类是Ioc容器, 内部包含解析后的BeanDefiniation列表,和Bean实例后的FLBeanWrapper的列表,换句话说Spring创建的所有Bean对象都存储在这个容器中.
<