Spring控制反转与依赖注入

来源:互联网 发布:用网络发短信的软件 编辑:程序博客网 时间:2024/04/30 05:55

概述

控制反转(Inversion of Control,IOC)与依赖注入(Dependency Injection,DI)是密切相关的两个概念。依赖注入可以看成是控制反转的一种实现方式

控制反转把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。控制反转强调对象由容器控制(控制的什么被反转了?就是:获得依赖对象的方式反转了)。

控制反转主要有两种实现方式:依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都使用这种方式;依赖注入(Dependency Injection):组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。
这里写图片描述

依赖注入方法

依赖注入方式有XML配置(spring.xml)和注解方式,这里我们介绍用XML方式

简单介绍几种经常使用的依赖注入方法:

  1. Set注入:最简单的注入方式。比如:一个SpringAction,类中需要实例化一个SpringDao对象(对数据库表进行操作),那么就可以定义一个private的SpringDao成员变量,然后创建SpringDao的set方法(ioc的注入入口
/** * SpringAction.java * @author xianggen * @date 2016年7月30日 上午10:55:28 */package com.xianggen.spring.action;public class SpringAction{    private SpringDao springDao;    public void setSpringDao(SpringDao springDao){        this.springDao=springDao;    }}

配置spring的xml文件

<beans>   <!-- 配置bean,配置后该类由spring管理 -->   <bean name="SpringAction" class="com.xianggen.spring.action.SpringAction">      <!-- 依赖注入,配置当前类中相应的属性 -->      <property name="SpringDao" ref="SpringDao"></property>   </bean>    <!-- 配置bean,配置后该类由spring管理 -->   <bean name="SpringDao" class="com.xianggen.spring.dao.SpringDao"></bean></beans>

2.构造器注入:是指带有参数构造函数注入

package com.xianggen.spring.action;public class SpringAction{    private SpringDao springDao;    private User user;    //通过构造方法注入两个对象:springDao,user    public SpringAction(SpringDao springDao,User user){        this.springDao=springDao;        this.user=user;    }}

配置XML:

<!-- 配置bean,配置后该类由spring管理 -->   <bean name="SpringAction" class="com.xianggen.spring.action.SpringAction">     <!-- 创建构造器注入,如果主类带有参数的构造方法则需要添加此配置 -->         <constructor-arg ref="SpringDao"></constructor-arg>     <constructor-arg ref="user"></constructor-arg>   </bean>    <!-- 配置bean,配置后该类由spring管理 -->   <bean name="SpringDao" class="com.xianggen.spring.dao.SpringDao"></bean>   <bean name="User" class="com.xianggen.spring.vo.User"></bean>

构造方法参数的不确定性,你可能会遇到构造方法传入的两参数都是同类型

bean name="SpringAction" class="com.xianggen.spring.action.SpringAction"> <constructor-arg index="0" ref="SpringDao"></constructor-arg> <constructor-arg index="1" ref="User"></constructor-arg> </bean> 

3.静态工厂注入

public class SpringAction { //注入对象 private FactoryDao staticFactoryDao; public void staticFactoryOk(){ //注入对象的set方法 public void setStaticFactoryDao(FactoryDao staticFactoryDao) {    this.staticFactoryDao = staticFactoryDao;    } }

配置文件与set方法有些不同:

<!--配置bean,配置后该类由spring管理--> <bean name="SpringAction" class="com.xianggen.spring.action.SpringAction" > <!--(3)使用静态工厂的方法注入对象,对应下面的配置文件<property name="staticFactoryDao" ref="staticFactoryDao"></property> </property> </bean> <!--(3)此处获取对象的方式是从工厂类中获取静态方法--> <bean name="staticFactoryDao" class="com.xianggen.spring.factory.DaoFactory" factory-method="getStaticFactoryDaoImpl"></bean>

4.实例工厂注入
大体上同静态工厂注入,只是取对象实例的方法不是静态的,需要首先new工厂类,再调用普通的实例方法

通过Spring创建的对象默认是单例的,如果需要创建多实例对象可以在<bean>标签后面添加一个属性:
<bean name="..." class="..." scope="prototype">

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 狗生小狗后几天不吃饭怎么办 还没满月的小兔子突然死了怎么办 宝宝小鸡被蚊子咬后肿得很大怎么办 不知道是哪知兔子下的小兔怎么办 兔子生完小兔不吃东西了怎么办 人工喂养七天的小羊拉希怎么办 仔兔出生3天吃过奶就尿怎么办 小兔子买回来两天不拉屎怎么办 大狗生了小狗把小狗咬死了怎么办 狗妈妈一直咬小狗的脐带怎么办 狗狗体内驱虫驱不干净怎么办 打老鼠脚被老鼠咬了怎么办 天正画的cad打开显示空白怎么办 苹果手机信息被拉进群聊怎么办 空调的控制线的报验资料怎么办 窗窗户罩子护栏上的瓦楞板怎么办 酸洗好的带钢容易返锈怎么办 化肥撤到小树苗上现在变黑了怎么办 尿素液烧的太慢了怎么办 天堂鸟肥料施多了黄叶了怎么办 死水塘养的鱼每天在死怎么办 北京的阿姆斯肥把苗都烧死了怎么办 纱窗被老鼠咬了个洞 怎么办 低电量模式下动态墙纸不能用怎么办 吃的包装袋执行标准错了怎么办 退换东西的时候外包装坏了怎么办 闲鱼买家以与描述不符退货怎么办 闲鱼买家申请退款又签收了怎么办 店铺买的手机是拆开过的怎么办 卖家以包装破损拒收快递怎么办 车辆迁出落户信封被自己拆开怎么办 快递签收了发现物品坏了怎么办 快递签收后发现货坏了怎么办 闲鱼退货有破损卖家要求赔偿怎么办 邮政快递收货后发现快递破损怎么办 中通把包裹发到别的省份去了怎么办 寄快递没拿单子但东西破损了怎么办 快递签收以后发现东西少了怎么办 淘宝时收到的货破损我该怎么办 淘宝买的冰箱七天无理由退货怎么办 截图放进ai中变得很模糊怎么办