-
(二)Spring从入门到入土——IOC概述及推导
前面第一篇我们认识了什么是Spring以及通过官网的指引,编写并启动了第一个属于我们的Spring程序,虽然程序启动了,但是对于里面的内容以及如何实现的我们还是不是十分的清楚,那么接下来我们就首先先来了解一下Spring中的一个核心概念——IOC
IoC(控制翻转)推导
之前的代码架构
-
通常我们以前实现项目的时候会分为这么几步:
-
- 先写一个UserDao接口
public interface UserDao {
public void getUser();
}
-
- 再去写一个Dao的实现类
public class UserDaoImpl implements UserDao {
@Override
public void getUser() {
System.out.println("get");
}
}
-
- 然后去写UserService的接口
public interface UserService {
public void getUser();
}
-
- 最后去写Service的实现类(组合)
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
-
- 最后再去使用它(测试)。
@Test
public void test(){
UserService service = new UserServiceImpl();
service.getUser();
}
上面就是我们以前实现一个功能的整体逻辑,也算是很清晰,但是存在着一个问题,即由程序员来控制代码的生成,对于每次的需求变更我们都需要去改动我们相应的代码,牵一发而动全身,而且这样代码的耦合性太高了。
IOC的理念
为了解决因为需求的改动而频繁去更改代码,我们在需要用到它的地方不去实现它,而是利用set提供一个接口。这样我们把创建对象的主动权交给了调用者即控制翻转。程序不用去管如何创建以及实现的,只需要提供一个接口。让调用者来决定,
public class UserServiceImpl implements UserService {
private UserDao userDao;
// 利用set来进行动态实现值的注入
public void setUserDao(UserDao userDao){
this.UserDao=userDao;
}
}
IoC本质
控制反转(IoC),是一种设计思想,DI(依赖注入)是实现IoC的一种方法。
- Ioc是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置也可以使用注解,新版本的Spring也可以零配置实现IoC
-
Spring容器在初始化时先读配置文件、根据配置文件或元数据创建于组织对象存入容器中,程序使用时再从IoC容器中取出需要的对象。
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
- 控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)
来源:https://www.cnblogs.com/javazhonghu/p/14230288.html
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比