Spring的3种依赖注入方式

依赖注入(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());
	}
}
发布了71 篇原创文章 · 获赞 38 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/u012839256/article/details/105584645