您的位置:首页 > 其它

学习DI--第一篇

2016-12-01 00:20 176 查看

解耦

高度耦合

// 构造器内
public Knight(){
this.quest = new SomeQuest();
}


解耦

public Knight(Quest quest){
// 不与固定的quest绑定 任何implement了Quest的实体都可以被关联
this.quest = quest;
}


使用Mock测试解耦

import static org.mockito.Mockito.*;//一种新的导入方式,添加static只导入静态的方法,不加则导入所有的方法,可以在文件中不加"类名."直接使用方法名即可
@Test
public void testMock(){
Quest mockQuest = mock(Quest.class);
Knight knightTest = new knight(mockQuest);
knightTest.embarkQuest();
verify(mockQuest,times(1)).embark();
}


注入

mock的对象也需要获得一个属性呢?

// 如果Quest的某个实现类依赖某个属性,如何将该属性也关联到呢?
public class SomeQuest implements Quest{
private PrintStream stream;

public SomeQuest(PrintStream stream){
this.stream = stream;
}

public void embark(){
stream.print("it relay on a stream!")
}
}


通过XML配置构造器注入

<bean id="knight" class="org....*** Knight">
<constructor-arg ref="quest"/>
</bean>
<bean id="quest" class="org....*** Quest">
<constructor-arg value="#{T(System).o
92b4
ut}"/>
</bean>


新特性–通过class文件配置config

import ...Knight;
import ...Quest;
import ...SomeQuest;
@Configuration
public class knightConfig{
@Bean
public Knight Knight(){
// 注意此处调用的方法
return new BraveKnight(quest());
}

// 构建 Quest bean
@Bean
public Quest quest(){
return new SomeQuest(System.out);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: