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理解+案例)
理解 控制反转说的官方一点就是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其实就是一种设计思想,大概思想就是把设计好的对象交给容器控制,而不是在你内部直接控制. 依赖注入是控制反 ...
随机推荐
- W3Cschool菜鸟教程离线版下载链接
请在电脑上打开以下链接进行下载w3cschool 离线版(chm):http://pan.baidu.com/s/1bniwRCV(最新,2014年10月21日更新)w3cschool 离线版(htm ...
- 15天学会jquery
第二章 15 Days of jQuery 比window.onload 更快一些的载入 window.onload()是传统javascript 里一个能吃苦耐劳的家伙.它长久以来一直 被程序员们作 ...
- jQuery中添加自定义或函数方法
<script type="text/javascript"> (function () { $.fn.parHy = function (val) { alert(v ...
- iOS开发——UI基础-KVC
除了一般的赋值和取值的方法,我们还可以用Key-Value-Coding(KVC)键值编码来访问你要存取的类的属性. 如何使用KVC存取对象属性呢?看个示例 一.使用KVC存数据 定义一个person ...
- 下载老版本的Xcode
1.苹果开发者中心,找到Xcode 2.点击下载 3,找到Support 4.找到所需的版本,点击"+"下载 5.安装Xcode,愉快的开发.
- class training
实验3-1 分别使用while循环.do while循环.for循环求 (即求1+2+3+ --+100). 参考: 源码 方法一#include<stdio.h> int main(){ ...
- Linux之匹配符
shell常见通配符: 字符 含义 实例 * 匹配 0 或多个字符 a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab. ? 匹配任意 ...
- STL next_permutation和prev_permutation函数
利用next_permutation实现全排列升序输出,从尾到头找到第一个可以交换的位置, 直接求到第一个不按升序排列的序列. #include <iostream> #include & ...
- Bootstrap IIFE
在Bootstrap源码(具体请看<Bootstrap源码解析>)和其他jQuery插件经常看到如下的写法: +function ($) { }(window.jQuery); 这种写法称 ...
- 2016年10月31日--网页 Windows对象操作
Window.opener:打开当前窗口的源窗口,如果当前窗口是首次启动浏览器打开的,则opener是null. Window.open(URL,name,features,replace):open ...