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. 接口注入(用的很少,不聊)
相关文章
相关标签/搜索