为什么需要“依赖注入”
Case 1
public class Foo {
private Bar bar;
public Foo() {
bar = new Bar();
}
public void doSomething(int key) {
String result = bar.getResult(key);
}
}
反模式 ,在构造函数中,初始化了合作类,导致:
• 外部使用者不知道 Foo 里面还依赖了 Bar
• 无法对Bar单元测试,体现在 bar.getResult() 返回真实值,如果和网络、数据库、IO 打交道的话,这是一个很耗时的动作
Case 2
public class Foo {
private Bar bar=new Bar();
public Foo(){
}
public void doSomething(int key){
String result = bar.getResult(key);
}
}
反模式,虽然没有在构造函数中初始化 Bar 对象,但在字段中直接初始化了 Bar 对象,问题和上面一样
Case 3 使用 Guice 来对依赖进行管理
public class Foo {
private Bar bar ;
@Inject
public Foo(Bar bar) {
this.bar = bar;
}
public String doSomething(int key) {
return bar.getResult(key);
}
}
对于使用 Foo 的用户而言,一眼就知道 Foo 内部需要 合作类 Bar, 明白了 Foo 的职责,同时 @Inject 将依赖对象注入,解耦的同时还方便测试
public class TestCase {
@Mock
private Bar bar;
@Before
public void before(){
MockitoAnnotations.initMocks(this);
}
@Test
public void test(){
when(bar.getResult(eq(1))).thenReturn("jack");
Foo foo=new Foo(bar);
String result = foo.doSomething(1);
Assert.assertEquals("jack",result);
}
}
上面可以看到,Mock 了 Bar 对象,Bar 对象的 getResult() 可能是一个比较耗时的功能,所以对它进行了Stub,同时 Foo 不依赖真实的 Bar 对象。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· 开源的 DeepSeek-R1「GitHub 热点速览」
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 揭秘 Sdcb Chats 如何解析 DeepSeek-R1 思维链
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
2013-10-07 SharePoint自动化部署,利用PowerShell 导出/导入AD中的用户