java实现 ioc_JAVA模拟Spring实现IoC过程(附源码)

论坛 期权论坛     
选择匿名的用户   2021-5-28 04:12   0   0
<div style="font-size:16px;">
<p>前言:本人大四学生,第一次写博客,如果有写得不好的地方,请大家多多指正</p>
<p>一、IoC(Inversion of Control)反转控制</p>
<p>传统开发都是需要对象就new,但这样做有几个问题:</p>
<p>效率低下,创建对象时比较耗时,我立马要用对象,可系统说让你等一下,创建和初始化对象需要一定的时间。</p>
<p>对象关联关系,例如:用户有所属部门,那创建用户对象时,如果部门对象不存在,还得创建部门对象。</p>
<p>代码耦合度较高</p>
<p>于是有人就提出了IoC控制反转概念,干嘛我不先创建好呢?如果用户要使用时,我都已经创建好了,用户不就能立马使用了?这就有点像好莱坞法则:“你别找我,我去找你”。</p>
<p>IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活;</p>
<p>我个人对IoC是这样简单理解的:</p>
<p>1)对象不是new出来的,而是通过反射事先创建出来的</p>
<p>2)既然事先创建出来,在用之前就得找个地方放起来,放哪里呢?就放在一个Map集合中</p>
<p>二、实现IoC过程中需要考虑的一些问题</p>
<p>怎么获取要创建的对象?</p>
<p>怎么把目录名转换为类名?</p>
<p>怎么把类名转换为beanName?</p>
<p>哪些类需要创建对象?怎么过滤掉不需要创建对象的类?</p>
<p>容器中该怎么存放对象?</p>
<p>怎么调用容器中存放的对象?</p>
<p>设计分层结构:高内聚,低耦合(相当于专做一件事,不要把使用功能都写在一起)</p>
<p>三、模拟Spring实现IoC</p>
<p>在这里简单模拟查询用户信息,实际应用中更复杂,但是万变不离其宗,弄懂原理才是重要的</p>
<p>1)架构图</p>
<p align="center"><img alt="c349a670e716801051e686002ef07e6f.png" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-6988cfcce9bfd7fffd4d5e35b7fe63db.png"></p>
<p>2)代码结构图</p>
<p>在IDEA中的结构示意图(eclipse也差不多,我用的是IDEA):</p>
<p align="center"><img alt="bae94ffed9040f397dccafe554797571.png" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-315512b4a562b18e2e5481cc3243514d.png"></p>
<p>各包名以及文件名含义(文件名可能会和架构图中的一些文件名不一致,因为架构图是之前画的,但不影响阅读,大同小异):</p>
<p>annotation包:用来存放注解,在本案例中需要创建对象的类为控制层类、业务层类、持久层类;所有需要3个注解,通过注解的方式来过滤掉不需要创建对象的类,Controller注解是加在控制层,Service注解加在业务层,Respository注解加在持久层;3个注解都是位于类上,保留到运行时期;</p>
<p>pojo包:设置一个pojo类,里面含有一些简单属性;</p>
<p>dao包:模拟持久层,由于本案例是一个简单例子,主要用于初学者查看,所有没有安装数据库,正常情况下持久层应该与数据库进行对接,没有安装数据库,所有就由持久层模拟数据库;</p>
<p>service包:模拟业务层,业务层调用持久层;</p>
<p>controller包:模拟控制层,控制层调用业务层;</p>
<p>utils包:工具类包;</p>
<p>parse包:因为我们采用了分层结构,所以在使用之前,应当把这些组件扫描加载到一起;现在都是面向接口进行开发,这样可以提高程序的灵活性,面向接口开发,同时也体现了JAVA的多态性;</p>
<p>Run文件就相当于整个程序的入口。</p>
<p>四、案例源码</p>
<p>1)pojo类(User.java)</p>
<p>1 packagespring.pojo;2</p>
<p>3 /**</p>
<p>4 * &#64;Auther: 林安杰5 * &#64;Date: 2019/9/28 19:286 * &#64;Description:创建pojo对象,简单设置属性以及get,set,toString方法7 */</p>
<p>8 public classUser {9 privateInteger id;10 privateString name;11</p>
<p>12 publicInteger getId() {13 returnid;14 }15</p>
<p>16 public voidsetId(Integer id) {17 this.id &#61;id;18 }19</p>
<p>20 publicString getName() {21 returnname;22 }23</p>
<p>24 public voidsetName(String name) {25 this.name &#61;name;26 }27</p>
<p>28 &#64;Override29 publicString toString() {30 return
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP