Spring依賴注入(DI)

1.面向接口編程

什麼是面向接口編程呢?我我的認爲,就是在咱們的系統分析和架構中,首先,分清層次和依賴關係,每一個層次不直接向上層提供服務,即,咱們不須要在上層中實例化。向上層僅需提供一組接口功能,具體的實現,容許有多個實現類,具體的實現交給實現類來完成。mysql

舉個例子,咱們的dto實現是交給service,而service實現依賴dao,若是咱們在service中用到了dao的實例,那麼若是dao中換了一種實現,或者是多加了一種實現,咱們都須要在service中去修改,這樣很麻煩。譬如,常見的登陸,本來咱們採用的oracle,如今,假若換成了mysql或者是XML那麼咱們的service就須要改動。若是咱們將dao定義成接口,而在service中牢牢只是聲明一個dao,具體的實例,咱們放在配置文件中,那麼最後咱們dao的改變,只須要改動配置文件便可(spring注入依賴就是這樣的)。spring

1.Spring注入依賴(DI)

注入依賴的原理,固然用到就是xml解析,和動態代理,具體的我都有寫過相關博客sql

  1. Setter方法注入(示例)
    1. 導入相關jar包,我用的是spring2.5,導入spring.jar和commons-logging.jar便可
    2. 假設咱們有一個People類(這裏咱們須要定義屬性的setter方法,getter方法能夠不須要)
package edu.hubu.model;
public class People {
	private String name;
	private int age;
	private String addr;
	public People(String name, int age, String addr) {
		super();
		this.name = name;
		this.age = age;
		this.addr = addr;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	@Override
	public String toString() {
		return "People [addr=" + addr + ", age=" + age + ", name=" + name + "]";
	}
}
1. 而後咱們配置applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
     <!--
     	在spring DI中注入方式主要有三種
     	1.setter注入:在類中對應屬性的setter方法
     	2.構造器注入
     	3.接口注入 
      -->
	<bean id="people" class="edu.hubu.model.People">
		<property name="name" value="zhangsan"></property>
		<property name="age" value="20"></property>
		<property name="addr" value="湖北武漢"></property>
	</bean>
</beans>
1. 在Test中運行
package edu.hubu.test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import edu.hubu.model.People;
public class Test {
	public static void main(String[] args) {
		BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
		Object o = factory.getBean("people");
		People people = (People)o;
		System.out.println(people);
	}
}
1. 最後執行結果就是People類中toString方法打印出來的東西。
  1. 構造器注入(在類中定義的指定構造器,在配置中對應的構造器的指定屬性賦值)
    1. 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
     <!--
     	在spring DI中注入方式主要有三種
     	1.setter注入:在類中對應屬性的setter方法
     	2.構造器注入
     	3.接口注入 
      -->
	<bean id="people" class="edu.hubu.model.People">
		<constructor-arg value="18" index="1"></constructor-arg>
		<constructor-arg value="張三" index="0"></constructor-arg>
		<constructor-arg value="湖北武漢" index="2"></constructor-arg>
	</bean>
</beans>
1. 這裏咱們用到的<constructor-arg>標籤進行屬性的賦值。這裏有一點值得注意的是,這裏的index,能夠不須要,可是,構造器輸入容易引發屬性混淆的問題,就是,若是咱們這裏的順序和構造器中的順序不同,可能就會報錯,因此,咱們經常加上index,利用index的值取保證這裏的順序和構造器中屬性順序一致。
  1. 接口注入(用的很少,不聊)
相關文章
相關標籤/搜索