Spring依赖注入

来源:互联网 发布:魔兽争霸数据查看器 编辑:程序博客网 时间:2024/06/16 08:13

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=""/>
0 0
原创粉丝点击