Spring依赖注入

IoC,用白话来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也 
就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转

IOC控制反转:说的是创建对象实例的控制权从代码控制剥离到IOC容器控制,实际就是你在xml文件控制,侧重于原理。

DI依赖注入:说的是创建对象实例时,为这个对象注入属性值或其它对象实例,侧重于实现。 
它们是spring核心思想的不同方面的描述。 

DI 和 IOC 
DI和IOC是差不多的概念。 
一个重要特征是接口依赖,是把对象关系推迟到运行时去确定.

DI是一个初始化实例的过程,分为三种

1.setter based

2.constructor based

3.interface based,

在spring 中就是应用前两种;但又不仅仅是初始化实例,而且是运用接口的概念去实现这种注入依赖。静态地看,只是依赖一个接口,但实际运行起来,是依赖一个实现了该 接口的具体类。

   

平常的Java开发中,程序员在某个类中需要依赖其它类的方法。

    通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理。

    Spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过Spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。

    依赖注入的另一种说法是"控制反转"。通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员。

    而控制反转是指new实例工作不由我们程序员来做而是交给Spring容器来做。

    Spring有多种依赖注入的形式,本篇文章仅介绍Spring通过xml进行IOC配置的方式。


setter注入: 一般情况下所有的java bean, 我们都会使用setter方法和getter方法去设置和获取属性的值,示例如下: 
public class namebean { 
String      name; 
public void setName(String a) { 
name = a; } 
public String getName() { 
return name; } 

我们会创建一个bean的实例然后设置属性的值,spring的配置文件如下: 
<bean id=”bean1″  > 
<property   name=”name” > 
<value>tom</value> 
</property> 
</bean> 
Spring会调用setName方法来只是name属性为tom 
构造方法注入:构造方法注入中,我们使用带参数的构造方法如下: 
public class namebean { 
String name; 
public namebean(String a) { 
name = a; 


我们会在创建bean实例的时候以new namebean(”tom”)的方式来设置name属性, Spring配置文件如下: 
<bean id=”bean1″ > 
<constructor-arg> 
<value>My Bean Value</value> 
</constructor-arg> 
</bean> 
使用constructor-arg标签来设置构造方法的参数。


1.Set注入

    这是最简单的注入方式,假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然后创建SpringDao的set方法(这是ioc的注入入口):

复制代码
package com.bless.springdemo.action; 
public class SpringAction { 
//注入对象springDao 
private SpringDao springDao; 
//一定要写被注入对象的set方法 
public void setSpringDao(SpringDao springDao) { 
this.springDao = springDao; 
} 

public void ok(){ 
springDao.ok(); 
} 
}
复制代码

   随后编写spring的xml文件,<bean>中的name属性是class属性的一个别名,class属性指类的全名,因为在SpringAction中有一个公共属性Springdao,所以要在<bean>标签中创建一个<property>标签指定SpringDao。<property>标签中的name就是SpringAction类中的SpringDao属性名,ref指下面<bean name="springDao"...>,这样其实是spring将SpringDaoImpl对象实例化并且调用SpringAction的setSpringDao方法将SpringDao注入:

复制代码
<!--配置bean,配置后该类由spring管理--> 
<bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 
<!--(1)依赖注入,配置当前类中相应的属性--> 
<property name="springDao" ref="springDao"></property> 
</bean> 
<bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean> 
复制代码

2.构造器注入

     这种方式的注入是指带有参数的构造函数注入,看下面的例子,我创建了两个成员变量SpringDao和User,但是并未设置对象的set方法,所以就不能支持第一种注入方式,这里的注入方式是在SpringAction的构造函数中注入,也就是说在创建SpringAction对象时要将SpringDao和User两个参数值传进来:

复制代码
public class SpringAction { 
//注入对象springDao 
private SpringDao springDao; 
private User user; 

public SpringAction(SpringDao springDao,User user){ 
this.springDao = springDao; 
this.user = user; 
System.out.println("构造方法调用springDao和user"); 
} 

public void save(){ 
user.setName("卡卡"); 
springDao.save(user); 
} 
} 
复制代码

     在XML文件中同样不用<property>的形式,而是使用<constructor-arg>标签,ref属性同样指向其它<bean>标签的name属性:

复制代码
<!--配置bean,配置后该类由spring管理--> 
<bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 
<!--(2)创建构造器注入,如果主类有带参的构造方法则需添加此配置--> 
<constructor-arg ref="springDao"></constructor-arg> 
<constructor-arg ref="user"></constructor-arg> 
</bean> 
<bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean> 
<bean name="user" class="com.bless.springdemo.vo.User"></bean> 
复制代码

     解决构造方法参数的不确定性,你可能会遇到构造方法传入的两参数都是同类型的,为了分清哪个该赋对应值,则需要进行一些小处理:
下面是设置index,就是参数位置:

<bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 
<constructor-arg index="0" ref="springDao"></constructor-arg> 
<constructor-arg index="1" ref="user"></constructor-arg> 
</bean> 

     另一种是设置参数类型:

<constructor-arg type="java.lang.String" ref=""/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值