这是跟着这个课做的笔记和练习,基本上是边看边记笔记,笔记是为了后面再练的时候,不用再回去翻视频,为什么不愿意去翻视频的呢?主要是那个播放器设置的太垃圾,这么久了还没有改好。哈哈,
所以的心法都在doc下面,每一章都有,我先传一部分上来,大家看看,照着这个能不能也不用看视频就能跟着做。我尽量把这个写得更好点。不过是我自己写的,可能我自己比较能看懂。
现在的任务列表:暂时跟前一节没有什么改变,主要是做了重构
- 把config.bind里面的Component.class提取成一个变量
- 把实现类也提取成一个变量
- 把bind和getContext两句提取成一个方法
- 处理提取的函数的泛型,<T, R extends R>,跑一下测试
private <T, R extends T> T getComponent(Class<T> type, Class<R> implementation) {
config.bind(type, implementation);
T component = config.getContext().get(type).get();
return component;
}
- 把提取的两个变量inline回去
Component instance = getComponent(Component.class, ComponentWithDefaultConstructor.class);
- 复制上面提取的方法到这个测试里面
- 删除掉之前的获取方法,只留场景准备和绑定的代码
@Test
@DisplayName("should bind type to a class with inject constructor")
public void should_bind_type_to_a_class_with_inject_constructor() {
Dependency dependency = new Dependency() {
};
config.bind(Dependency.class, dependency);
Component instance = getComponent(Component.class, ComponentWithInjectConstructor.class);
assertNotNull(instance);
assertSame(dependency, ((ComponentWithInjectConstructor) instance).getDependency());
}
- 也是复制方法过来,把bind Component和ComponentWithInjectConstructor的方法名,直接改成了上面提取的方法
- 删除掉了之前获取的方法,跑测试
@Test
@DisplayName("should bind type to a class with transitive dependencies")
public void should_bind_type_to_a_class_with_transitive_dependencies() {
config.bind(Dependency.class, DependencyWithInjectConstructor.class);
config.bind(String.class, "indirect dependency");
Component instance = getComponent(Component.class, ComponentWithInjectConstructor.class);
assertNotNull(instance);
Dependency dependency = ((ComponentWithInjectConstructor) instance).getDependency();
assertNotNull(dependency);
assertEquals("indirect dependency", ((DependencyWithInjectConstructor) dependency).getDependency());
}