IOC:spring-依赖注入

依赖注入
public class TextEditor {
   private SpellChecker spellChecker;
   public TextEditor(SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }
}

      比如说我有一个编辑器(TextEditor),现在需要在编辑器中实现拼写检查的功能,我们不需要知道具体的拼写功能怎么实现

那个可以交给其他人去实现,我们只需要在实例化的时候传入spellChecking即可

基于构造函数的依赖注入

beans.xml

    <bean id="textEditor" class="com.test.TextEditor">
        <constructor-arg index="0" ref="spellChecker"></constructor-arg>
        <constructor-arg index="1" value="$11"></constructor-arg>
    </bean>
    <bean id="spellChecker" class="com.test.SpellChecker"></bean>

SpellChecker.java

    public SpellChecker(){
        System.out.println("SpellChecker ininting...");
    }
    public void spellCheck(){
        System.out.println("spellChecking...");
    }

TextEditor.java

public class TextEditor {
    private SpellChecker spellChecker;
    private String money;    
    public String getMoney() {
        return money;
    }
    public void setMoney(String money) {
        this.money = money;
    }
    public TextEditor(SpellChecker spellChecker,String money){
        System.out.println("Inside spellChecker");
        this.spellChecker=spellChecker;
        this.money=money;
    }
    public void spellCheck(){
        spellChecker.spellCheck();
    }
}

MainApp.java

    public static void main(String[] args) {
        System.out.println("******1");
        ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
        System.out.println("******2");
        TextEditor textEditor=(TextEditor)context.getBean("textEditor");
        System.out.println("******3");
        textEditor.spellCheck();
        String str=textEditor.getMoney();
        System.out.println(str);
    }

 结果与分析:

******1

SpellChecker ininting...

Inside spellChecker

******2

******3

spellChecking...

在获取bean之前,已经完成了bean的初始化和注入了

在这里除了注入spellChecker之外,还注入了一个参数,money

基于set的依赖注入

beans.xml

这里beans.xml与基于构造函数的依赖注入的区别是:属性改为了property,name是属性名,后面是注入的值或引用

    <bean id="textEditor" class="com.test.TextEditor">
        <property name="spellChecker" ref="spellChecker" />
        <property name="money" value="@qq" />
    </bean>
    <bean id="spellChecker" class="com.test.SpellChecker"></bean>

TextEditor.java

在基于set的依赖注入中,当容器调用无参的构造函数时,会去读取beans.xml,根据java代码中的set来讲beans.xml中的属性值注入

这就需要注意两点:1.在定义实体类时,若是定义了带参构造函数,那么系统就不会生成默认无参构造函数,就会报错。

2,在定义实体类时需要定义set函数,不然在注入时调用set函数会报错。

public class TextEditor {
    private SpellChecker spellChecker;

    public void setSpellChecker(SpellChecker spellChecker) {
        this.spellChecker = spellChecker;
    }

参考文章:w3school教程

posted @ 2018-09-29 17:42  弱水三千12138  阅读(196)  评论(0编辑  收藏  举报