什麼是面向接口編程呢?我我的認爲,就是在咱們的系統分析和架構中,首先,分清層次和依賴關係,每一個層次不直接向上層提供服務,即,咱們不須要在上層中實例化。向上層僅需提供一組接口功能,具體的實現,容許有多個實現類,具體的實現交給實現類來完成。mysql
舉個例子,咱們的dto實現是交給service,而service實現依賴dao,若是咱們在service中用到了dao的實例,那麼若是dao中換了一種實現,或者是多加了一種實現,咱們都須要在service中去修改,這樣很麻煩。譬如,常見的登陸,本來咱們採用的oracle,如今,假若換成了mysql或者是XML那麼咱們的service就須要改動。若是咱們將dao定義成接口,而在service中牢牢只是聲明一個dao,具體的實例,咱們放在配置文件中,那麼最後咱們dao的改變,只須要改動配置文件便可(spring注入依賴就是這樣的)。spring
注入依賴的原理,固然用到就是xml解析,和動態代理,具體的我都有寫過相關博客sql
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方法打印出來的東西。
<?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的值取保證這裏的順序和構造器中屬性順序一致。