依赖注入
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教程