学习DI--第一篇

来源:互联网 发布:apache基金会如何赚钱 编辑:程序博客网 时间:2024/06/05 01:21

解耦

高度耦合

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

解耦

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

使用Mock测试解耦

import static org.mockito.Mockito.*;//一种新的导入方式,添加static只导入静态的方法,不加则导入所有的方法,可以在文件中不加"类名."直接使用方法名即可@Testpublic 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).out}"/>    </bean>

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

import ...Knight;import ...Quest;import ...SomeQuest;@Configurationpublic class knightConfig{    @Bean    public Knight Knight(){        // 注意此处调用的方法        return new BraveKnight(quest());    }    // 构建 Quest bean    @Bean    public Quest quest(){        return new SomeQuest(System.out);    }}
0 0
原创粉丝点击