之前自己做的ioc
- 源码地址
- 之前总体方向是正确的,只是具体的实现有些问题。职责有些混乱。
- 不足,好多没有考虑到:
- 当ioc容器冲突的时候怎么处理,之前通过返回null来处理,代码侵入性太强。现在采用等级解决。
- 自己利用map再次管理bean的作用域,资源浪费且越级。现在完全交给ioc管理
- creatBean的方法有问题,之前是缓存反射工厂的method来处理的,资源浪费和越级。现在完全交给ioc管理
- 现在只需要专注于实现一个类就行了。
- 且已经整合了spring的ioc了,具体整合实现很简单。请看源码地址。
利用org.apache.commons.configuration2.beanutils.BeanHelper再次重构
- 所有的步骤都是在重复造轮子,其实都是BeanHelper的实现。
- 核心api
public void registerBeanFactory(String name, BeanFactory factory)
public Object createBean(BeanDeclaration data, Class<?> defaultClass, Object param)
public Object createBean(BeanDeclaration data, Class<?> defaultClass)
public Object createBean(BeanDeclaration data)
可以看到用户需要传入的就是BeanDeclaration
String getBeanFactoryName(); //那个factory实例化
Object getBeanFactoryParameter(); //
String getBeanClassName();
Map<String, Object> getBeanProperties(); // 普通的属性
Map<String, Object> getNestedBeanDeclarations(); // 嵌套的属性,这是不是ioc
Collection<ConstructorArg> getConstructorArgs(); // 构造方法。
- 可能有些api比较危险我们代理一下就行了。
- apache默认的BeanDeclaration构造是无构造方法有属性,所有的工厂就是默认的工厂。
- 这里的难点就是BeanDeclaration的构造和确定工厂。
网友评论