Spring控制反转与依赖注入(IOC、DI)
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)的更多相关文章
- spring 控制反转与依赖注入原理-学习笔记
在Spring中有两个非常重要的概念,控制反转和依赖注入:控制反转将依赖对象的创建和管理交由Spring容器,而依赖注入则是在控制反转的基础上将Spring容器管理的依赖对象注入到应用之中: 所谓依赖 ...
- Spring 控制反转和依赖注入
控制反转的类型 控制反转(IOC)旨在提供一种更简单的机制,来设置组件的依赖项,并在整个生命周期管理这些依赖项.通常,控制反转可以分成两种子类型:依赖注入(DI)和依赖查找(DL),这些子类型各自又可 ...
- Spring控制反转(依赖注入)的最简单说明
1.常规方式实现实例化 1.1已有角色如下: 一个接口Interface,两个接口实现类InstatnceA.InstanceB,一个调用类User 1.2当前实例化InstanceA如下: Inte ...
- 对spring控制反转以及依赖注入的理解
一.说到依赖注入(控制反转),先要理解什么是依赖. Spring 把相互协作的关系称为依赖关系.假如 A组件调用了 B组件的方法,我们可称A组件依赖于 B组件. 二.什么是依赖注入. 在传统的程序设计 ...
- 在DoNetMVC中使用控制反转和依赖注入【DI】
本次是在MVC5中使用Autofac 第一步:程序包管理器控制台 Install-Package Autofac.MVC5 引入nuget包 这样成功之后,会在引用中出现两个DLL,分别是Autofa ...
- IOC/DI控制反转与依赖注入
IOC/DI控制反转与依赖注入 IOC和DI表现的效果的是一样的只不过对于作用的对象不同,有了不一样的名字. 先用一个现实的例子来说明IOC/DI表现出来的效果.
- Spring IOC&DI 控制反转和依赖注入
控制反转(Inversion of Control,缩写为IOC),它是把你设计好的对象交给spring控制,而不再需要你去手动 new Object(); 网上对于IOC的解释很多,对程序员而言,大 ...
- Spring专题2: DI,IOC 控制反转和依赖注入
合集目录 Spring专题2: DI,IOC 控制反转和依赖注入 https://docs.spring.io/spring/docs/2.5.x/reference/aop.html https:/ ...
- 控制反转和依赖注入(对IOC,DI理解+案例)
理解 控制反转说的官方一点就是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其实就是一种设计思想,大概思想就是把设计好的对象交给容器控制,而不是在你内部直接控制. 依赖注入是控制反 ...
随机推荐
- 【PHP面向对象(OOP)编程入门教程】9.封装性(var与public,protected,private的关系)
封装性是面象对象编程中的三大特性之一,封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义: 1. 把对象的全部属性和全部服务结合在一起,形成一个不可分割的独 ...
- 百度浏览器+hao123评价
1.用户界面: 界面比较简洁,没有多余的没用的东西.在界面上部有天气,比较方便用户查看天气,中间有各个实用性网站和大家通常使用较多的网站,可以比较快的查看.侧栏有些比较有针对性的内容.上部还有可以静音 ...
- saltstack 入门命令
master服务启动 CentOS 7 (Debian.OpenSuse.Fedora) systemctl start salt-master /etc/init.d/salt-master sta ...
- C++Socket编程总结 [转]
使用socket写代码主要是要看自己的需求是什么. 如果通信时,内容很重要就要使TCP方式. 如果用户数太多,可能就要使用UDP方式了. 在TCP模式下,最简单的方式就是这样的,使阻塞方式: 服务端: ...
- 从输入 URL 到浏览器接收的过程中发生了什么事情?
从输入 URL 到浏览器接收的过程中发生了什么事情? What really happens when you navigate to a URL 上面两篇文章都解读的很好,值得阅读. 接下来在总结一 ...
- dp重拾-01背包--HDU 2602
Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like ...
- BZOJ 3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦
Description 给你每个点与相邻点的距离和方向,求两点间的曼哈顿距离. \(n \leqslant 4\times 10^4\) . Sol 加权并查集. 像向量合成一样合并就可以了,找 \( ...
- CentOS用yum安装、配置MariaDB
.创建/etc/yum.repos.d/MariaDB.repo文件,这里用到了刚刚发布正式版的10. [mariadb] name = MariaDB baseurl = http://yum.ma ...
- 【GoLang】golang 交叉编译 实现&工具
apt-get install gcc-mingw-w64 env CGO_ENABLED= GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc g ...
- HTML——选择器
在前面的章节中,我们展示了一些有关如何选取 HTML 元素的实例. 关键点是学习 jQuery 选择器是如何准确地选取您希望应用效果的元素. jQuery 元素选择器和属性选择器允许您通过标签名.属性 ...