Type1IoC就是Interface Injection,使用Type1 IoC的时候要求实现接口,对象所在的容器也会使用这个接口.容器同事知道这个接口上所规定的方法,所以可呼叫实现接口的对象来完成依赖关系注射.
如 容器的API申明了 一个IDependency接口
IDependency.java
public interface IDependency{
public void createDependecy(Map depend);
}
接着我们让Business 类实现这个接口
Business.java
public class Business implements IDependency{
private Map dependObjects;
public void createDependency(Map dobject){
this.dependObjects=dobject;
//something another code
}
}
这样如果要实现依赖关系注入的对象,必须实现IDependency接口.并将其让容器管理,由于Business实现了容器所规定的接口,这样就使得Business依赖于容器的API.如果以后要独立出来,那么就必须修改代码了.所以Type1IoC有较强的入侵性,使用它来实现注射.会使得应用程序或组件依赖容器.因而降低了重用性.
所以Spring 推荐 Type2IoC 其实就是Setter Injection.写一个Bean
HelloBean.java
package kafei.time;
public class HelloBean {
private String helloWord;
public void setHelloWord(String helloWord) {
this.helloWord = helloWord;
}
public String getHelloWord() {
return helloWord;
}
}
配置Spring文件
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="helloBean"
class="kafei.time.HelloBean">
<property name="helloWord">
<value>Hello!Justin!</value>
</property>
</bean>
</beans>
下面写一个简单的测试文件
SpringDemo.java
package kafei.time;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
public class SpringDemo {
public static void main(String[] args) {
Resource rs =
new FileSystemResource("beans.xml");
BeanFactory factory =
new XmlBeanFactory(rs);
HelloBean hello =
(kafei.time.HelloBean) factory.getBean("helloBean");
System.out.println(hello.getHelloWord());
}
}
这就是一个Type2IoC,以后要改变输出的内容只要在配置文件中修改一下就可以了.
Type3IoC 是Construtor Injection这个Spring也支持
HelloBean.java
package kafei.time;
public class HelloBean {
private String name;
private String helloWord;
// 建议有要无参数建构方法
public HelloBean() {
}
public HelloBean(String name, String helloWord) {
this.name = name;
this.helloWord = helloWord;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setHelloWord(String helloWord) {
this.helloWord = helloWord;
}
public String getHelloWord() {
return helloWord;
}
}
配置spring文件
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="helloBean"
class="kafei.time.HelloBean">
<constructor-arg index="0">
<value>Justin</value>
</constructor-arg>
<constructor-arg index="1">
<value>Hello</value>
</constructor-arg>
</bean>
</beans>
有多个参数的话,用index来指定位置,第一个参数索引值为0,第二个是1,依次类推
测试文件和上面一个差不多没有什么区别为了节省篇幅就不写了.
这是我初学spring的一些文章.个人认为还是Type2IoC好用,不过对于一些第一次注射后不能在修改的如DAO注射,使用Type3也可以.
上面的例子还是在spring1.28环境下的.如果要到2.0环境,请各位自己修改.
隔几天写一个关于spring 属性参考的文章,