IOC: 反转控制   Inverse Of Control

DI:依赖注入 Dependency Injection

目的:完成程序的解耦合

解释:在应用系统的开发过程中,有spring负责对象的创建,对象依赖关系的组装,对象属性的初始化,程序员只需要在程序接收spring创建的对象即可。

Object obj= new Object();

IOC :  Object obj;  等着接收spring容器创建好的对象,在程序中将对象的创建的权限交出,反转到spring容器中。

DI:  某个对象需要依赖的其他对象,由spring容器完成所需要依赖对象的赋值

1 使用IOC完成三层结构的解耦合

1.1 搭建三层结构

建立Dao层接口:

 package org.guangsoft.dao;
/***
* 定义dao接口
* ***/
public interface UsersDao
{
public void saveUsers();
}

Dao层接口的实现类

 package org.guangsoft.dao.impl;
import org.guangsoft.dao.UsersDao;
//dao实现类
public class UsersDaoImpl implements UsersDao
{
@Override
public void saveUsers()
{
System.out.println("---------将对象保存到数据库--------");
}
}

建立service接口

 package org.guangsoft.service;
/***
* 用户业务接口
* **/
public interface UsersService
{
public void addUsers();

业务层接口的实现类

 package org.guangsoft.service.impl;
import org.guangsoft.dao.UsersDao;
import org.guangsoft.service.UsersService;
/***
* 用户业务接口实现类
* ***/
public class UsersServiceImpl implements UsersService
{
// 以前:创建Dao对象
private UsersDao usersDao;
@Override
public void addUsers()
{
System.out.println("-----------调用Dao层的方法--------------");
usersDao.saveUsers();
}

建立Action

 package org.guangsoft.service.impl;
import org.guangsoft.dao.UsersDao;
import org.guangsoft.service.UsersService;
/***
* 用户业务接口实现类
* ***/
public class UsersServiceImpl implements UsersService
{
// 以前:创建Dao对象
private UsersDao usersDao;
@Override
public void addUsers()
{
System.out.println("-----------调用Dao层的方法--------------");
usersDao.saveUsers();
}

1.2使用spring管理三层的依赖

 <?xml version="1.0" encoding="UTF-8"?>
<!-- 到入xml文件的约束 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p" 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-4.1.xsd">
<!-- 1 实例化Dao对象 id:完成对象的引用 class:指定需要创建的对象对应的类的完全限定名 -->
<bean id="usersDao" class="org.guangsoft.dao.impl.UsersDaoImpl">
</bean>
<!-- 2实例化service -->
<bean id="usersService" class="org.guangsoft.service.impl.UsersServiceImpl">
<!-- property:完成对象属性的注入(赋值) value:如果是简单的类型使用value(String,基本类型对应的包装类型) ref:完成对应的引用 -->
<property name="usersDao" ref="usersDao"></property>
</bean>
<!-- 3实例化Action对象 -->
<bean id="usersAction" class="org.guangsoft.action.UsersAction">
<property name="usersService" ref="usersService"></property>
</bean>
</beans>

1.3三层结构的测试

 package org.guangsoft.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.guangsoft.action.UsersAction;
public class TestSpring
{
@Test
public void testHelloSpring()
{
// 加载spring的配置文件,获得spring的bean容器
ApplicationContext ac
= new ClassPathXmlApplicationContext("applicationContext.xml");
// 从bean容器中获得需要的对象
UsersAction usersAction = (UsersAction) ac.getBean("usersAction");
// 调用action的方法
usersAction.userReg();
}

理解spring的IOC 或者 DI:完成对象依赖的解耦合

2 不同类型属性的注入

2.1简单类型属性

 <!-- 实例化Pet类的对象 -->
<bean id="pet" class="org.guangsoft.test.Pet">
<!-- 给属性赋值 简单类型的属性使用property标签的value属性赋值 javabean对象使用property标签的ref属性赋值
调用set方法赋值 1 必须生成属性对应的set方法 2 set注入 -->
<property name="pid" value="100100"></property>
<property name="pnames" value="旺财"></property>
</bean>
<!-- 使用构造注入 -->
<bean id="pet2" class="org.guangsoft.test.Pet">
<!-- 使用构造方法给属性赋值 1 根据constructor-arg标签的个数,找对应的构造方法 2 默认constructor-arg的顺序和构造方法的参数顺序是一致的
3 简单类型使用value,如果参数对象使用ref -->
<constructor-arg value="小强"></constructor-arg>
<constructor-arg value="120120"></constructor-arg>
</bean>

2.2javabean类型

Set或者构造注入:注入的时候使用ref注入

2.3集合类型属性

 <!-- 实例化Pet对象,给集合属性注入值 -->
<bean id="pet3" class="org.guangsoft.test.Pet">
<!-- 给List属性赋值 -->
<property name="lst">
<!-- list标签产生List对象 -->
<list>
<value>list第一个元素</value>
<ref bean="pt" /> <!-- list中的第二个元素 -->
</list>
</property>
<!-- 给set属性注入值 -->
<property name="st">
<set>
<value>set第一个元素</value>
<bean class="org.guangsoft.test.Pet"></bean><!-- 创建匿名对象,作为set的元素 -->
</set>
</property>
<!-- Map集合属性注入 -->
<property name="mp">
<map>
<entry>
<key>
<value>k1</value>
</key>
<value>v1</value>
</entry><!-- map集合中第一个元素 -->
<entry>
<key>
<value>k2</value>
</key>
<!-- 创建匿名对象,作为set的元素 -->
<bean class="org.guangsoft.test.Pet"></bean>
</entry><!-- map集合中第二个元素 -->
</map>
</property>
<!-- Properties集合属性注入(重点) Properties:处理.properties文件,该文件中的键值对象都是字符串 -->
<property name="pps">
<props>
<prop key="k1">v1</prop>
<prop key="k2">v2</prop>
</props>
</property>
</bean> 

3 注入方式的总结

Set注入:调用属性对应的set方法

