DI的概念和实现原理—Spring系列介绍
DI的概念和实现原理—Spring系列介绍
DI和AOP是Spring中的两个核心概念,要学习DI和AOP,首先就需要了解清楚什么是DI,什么是AOP,这篇文章会讲解一下DI的概念和实现原理,不足之处忘大家指正。
在传统的编程中,某个类型的依赖对象通常都是由该类型的对象自己创建,比如在原始的三层架构中,当控制器需要一个服务对象的时候,通常都是在控制器中直接创建该服务对象,或者写得高大上一点,弄个工厂方法,将控制层和服务层解耦,我们来看如下代码:
UserRepository接口的实现类
public class UserRepositoryImpl implements UserRepository {@Overridepublic User findByUserName(String userName) {return null;}
}
UserService接口的实现类
public class UserServiceImpl implements UserService {private UserRepository userRepository = new UserRepositoryImpl();@Overridepublic User login(String userName) {return userRepository.findByUserName(userName);}
}
这是传统三层架构的一个代码片段,我想大多在学习阶段都写过这样的代码,文艺范一点的可能不会直接new UserRepositoryImpl(),而是使用工厂方法代替。但是不管使用哪种方式,我们会发现,UserRepository的对象是由UserService来进行控制的。
上面的例子就好像过去的生活,你肚子饿了,你需要自己到餐馆去点菜,然后等半天才能吃到美食。但是现在呢,我们只需要在手机上打开APP并下单。你需要做的就是在家里玩一把游戏或者看会书,饭就给你送到手上了。那么我们写代码能不能也这样呢?当我们需要对象的时候不是自己去创建,而是下个单,让别人给我们自动放进来呢?这就需要用到依赖反转(DI)这个技术了。
我们来简单了解一下上面的例子,首先商家需要在这个APP发布信息,比如点餐的菜单,然后我们才能在APP上下单。那么在程序中如何做呢?首先我们也需要一个注册中心,也就是存放对象的容器,然后提供服务的对象都需要放到这个容器中。当我们需要某种类型的对象的时候,只需要告诉容器,容器就会自动将该类型的对象自己传递给你了。
在Spring中,BeanFactory就是这么一个容器,我们需要将我们的Bean都交给BeanFactory来管理。如何将Bean交给BeanFactory管理呢?这就是配置文件的作用。我们可以使用xml、注解或者是Java代码来配置,如:
<bean id="userRepository" class="cn.cqbdqn.ems.repositories.impl.UserRepositoryImpl"/>
也可以在交给Spring管理的时候告诉Spring你需要一些什么类型的对象,如:
<bean id="userService" class="cn.cqbdqn.ems.service.impl.UserServiceImpl"><!-- userRepository属性需要提供setter --><property name="userRepository" ref="userRepository"/>
</bean>
这样Spring就知道你的对象需要一个什么类型的属性,在Spring创建该类型的对象的时候就会自动在容器中搜索该类型的对象,并自动注入到你的对象中。这样就完成了从自己创建并管理对象到对象自动注入的过程的转变,我们需要做的工作就是告诉Spring我们需要一个什么类型的对象,将该类型的对象自动注入哪个属性就可以了。当我们需要修改该类型的对象实现的时候,只需要告诉(修改Spring配置文件)Spring,而不用修改我们的代码。
启动Spring的测试代码:
@Testpublic void test(){ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring.xml");UserService userService = ctx.getBean("userService", UserService.class);User user = userService.login("admin");assertNull(user);//断言user对象为空}
DI解决了什么问题呢?对象之间的耦合。在我们的系统中,如果两个对象耦合太紧,会造成代码难以测试,难以利用,难以理解。但是对象之间又需要有一定的耦合,完全没有耦合的代码什么也做不了。为了完成有实际意义的复杂功能,不同的类必须以适当的方式进行交互。通过DI,对象的关系由系统负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自行创建或管理它们的依赖关系。
DI的概念和实现原理—Spring系列介绍相关推荐
- Spring系列第20篇:@Conditional通过条件来控制bean的注册
面试阿里p7被问到的问题(当时我只知道第一个): @Conditional是做什么的? @Conditional多个条件是什么逻辑关系? 条件判断在什么时候执行? ConfigurationCondi ...
- Spring系列第10篇:primary可以解决什么问题?
存在的问题以及解决方案 直接上案例,通过案例来看技术是如何使用的: package com.javacode2018.lesson001.demo8;public class NormalBean { ...
- Spring系列第9篇:depend-on到底是干什么的?
本文主要讨论一下bean的创建和销毁的顺序,如何来干预bean的创建和销毁的顺序. 无依赖bean创建和销毁的顺序 我们先来看一下没有任何依赖的bean的创建和销毁的顺序. 下面的xml中定义了3个b ...
- GIS基础知识汇总篇(五)-无人机真正射影像的概念和制作原理
正射影像应同时具有地图的几何精度和影像的视觉特征,特别是对于高分辨率.大比例尺的正射影像图,它可作为背景控制信息去评价其他地图空间数据的精度.现势性和完整性.然而作为一个视觉影像地图产品,影像上由于投 ...
- 无人机真正射影像的概念和制作原理
正射影像应同时具有地图的几何精度和影像的视觉特征,特别是对于高分辨率.大比例尺的正射影像图,它可作为背景控制信息去评价其他地图空间数据的精度.现势性和完整性.然而作为一个视觉影像地图产品,影像上由于投 ...
- 一文搞懂GPU的概念、工作原理,以及与CPU的区别
近几个月,几乎每个行业的小伙伴都了解到了ChatGPT的可怕能力.你知道么,ChatGPT之所以如此厉害,是因为它用到了几万张NVIDA Tesla A100显卡做AI推理和图形计算. 本文就简单分享 ...
- 手撸Spring系列4:IOC/DI 思想(实战篇)
说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...
- 手撸Spring系列2:IOC/DI 思想(源码篇-IOC)
说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...
- 手撸Spring系列8:Spring AOP(理论篇)
说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...
最新文章
- mybaits if判断进入不了
- java iterator如何知道数量_Java开发岗面试题基础篇(二)
- 第一次使用VS Code时你应该知道的一切配置
- 事务连接中断_漫画——你还记得原生的JDBC怎么连接数据库吗?
- 【Android 逆向】ELF 文件格式 ( ELF 文件当前版本号 | 操作系统 ABI 信息 | ABI 版本 | 文件头校验 | 文件头长度信息 )
- 新浪微博开发-添加子视图控制器设置颜色
- Python+matplotlib数据可视化设置图例3个精选案例
- [P2396] yyy loves Maths VII
- spring bean加载过程_Spring的Bean加载容器机制
- 删数问题(Noip1994)
- hostname hostnamectl 显示、设置主机名
- 高德地图,百度地图,腾讯地图,谷歌地图,坐标拾取器
- 计算机病毒是不会破坏计算机软件的,计算机病毒是不会破坏计算机硬件的。
- TortoiseGit状态图标不能正常显示的解决办法
- 超声图像拼接及三维重建
- 数据的逻辑结构包括那些?
- TypeError: The ‘compilation‘ argument must be an instance of Compilation
- miui patchrom项目开发详细教程(Being updated)
- os-003-protected-mode
- 走进黑客工具箱:使用 Whatweb 和 Acunetix 加固您的 Web 应用程序