spring ioc控制反转
一. 什么是spring,它能够做什么?
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
- 中间层框架、万能胶
struts2
spring
hibernate
2 容器框架
JavaBean 项目中的一个个类
IOC和AOP
spring包含的模块
二 、Spring-IoC入门
- 什么是IoC控制反转(或依赖注入)
控制反转(IoC=Inversion of Control)IoC,用白话来讲,就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:(依赖)控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
IoC还有一个另外的名字:“依赖注入 (DI=Dependency Injection)” ,即由容器动态的将某种依赖关系注入到组件之中
案例:实现Spring的IoC
IOC/DI
将以前由程序员实例化对象/赋值的工作交给了spring处理
下面举一个简单的demo供大家理解,代码如下:
IUserDao.java
public interface IFileDao {void upload();
}UserDaoImpl.javapublic class FileDaoImpl implements IFileDao{@Overridepublic void upload() {System.out.println("文件上传!");}
}
假如在项目实际开发中有个上传文件的接口FileService,在这个接口中要实现文件上传,需要通过调用FileDaoImpl中的upload()方法来实现。
我们的正常做法是在FileService中先new FileDaoImpl(),然后再调用FileDaoImpl中相关方法。
正常做法的代码如下:
public class FileService{private IFileDao ifd=new FileDaoImpl();public void upload(){ifd.upload();}
}
而IoC的思想即是,在你需要依赖对象的时候,IoC容器即可提供一个已经实例化好的对象给你,这样你就不需要自己去新建相应的依赖类。
看下面这段代码,来感受下IoC的过程:
FileService中声明的ifd无需再实例化,但是要提供set方法
public class FileService {private IFileDao ifd;//set方法注入public void setIfd(IFileDao ifd) {this.ifd = ifd;}public void upload() {System.out.println(ifd.upload());}
}
2.在spring的配置文件spring-context.xml中配置FileDaoImpl 与FileService(spring-context.xml配置文件是自己创建的xml文件)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"><bean class="com.zking.biz.impl.FileDaoImpl" id="ifd"></bean><bean id="fileService" class="com.zking.action.FileService"><!-- set方法注入name 为FileService中声明的接口的名字ref 指依赖谁,这里的值为上面配置的FileDaoImpl的id--><property name="ifd" ref="ifd"></property></bean>
</beans>
测试方法调用FileService的upload方法:
public class FileServiceTest {@Testpublic void testUpload() {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-context.xml");FileService fileService = (FileService)applicationContext.getBean("fileService");fileService.upload();}
}
2.依赖注入的3种方式
· set方法注入
上面的实例用的就是set方法注入
· 构造方法注入
FileService.java中将set方法改为构造函数
public class FileService {private IFileDao ifd;public FileService(IFileDao ifd) {this.ifd = ifd;}public void upload() {System.out.println(iuda.upload());}
}
spring-context.xml中将property标签改为constructor-arg标签
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"><bean class="com.zking.biz.impl.FileDaoImpl" id="ifd"></bean><bean id="fileService" class="com.zking.action.FileService"><!-- 构造方法注入 name 为FileService中声明的接口的名字ref 指依赖谁,这里的值为上面配置的FileDaoImpl的id--><constructor-arg name="ifd" ref="ifd"></constructor-arg></bean>
</beans>
· 自动装配
FileService.java中提供set方法
public class FileService {private IFileDao ifd;//自动装配public void setIfd(IFileDao ifd) {this.ifd = ifd;}public void upload() {System.out.println(ifd.upload());}
}
spring-context.xml中的beans标签中设置 default-autowire 属性,默认值为default,注释中对default-autowire的值有解释:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"default-autowire="byName"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"><!-- byType:根据javabean的接口属性,在spring的上下文中自动寻找实现类去注入,当找到两个或两个以上时会报错,与spring的上下文的id无关byName:根据管理的javabean中的接口名,在spring上下文中去寻找同名的id进行注入。--><bean class="com.zking.biz.impl.FileDaoImpl" id="ifd"></bean><bean id="fileService" class="com.zking.action.FileService"></bean></beans>
spring ioc控制反转相关推荐
- Spring IOC(控制反转)思想笔记
Spring IOC(控制反转)思想笔记 IOC控制反转基本理念就是将程序控制权从程序员手中交给用户自定义,从而避免了因为用户一个小需求的变化使得程序员需要改动大量代码. 在这里插入图片描述 案例 如 ...
- Spring IOC(控制反转)思想笔记
Spring IOC(控制反转)思想笔记 IOC控制反转基本理念就是将程序控制权从程序员手中交给用户自定义,从而避免了因为用户一个小需求的变化使得程序员需要改动大量代码. 案例 如果按照之前javaw ...
- 【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入
IoC 控制反转.DI 依赖注入 Spring 简介 Spring 基本使用 - IoC 容器 依赖注入 (Dependency Injection) 基于 setter 的注入 - 自定义对象 be ...
- Spring IOC(控制反转)详解及示例
控制反转--Spring通过一种称作控制反转(IOC)的技术促进了低耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象.你可以认为IoC与JN ...
- spring——IOC控制反转(一)
一.spring之IOC 1. IOC(控制反转:Inverse of Control ),又称作DI依赖注入,是一种重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的 Spring 框 ...
- 详解spring的IOC控制反转和DI依赖注入
转载 详解spring的IOC控制反转和DI依赖注入 2018-06-05 15:45:34 jiuqijack 阅读数 2945 文章标签: spring IOC控制反转 DI依赖注入 更多 分类专 ...
- Spring的控制反转(IOC)和依赖注入(DI)具体解释
Spring的控制反转(IOC)和依赖注入(DI)具体解释 首先介绍下(IOC)控制反转: 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.这样控制器就有应 ...
- Spring底层控制反转解耦合(IOC)
简单的例子解释IOC控制反转进行解耦合 一.相关概念 (1)解耦合 解耦合就是把程序中互相不相关或有限相关的模块分割开来,把不同模块互相之间的关系用接口进行准确定义,解耦前,两个模块之间共享所有信息: ...
- Spring框架中IoC(控制反转)的原理
一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑.即软件系统中对象之间的耦合,对 ...
最新文章
- python selenium 爬取js加载的内容为空,Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容...
- HDFS 文件格式——SequenceFile RCFile
- 如何用程序删除win 7下SYSTEM权限的目录
- 技术人生——解决问题的规律
- 易语言添加ctrl c键,易语言操作快捷键汇总
- 算法训练营 重编码_关于如何在没有训练营的情况下学习编码的10条提示
- python中可迭代对象_什么是python中的可迭代对象(iterable object)?
- Android remote debug 打开手机应用里的网页却显示空白
- Nature 期刊介绍
- WP 手机Lumia 820 锁屏密码的POJI研究
- MRI T1加权结构
- Python3-爬虫~selenium\phantomjs\爬取XX网页电影过程中向下滚动网页问题
- linux引导界面背景,如何个性化syslinux引导界面背景照片
- linux下解压war格式的包
- 暗斑怎么形成的_脸上长暗斑详解
- Laravel文档梳理6、响应
- APP实用开发—自定义加载动画
- 20190603复盘
- Android缓冲进度条或加载进度条
- 一些常用软件静默安装参数(nsis,msi,InstallShield ,Inno)
热门文章
- data 谷歌浏览器更改user 路径_chrome修改默认用户目录
- matlab状态空间法算反馈阵,matlab中已知系统的状态方程怎样绘制系统阶跃响应曲线...
- mysql 错误连接锁死_MySQL 8.0.19支持输入3次错误密码锁定账户功能(例子)
- java byte 转换int_java byte负数转换int失真?
- Shape Correspondence and Functional Maps
- igllib 203 Curvature directions
- 5复数与复变函数(五)
- rabbitmq实战指南_太香了这份架构解密:从分布式到微服务(第二版),神仙进阶指南...
- “达观杯”文本智能处理冠军分享:深度学习文本分类
- python如何设置api接口_python如何使用api接口