依赖注入(Dependency Injection,DI)
让组件依赖于抽象,当组件要与其他实际对象发生依赖关系时,通过抽象来注入依赖的实际对象。
三种注入方式:
- 接口注入(interface injection):在接口中定义要注入的信息,并通过接口完成注入。
- Set注入(setter injection):在接受注入的类中定义一个Set方法,并在参数中定义需要注入的元素。
- 构造注入(constructor injection):在接受注入的类中定义一个构造方法,并在参数中定义需要注入的元素。
特点:
- Set注入:对象建立好后,使用set注入进行设定。相关数据成员或资源在执行时可能会被更改。
- 构造注入:在对象建立时就准备好所有的资源,同时需要记住构造函数中多个参数的位置和参数的含义,因此不易记忆。如果开发人员想要让一些数据成员或资源变为只读或是私有,使用构造注入比较简单。
实现
(1)接口注入
- 定义接口及方法
- 实现接口及方法
- 配置文件设置来源
- 使用接口及方法
//*******Hello .java***************
public interface Hello { //(1)定义接口及方法
//该方法同来输出问候语
public String doSalutation();
}
//*******ChHello.java***************
public class ChHello implements Hello { //(2)实现接口及方法
public String msg = null;
public void setMsg(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
@Override
public String doSalutation() {
// TODO Auto-generated method stub
return "你好 " + this.msg;
}
}
<!--*******configChEn.xml***************-->
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="HelloWorld" class="com.gc.action.ChHello"> <!--(3)设置来源-->
<property name="msg">
<value>gf</value>
</property>
</bean>
</beans>
//*******TestHelloWorldChEn.java***************
public class TestHelloWorldChEn {
public static void main(String[] args) {
// TODO Auto-generated method stub
//通过ApplicationContext来获取Spring的配置文件
ApplicationContext actx = new FileSystemXmlApplicationContext("configChEn.xml");
//通过Bean的id来获取Bean
Hello hello = (Hello)actx.getBean("HelloWorld"); //(4)使用接口及其方法
System.out.println(hello.doSalutation());
}
}
(2)Set注入
- 建立set方法
- 配置文件设置msg的值
//*******HelloWorldSet.java***************
public class HelloWorldSet {
private String msg = null;
public String getMsg() {
return msg;
}
public void setMsg(String msg) { //(1)建立Set方法
this.msg = msg;
}
}
<!--*******configSet.xml***************-->
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="HelloWorldSet" class="com.gc.action.HelloWorldSet">
<property name="msg"> <!--(2)设置msg的值-->
<value>HelloWorldSet</value>
</property>
</bean>
</beans>
//*******TestHelloWorldSet.java***************
public class TestHelloWorldSet {
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext actx = new FileSystemXmlApplicationContext("configSet.xml");
HelloWorldSet helloWorldSet = (HelloWorldSet)actx.getBean("HelloWorldSet");
System.out.println(helloWorldSet.getMsg());
}
}
(3)构造注入
- 定义构造方法
- 配置文件设置构造函数参数
//*******HelloWorldStruct.java***************
public class HelloWorldStruct {
public String msg = null;
public HelloWorldStruct(String msg) { //(1)定义构造方法
this.msg = msg;
}
public String getMsg() {
return msg;
}
}
<!--*******configStruct.xml***************-->
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="HelloWorldStruct" class="com.gc.action.HelloWorldStruct">
<!--constructor-arg表示通过构造函数进行注入-->
<!--index="0"表示构造函数的第一个参数-->
<constructor-arg index="0"> <!--(2)设置构造函数的参数-->
<value>HelloWorldStruct</value>
</constructor-arg>
</bean>
</beans>
//*******TestHelloWorldStruct.java***************
public class TestHelloWorldStruct {
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext actx = new FileSystemXmlApplicationContext("configStruct.xml");
HelloWorldStruct helloWorldStruct = (HelloWorldStruct)actx.getBean("HelloWorldStruct");
System.out.println(helloWorldStruct.getMsg());
}
}