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. 第2月第3天 egorefresh

    egorefresh是很老的下拉刷新,它是一个uiview,在uitableview 下拉的时候显示不同的界面. egorefresh和uitableview的耦合度很高,uitableview滚动和 ...

  2. C\C++ sizeof 陷阱&&总结

    今天使用动态数组,本来想通过sizeof 获取动态数据,结果出现了错误. 先对自己做个测试,能做出下面这个题目,并做出合理解释,可以不用往下看了. ][]; cout<< cout< ...

  3. HDU 5384 字典树、AC自动机

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5384 用字典树.AC自动机两种做法都可以做 #include<stdio.h> #includ ...

  4. C/C++开发者必不可少的15款编译器+IDE

    1)Best IDE for C/C++ –  kDevelop(http://kdevelop.org/) Kdevelop是一个专为C/C++及其他语言的开源扩展插件IDE.它基于KDevPlat ...

  5. BZOJ2780——[Spoj]8093 Sevenk Love Oimaster

    0.题意:给定N个原始字符串S,M次查询某个特殊的字符串S'在多少个原始串中出现过. 1.分析:这个题我们第一感觉就是可以用后缀自动机来搞,然后我们发现不是本质不同的字串..求出现过的次数,也就是说多 ...

  6. Eclipse 语法提示

    新建一个txt 拷贝下面的文本,然后保存修改扩展名为.epf #Sat Nov :: CST /instance/org.eclipse.jdt.core/org.eclipse.jdt.core.c ...

  7. sizeof和小部分c++语法

    ios 中 sizeof(类型) 获取类型所占字节 32位操作系统中, 每个字节占8个位 64位操作系统中, 每个字节占16个位 INT_MAX  2147483647 int size1 = siz ...

  8. Laravel5.1-错误和日志

    简介 这一章也是属于文档写得比较混乱的一章,所以我决定重新组织一下内容结构: 配置 debug配置 我们都知道,开发环境应该把debug打开,生产环境应该把debug关闭:这个设置在config/ap ...

  9. JavaScript深入浅出1-数据类型

    慕课网教程视频地址:Javascript深入浅出 javascript是弱数据类型语言,不需要显式的定义类型,一共有如下六种数据类型 原始类型:number string boolean null u ...

  10. am335x sd卡启动系统参数设置

    首先直接记录结果 在u-boot 中修改参数 #define AUTO_UPDATESYS */ 直接把这个参数注释掉. 这个参数是原来用来升级nor flash 启动系统设置的一个参数,也就是说, ...