什么是面向接口编程呢?我我的认为,就是在咱们的系统分析和架构中,首先,分清层次和依赖关系,每一个层次不直接向上层提供服务,即,咱们不须要在上层中实例化。向上层仅需提供一组接口功能,具体的实现,容许有多个实现类,具体的实现交给实现类来完成。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的值取保证这里的顺序和构造器中属性顺序一致。