什么是依赖注入:
Spring 使用DI来实现IoC功能。常用有3种DI注入方式。
接口注入(Interface Injection) Set注入(setter injection) 构造注入(constructor injection)。
准备工作
定义与要注入的对象和接口。
sample用的DB类和接口
①.DataBase 接口
package ch3;
public interface DataBase {
public void getData();
}
②.实现DataBase接口的OracleDataBase 类
package ch3;
public class OracleDataBase implements DataBase {
@Override
public void getData() {
System.out.println("Get Oracle Data");
}
}
③.实现DataBase接口的SqlServerDataBase 类
package ch3;
public class SqlServerDataBase implements DataBase {
@Override
public void getData() {
System.out.println("Get SqlServer Data");
}
}
1.接口注入(interface injection)
接口注入指的就是在接口中定义要注入的信息,并通过接口完成注入。
具体步骤如下
①.编写一个接口IBuniness,各种数据库的注入将通过这个接口进行。代码如下
package ch3;
public interface IBusiness {
public void createDI(DataBase db);
}
②.任何想要使用数据库实例的类都必须实现这个接口,业务逻辑类Business实现这个接口IBusiness。代码如下
package ch3;
public class Business implements IBusiness {
private DataBase db;
@Override
public void createDI(DataBase db) {//接口注入
this.db = db;
}
// 根据注入的数据库,从XXX数据库中取得数据。
public void getData(){
db.getData();
}
}
3.编写测试类TestBusiness。代码如下
package ch3;
public class TestBusiness {
private Business business = new Business();
// 根据注入的数据库类,从oracle中取得数据库。
public void getData() {
business.createDI(new OracleDataBase()); // 注入实际的数据库类型。如要变更式样,只需改变此处即可,达到重用目的。
business.getData();
}
}
如果要完成依赖关系注入的对象,必须实现IBusiness接口。
2.Set注入(setter injection)
Set注入指的就是在接受注入的类中定义一个Set方法,并在参数中定义一个需要注入的元素。为了让类Buniess接受DataBase的注入,需要为它定义一个Set方法来接受DataBase的注入。
代码如下
package ch3;
public class Business {
private DataBase db;
public void setDataBase(DataBase db) { // set注入
this.db = db;
}
public void getData() {
db.getData();
}
}
3.构造注入(constructor injection)
构造注入指的就是在接受注入的类中定义一个构造方法,并在参数中定义需要注入的元素。代码如下
package ch3;
public class Business {
// Constructor Injection
private DataBase db;
public Business(DataBase db) {// Constructor Injection
this.db = db;
}
public void getData() {
db.getData();
}
}
依赖注入或者说是控制反转,说白了就是使用了配置文件,这种思想的唯一好处就是增加了模块的重用性灵活性。
一般配置文件里存的都是数据,键值之类的。Spring的配置文件把要引用类和要给类传的参数都放到配置文件里,这样比以前写死在程序里更灵活,因此更具重用性。
依赖注入的意义
让组件依赖于抽象,当组件要与其他实际对象发生依赖关系时,通过抽象来注入依赖的实际对象。
Spring 支持Set注入和构造注入。但推荐使用Set注入。
注:
Constructor注入的xml配置
<bean id="helloWorld" class="com.gc.action.HelloWorld">
<constructor-arg index="0">
<value>HelloWorld</value>
</constructor-arg>
</bean>
· constructor-arg 通过构造方式来注入参数
· index="0" 表示是构造方法中的第一个参数,如果只有一个参数,则可以不用设置这个属性值。
Set注入的xml配置
<bean id="helloWorld" class="com.gc.action.HelloWorld">
<property name="msg">
<value>HelloChina!</value>
</property>
</bean>
按照以上方法配置好后,利用ApplicationContext类来取得xml中配置的bean。方法如下
// 利用ApplicationContext来取得spring的配置文件
ApplicationContext cx = new
FileSystemXmlApplicationContext("/WEB-INF/config.xml");-->config.xml的默认路径是工程跟目录。其他路径时则要加上相对路径名。
// 获得配置xml中配置的bean
HelloWorld hello = (HelloWorld)cx.getBean("hello");
System.out.println("MSG="+hello.getMsg());