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. 【PHP面向对象(OOP)编程入门教程】9.封装性(var与public,protected,private的关系)

    封装性是面象对象编程中的三大特性之一,封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义: 1. 把对象的全部属性和全部服务结合在一起,形成一个不可分割的独 ...

  2. 百度浏览器+hao123评价

    1.用户界面: 界面比较简洁,没有多余的没用的东西.在界面上部有天气,比较方便用户查看天气,中间有各个实用性网站和大家通常使用较多的网站,可以比较快的查看.侧栏有些比较有针对性的内容.上部还有可以静音 ...

  3. saltstack 入门命令

    master服务启动 CentOS 7 (Debian.OpenSuse.Fedora) systemctl start salt-master /etc/init.d/salt-master sta ...

  4. C++Socket编程总结 [转]

    使用socket写代码主要是要看自己的需求是什么. 如果通信时,内容很重要就要使TCP方式. 如果用户数太多,可能就要使用UDP方式了. 在TCP模式下,最简单的方式就是这样的,使阻塞方式: 服务端: ...

  5. 从输入 URL 到浏览器接收的过程中发生了什么事情?

    从输入 URL 到浏览器接收的过程中发生了什么事情? What really happens when you navigate to a URL 上面两篇文章都解读的很好,值得阅读. 接下来在总结一 ...

  6. dp重拾-01背包--HDU 2602

    Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like ...

  7. BZOJ 3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦

    Description 给你每个点与相邻点的距离和方向,求两点间的曼哈顿距离. \(n \leqslant 4\times 10^4\) . Sol 加权并查集. 像向量合成一样合并就可以了,找 \( ...

  8. CentOS用yum安装、配置MariaDB

    .创建/etc/yum.repos.d/MariaDB.repo文件,这里用到了刚刚发布正式版的10. [mariadb] name = MariaDB baseurl = http://yum.ma ...

  9. 【GoLang】golang 交叉编译 实现&工具

    apt-get install gcc-mingw-w64 env CGO_ENABLED= GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc g ...

  10. HTML——选择器

    在前面的章节中,我们展示了一些有关如何选取 HTML 元素的实例. 关键点是学习 jQuery 选择器是如何准确地选取您希望应用效果的元素. jQuery 元素选择器和属性选择器允许您通过标签名.属性 ...