    简单类型的属性使用property标签的value属性赋值

javabean对象使用property标签的ref属性赋值

调用set方法赋值

1   必须生成属性对应的set方法

2 set注入

构造注入:调用构造方法给属性赋值

使用构造方法给属性赋值

1 根据constructor-arg标签的个数,找对应的构造方法

2 默认constructor-arg的顺序和构造方法的参数顺序是一致的

3 简单类型使用value,如果参数对象使用ref

Spring控制反转与依赖注入(IOC、DI)的更多相关文章

  1. spring 控制反转与依赖注入原理-学习笔记

    在Spring中有两个非常重要的概念,控制反转和依赖注入:控制反转将依赖对象的创建和管理交由Spring容器,而依赖注入则是在控制反转的基础上将Spring容器管理的依赖对象注入到应用之中: 所谓依赖 ...

  2. Spring 控制反转和依赖注入

    控制反转的类型 控制反转(IOC)旨在提供一种更简单的机制,来设置组件的依赖项,并在整个生命周期管理这些依赖项.通常,控制反转可以分成两种子类型:依赖注入(DI)和依赖查找(DL),这些子类型各自又可 ...

  3. Spring控制反转(依赖注入)的最简单说明

    1.常规方式实现实例化 1.1已有角色如下: 一个接口Interface,两个接口实现类InstatnceA.InstanceB,一个调用类User 1.2当前实例化InstanceA如下: Inte ...

  4. 对spring控制反转以及依赖注入的理解

    一.说到依赖注入(控制反转),先要理解什么是依赖. Spring 把相互协作的关系称为依赖关系.假如 A组件调用了 B组件的方法,我们可称A组件依赖于 B组件. 二.什么是依赖注入. 在传统的程序设计 ...

  5. 在DoNetMVC中使用控制反转和依赖注入【DI】

    本次是在MVC5中使用Autofac 第一步:程序包管理器控制台 Install-Package Autofac.MVC5 引入nuget包 这样成功之后,会在引用中出现两个DLL,分别是Autofa ...

  6. IOC/DI控制反转与依赖注入

    IOC/DI控制反转与依赖注入 IOC和DI表现的效果的是一样的只不过对于作用的对象不同,有了不一样的名字. 先用一个现实的例子来说明IOC/DI表现出来的效果.

  7. Spring IOC&DI 控制反转和依赖注入

    控制反转(Inversion of Control,缩写为IOC),它是把你设计好的对象交给spring控制,而不再需要你去手动 new Object(); 网上对于IOC的解释很多,对程序员而言,大 ...

  8. Spring专题2: DI,IOC 控制反转和依赖注入

    合集目录 Spring专题2: DI,IOC 控制反转和依赖注入 https://docs.spring.io/spring/docs/2.5.x/reference/aop.html https:/ ...

  9. 控制反转和依赖注入(对IOC,DI理解+案例)

    理解 控制反转说的官方一点就是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其实就是一种设计思想,大概思想就是把设计好的对象交给容器控制,而不是在你内部直接控制. 依赖注入是控制反 ...

随机推荐

  1. SQL Server数据库邮件配置

    一.数据库邮件介绍 数据库邮件是从SQL Server数据库引擎中发送电子邮件的企业解决方案,通过使用数据库邮件,数据库应用程序可以向用户发送电子邮件.邮件中可以包含查询结果,还可以包含来自网络中任何 ...

  2. jquery获取datagrid多选值

    var checkedItems = $('#dg').datagrid('getChecked'); $.each(checkedItems, function (index, item) { al ...

  3. 3.聚类–K-means的Java实现

    K-means的步骤 输入: 含n 个样本的数据集,簇的数据K 输出: K 个簇 算法步骤: 1.初始化K个簇类中心C1,C2,---Ck (通常随机选择) 2.repeat 步骤3,4 3,将数据集 ...

  4. Inno Step 安装包程序 写INI配置文件脚本

    [INI]Filename: "{app}\Config\config.ini"; Section: "config";Key: "name" ...

  5. servlet之session添加和移除的两种方式

    Java Session 介绍 一.添加.获取session 1.项目结构 2.jar包 3.web.xml文件 <?xml version="1.0" encoding=& ...

  6. APPCAN IDE中安装emmet插件

    1.首先打开APPCAN IDE 2.帮助(help)-安装新软件(install New sofaWare) 3.打开Install窗口,点击 Add,在Add Repository窗口中,Name ...

  7. ASP.NET后台输出js大全,页面顶部、form表单中前面与后面、和UpdatePanel(ScriptManager、AJAX)输出JS

    Response.Write 与   Page.ClientScript.RegisterStartupScript 与 Page.ClientScript.RegisterClientScriptB ...

  8. nginx反向代理、动静分离

    环境:根据http://www.cnblogs.com/zzzhfo/p/6032095.html配置 方法一:根据目录实现动静分离 在web01创建image并上传一张图片作为静态页面 [root@ ...

  9. Pythhon 字典 key in dict 比 dict.has_key (key)效率高 为什么?

    has_key是去取key对应的值,时间复杂度在最优情况下为O(1); in 是直接去dict.__contains__这个保存这key的list中去获取,相当与是去数组中获取. 所以in 比has_ ...

  10. Python 命名空间

    通俗的来说,Python中所谓的命名空间可以理解为一个容器.在这个容器中可以装许多标识符.不同容器中的同名的标识符是不会相互冲突的.理解python的命名空间需要掌握三条规则: 第一,赋值(包括显式赋 ...