平时我们老说的控制反转依赖注入是什么东西?其实说白了就是一个松紧耦合的问题,咱们可以想一想,一个javabean里面可能会有很多属性比如像下面的代码:
public class KnightOfTheRoundTable implements Knight { private String name; private Quest quest; public KnightOfTheRoundTable(String name) { this.name = name; } public Object embarkOnQuest() throws QuestFailedException { System.out.println(quest.embark()) ; return null; } public void setQuest(Quest quest) { this.quest = quest; } public String getName() { return name; } }
这是一个再普通不过的javabean了,它有两个属性,分别是String型的name和Quest型的quest。如果我们按照一般的逻辑想注入填充这两个属性,我们只能用set方法,并且要硬编码重新编译程序。但是如果name和quest是从配置文件中配置注入呢?这样我们就可以随时改变配置文件来实现无需重新编译程序而且很轻松的注入属性。注入属性这个事情交给了配置文件来做,这就是所谓的控制反转,控制权转移了,交给了配置文件了,而不是程序了。而依赖注入其实就是依赖配置文件对javabean的属性进行注入,这其实是一个意思。好了,让我们看看配置文件是怎么写的,这里的注入有两种方式,一种是通过构造函数注入,另一种是利用set方法注入
看下面代码:
<bean id="quest" class="com.ioc.HolyGrailQuest"/>
<bean id="knight" class="com.ioc.KnightOfTheRoundTable">
<constructor-arg value="Bedivere" />
<property name="quest"
ref="quest" />
</bean>
这是两个bean,一个是id为quest的bean,他其实就是一个Quest类型的bean。还有一个是knight,它其实就是KnightOfTheRoundTable。KnightOfTheRoundTable里面有两个属性,其中name属性可以以构造函数的方式注入,就是上面的<constructor-arg value="Bedivere" />,另外一个quest属性用set方法注入,就是<property name="quest" ref="quest" />。注意,如果quest也有构造函数的方式注入,那配置文件可以这样写:<constructor-arg ref="quest" />。 注意无论是构造方式或者set方式里面的配置文件中的value属性的使用,实际的属性是String或者int等都没区别,一样是用value属性,spring会根据字段属性自动决定正确的类型