当前位置: 首页 > news >正文

哪里可以建网站专注网站基础优化

哪里可以建网站,专注网站基础优化,装修网店,青岛专业网站设计的公司前言刚开始听到 IoC#xff0c;会觉得特别高大上#xff0c;但其实明白原理了很简单。跟着我的脚步#xff0c;一文带你吃透 IoC 原理。本文围绕 是何、为何、如何 来谈#xff1a;是何上一篇文章有同学问我在官网该看哪些内容#xff0c;怎么找的#xff0c;那今天的截图… 前言刚开始听到 IoC会觉得特别高大上但其实明白原理了很简单。跟着我的脚步一文带你吃透 IoC 原理。本文围绕 是何、为何、如何 来谈是何上一篇文章有同学问我在官网该看哪些内容怎么找的那今天的截图里都会有链接。初识 IoC根据上一篇文章我们说的Spring 全家桶中最重要的几个项目都是基于 Spring Framework 的所以我们就以 Spring Framework 为例来看文档[2]。首先它的右侧有 Github 的链接另外点到「LEARN」这里就会看到各个版本的文档。那我们点「Reference Doc」就能够看到它的一些模块的介绍等下... 模块什么是模块这个问题下文回答。第一章 Overview讲述它的历史、设计原理等等第二章 Core包含了 IoC 容器AOP 等等那自然是讲 Spring 的核心了要点进去好好看了。点进去之后发现了宝贵的学习资料一切的 what, why, how 都可以在这里找到答案。这里很好的解释了大名鼎鼎的 IoC - Inversion of Control, 控制反转。我粗略的总结一下控制反转就是把创建和管理 bean 的过程转移给了第三方。而这个第三方就是 Spring IoC Container对于 IoC 来说最重要的就是容器。容器负责创建、配置和管理 bean也就是它管理着 bean 的生命控制着 bean 的依赖注入。通俗点讲因为项目中每次创建对象是很麻烦的所以我们使用 Spring IoC 容器来管理这些对象需要的时候你就直接用不用管它是怎么来的、什么时候要销毁只管用就好了。举个例子就好像父母没时间管孩子就把小朋友交给托管所就安心的去上班而不用管孩子了。托儿所就是第三方容器负责管理小朋友的吃喝玩乐父母相当于程序员只管接送孩子不用管他们吃喝。等下bean 又是什么Bean 其实就是包装了的 Object无论是控制反转还是依赖注入它们的主语都是 object而 bean 就是由第三方包装好了的 object。想一下别人送礼物给你的时候都是要包装一下的自己造的就免了。Bean 是 Spring 的主角有种说法叫 Spring 就是面向 bean 的编程Bean Oriented Programming, BOP。IoC 容器既然说容器是 IoC 最重要的部分那么 Spring 如何设计容器的呢还是回到官网第二段有介绍哦答使用 ApplicationContext它是 BeanFactory 的子类更好的补充并实现了 BeanFactory 的。BeanFactory 简单粗暴可以理解为 HashMapKey - bean nameValue - bean object但它一般只有 get, put 两个功能所以称之为“低级容器”。而 ApplicationContext 多了很多功能因为它继承了多个接口可称之为“高级容器”。在下文的搭建项目中我们会使用它。ApplicationContext 的里面有两个具体的实现子类用来读取配置配件的ClassPathXmlApplicationContext - 从 class path 中加载配置文件更常用一些FileSystemXmlApplicationContext - 从本地文件中加载配置文件不是很常用如果再到 Linux 环境中还要改路径不是很方便。当我们点开 ClassPathXmlApplicationContext 时发现它并不是直接继承 ApplicationContext 的它有很多层的依赖关系每层的子类都是对父类的补充实现。而再往上找发现最上层的 class 回到了 BeanFactory所以它非常重要。要注意Spring 中还有个 FactoryBean两者并没有特别的关系只是名字比较接近所以不要弄混了顺序。为了好理解 IoC我们先来回顾一下不用 IoC 时写代码的过程。深入理解 IoC这里用经典 class Rectangle 来举例两个变量长和宽自动生成 set() 方法和 toString() 方法注意 ⚠️一定要生成 set() 方法因为 Spring IoC 就是通过这个 set() 方法注入的toString() 方法是为了我们方便打印查看。public class Rectangle {private int width;private int length;public Rectangle() {System.out.println(Hello World!);}public void setWidth(int widTth) {this.width  widTth;}public void setLength(int length) {this.length  length;}Overridepublic String toString() {return Rectangle{ width  width , length  length };} }然后在 test 文件中手动用 set() 方法给变量赋值。嗯其实这个就是「解藕」的过程public class MyTest {Testpublic void myTest() {Rectangle rect  new Rectangle();rect.setLength(2);rect.setWidth(3);System.out.println(rect);} } 其实这就是 IoC 给属性赋值的实现方法我们把「创建对象的过程」转移给了 set() 方法而不是靠自己去 new就不是自己创建的了。这里我所说的“自己创建”指的是直接在对象内部来 new是程序主动创建对象的正向的过程这里使用 set() 方法是别人test给我的而 IoC 是用它的容器来创建、管理这些对象的其实也是用的这个 set() 方法不信你把这个这个方法去掉或者改个名字试试几个关键问题何为控制控制的是什么答是 bean 的创建、管理的权利控制 bean 的整个生命周期。何为反转反转了什么答把这个权利交给了 Spring 容器而不是自己去控制就是反转。由之前的自己主动创建对象变成现在被动接收别人给我们的对象的过程这就是反转。举个生活中的例子主动投资和被动投资。自己炒股、选股票的人就是主动投资主动权掌握在自己的手中而买基金的人就是被动投资把主动权交给了基金经理除非你把这个基金卖了否则具体选哪些投资产品都是基金经理决定的。依赖注入回到文档中第二句话它说IoC is also known as DI.我们来谈谈 dependency injection - 依赖注入。何为依赖依赖什么程序运行需要依赖外部的资源提供程序内对象的所需要的数据、资源。何为注入注入什么配置文件把资源从外部注入到内部容器加载了外部的文件、对象、数据然后把这些资源注入给程序内的对象维护了程序内外对象之间的依赖关系。所以说控制反转是通过依赖注入实现的。但是你品你细品它们是有差别的像是「从不同角度描述的同一件事」IoC 是设计思想DI 是具体的实现方式IoC 是理论DI 是实践从而实现对象之间的解藕。当然IoC 也可以通过其他的方式来实现而 DI 只是 Spring 的选择。IoC 和 DI 也并非 Spring 框架提出来的Spring 只是应用了这个设计思想和理念到自己的框架里去。为何那么为什么要用 IoC 这种思想呢换句话说IoC 能给我们带来什么好处答解藕。它把对象之间的依赖关系转成用配置文件来管理由 Spring IoC Container 来管理。在项目中底层的实现都是由很多个对象组成的对象之间彼此合作实现项目的业务逻辑。但是很多很多对象紧密结合在一起一旦有一方出问题了必然会对其他对象有所影响所以才有了解藕的这种设计思想。如上图所示本来 ABCD 是互相关联在一起的当加入第三方容器的管理之后每个对象都和第三方法的 IoC 容器关联彼此之间不再直接联系在一起了没有了耦合关系全部对象都交由容器来控制降低了这些对象的亲密度就叫“解藕”。如何最后到了实践部分我们来真的搭建一个 Spring 项目使用下 IoC 感受一下。现在大都使用 maven 来构建项目方便我们管理 jar 包但我这里先讲一下手动导入 jar 包的过程中间会遇到很多问题都是很好的学习机会。在开始之前我们先来看下图 - 大名鼎鼎的 Spring 模块图。Spring Framework 八大模块模块化的思想是 Spring 中非常重要的思想。Spring 框架是一个分层架构每个模块既可以单独使用又可与其他模块联合使用。每个「绿框」对应一个模块总共8个模块「黑色包」表示要实现这个模块的 jar 包。Core Container我们刚才已经在文档里看到过了就是 IoC 容器是核心可以看到它依赖于这4个 jar 包BeansCoreContextSpEL, spring express language那这里我们就知道了如果想要用 IoC 这个功能需要把这 4个 jar 包导进去。其中Core 模块是 Spring 的核心Spring 的所有功能都依赖于这个 jar 包Core 主要是实现 IoC 功能那么说白了 Spring 的所有功能都是借助于 IoC 实现的。其他的模块和本文关系不大不在这里展开了。那当我们想搭建 Spring 项目时当然可以把所有 jar 包都导进去但是你的电脑能受得了吗。。 但是包越大项目越大问题就越多所以尽量按需选择不用囤货。。Btw, 这张图在网上有很多但是在我却没有在最新版的 reference doc 上找到。。不过既然那些老的教程里有说明老版本的 doc 里有那去老版本的介绍[3] 里找找看????在本文第一张图 Spring Framework - Documentation 中我们选 4.3.26 的 Reference Doc.然后搜索“Framework Modules”就有啦 具体链接可以看文末参考资料。还有一个方法待会我们讲到 jar 包中的内容时再说。搭建 Spring 项目知道要导入哪些 jar 包了那就找吧????。一、手动加载 jar 包的方式1. 下载下载地址如果你要问我怎么找的那就还是从刚才 4.3.26 版本的 Reference Doc 中进去然后刚开头就有一个 Distribution Zip Files好奇心带着我打开了它发现...发现了仓库地址打开后发现是各个版本的 jar 包啊我们搜 5.2.3 版的它在最下面然后就可以愉快的使用了Dist.zip 是 jar 包Docs.zip 是文档其他的暂时先不用管下载好了之后就好好看看 Spring 送我们的这份大礼包吧。此处回答上文的遗留问题哪里找 Spring Framework 框架图。答案是下载的 docs.zip → spring-framework-reference → images → spring-overview我们需要导入 Intellij 的 jar 包在哪里呢Dist.zip → libs这里可以看到每个黑色框对应3个 jar 包我们要导入 Intellij 的是 RELEASE.jar.2. 不用 IoC 构建项目我们 new project不用 maven 构架就新建一个普通的 Java 项目比如我就叫它 Spring_HelloWorld然后还是用我常用的 class Rectangle 的例子。然后在 External Libraries 中导入我们刚才在模块图里看到的那4个模块所对应的 jar 包结构如下这样你以为就大功告成了吗Too young too simple 啊来运行一下出现了老盆友no class def found error, 就是找不到这个类。我们谷歌 Maven common logging 并下载它的 jar 包再加到项目里就可以了。我上图里是已经加过了的所以你会看到一个 commons-logging-1.2.再运行一下就可以了。这里的两个文件上文都有截图。目前为止我们是手动用 set() 方法设置对象的那怎么用 Spring IoC 呢3. Spring IoC 配置文件详解还需要有一个配置文件可是这个文件需要配置啥该怎么配置呢官网里都给我们写好了第一段是一些命名空间及其规范的介绍第二段就是给 bean 的属性赋值了。这里注意下 bean 里面的配置要改一下改成我们这个项目对应的。这里的 id, class 是什么意思呢官网上也有解释我这里简单概括下bean 标签告诉 Spring 要创建的对象id: 对象的唯一标识就像每个人的身份证一样不可重复class: bean 的完全限定名即从 package name 到 class nameproperty给属性赋值name 的名称取决于 set() 方法后面的参数其实也可以用 constructor 来赋值name 的名称取决于参数列表更多给复杂数据类型赋值的使用可以在官网查到。当然在工作中更常用的是注解。但是往往也会有 xml 文件配合着一起使用的所以还是要懂的。我的 service 文件配置如下4. 最后一步我们再来看它是怎么用的这里面并没有直接的 new 这个 service但是 Spring 容器帮我们创建了这个对象。那么 Spring 是如何帮我们创建对象的呢ApplicationContext 是 IoC 容器的入口其实也就是 Spring 程序的入口 刚才已经说过了它的两个具体的实现子类在这里用了从 class path 中读取数据的方式然后第二行就是获取具体的 bean 了。这个其实有很多方式在使用的时候就能看到点进去发现是在 BeanFactory.class 里定义的这其中比较常用的是通过Id  → 需要 castBean 的类型 → 只能在 Singleton 的时候使用否则不知道用哪个呀Id 类型 → 下图代码示例来获取对象最后两种 String, Class objects 这种可变参数的方式用的很少。照猫画虎我的 test 文件改动如下成功运行????????Follow up 1. 对象在容器中默认是单例的实践是检验的唯一标准再用 getBean() 得到一个对象测试是否还是同一个。即public class MyTest {public void test myTest() {ApplicationContext context  new ClassPathXmlApplicationContext(service.xml);Rectangle rect  context.getBean(rectangle, Rectangle.class);Rectangle rect2  context.getBean(rectangle, Rectangle.class);System.out.println(rect  rect2);}} } 返回 True or False?答True因为默认是单例的如果要改需要在配置文件里改bean … scope “prototype”.至于这些标签的用法这里不再延伸了Follow up 2. 容器中的对象是什么时候创建的实践是检验的唯一标准定义一个无参的 constructor里面打印一句话然后只 new ClassPathXmlApplicationContext如下图发现也是可以打印的所以其实是每次启动容器的时候就已经创建好容器中的所有对象了。当然这在 scope prototype 的时候不适用只是 singleton 的时候。多说一句其实最好应该一直保留一个无参的 constructor因为这里 bean 对象的创建是通过反射clazz.newInstance() 默认是调用无参的 constructor不过现在已经被弃用掉了换用了这个clazz.getDeclaredConstructor().newInstance()二、使用 Maven 构建项目我们再回到最开始的构建项目相信大家都体会到了手动导入 jar 包的繁琐之处其实我们还可以用 Maven 来管理项目中的 jar 包在公司中也是比较常用的一种方式免除了手动下载 jar 包的过程。1. 新建项目使用 Maven 的话就简化很多了首先我们创建一个 Maven 项目不同于刚才的过程在于New Project 的时候要选择从 Maven 构建而不是一个简单的 Java 项目。建好之后我们会发现比起刚才的 Java 项目多了很多东西和之前的空项目不太一样这里有 main, test其中 resources 是放配置文件的地方也就是我们刚才的 service.xml 应该放在这里如果没有放对位置是代码找不到哦2. 添加对应的 pom 依赖就不用手动导 jar 包了仓库地址 https://mvnrepository.com/搜 spring选择 Spring context → 5.2.3 release把里面的配置 copy 到 pom.xml 中最终在左边 external libraries 会自动出现所需的包一键导入不要太方便3. 写代码????????小结我们最后再来体会一下用 Spring 创建对象的过程通过 ApplicationContext 这个 IoC 容器的入口用它的两个具体的实现子类从 class path 或者 file path 中读取数据用 getBean() 获取具体的 bean instance。那使用 Spring 到底省略了我们什么工作答new 的过程。把 new 的过程交给第三方来创建、管理这就是「解藕」。Spring 也是用的 set() 方法它只不过提供了一套更加完善的实现机制而已。而说到底底层的原理并没有很复杂只是为了提高扩展性、兼容性Spring 提供了丰富的支持所以才觉得源码比较难。因为框架是要给各种各样的用户来使用的它们考虑的更多的是扩展性。如果让我们来实现或许三五行就能搞定但是我们实现的不完善、不完整、不严谨总之不高大上所以它写三五十行把框架设计的尽可能的完善提供了丰富的支持满足不同用户的需求才能占领更大的市场啊。参考资料[1]我的 Github: https://github.com/huiqit/SheIsSDEatNYC[2]Spring 官方文档: https://spring.io/projects/spring-framework#learn.[3]官方文档 4.3.26 版本包含 Spring 模块图: https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/部分图片来源于网络版权归原作者侵删。END史上最全的延迟任务实现方式汇总附代码强烈推荐想读Spring源码先从这篇「 极简教程」开始99%的程序员都在用Lombok原理竟然这么简单我也手撸了一个|建议收藏关注公众号发送”进群“老王拉你进读者群。
http://www.pierceye.com/news/315008/

相关文章:

  • 网站建设长沙创建网页需要多少钱
  • 南通电商网站建设网站背景怎么设置
  • 无锡网站托管aspnet通讯录网站开发
  • 卫计网站建设工作总结铜陵建设行业培训学校网站
  • 手机网站竞价网页界面设计遵循的原则
  • 徐州seo推广公司广州营销型网站优化
  • 小说网站首页模板安徽华力建设集团网站
  • 减肥网站如何做公司企业模板
  • 郑州网站建设搜q.479185700怎么在百度上推广自己的公司信息
  • 深圳住建设局官方网站大连在哪个省市
  • 吉林企业建站系统费用wordpress幻灯片加载很慢
  • com域名和网站小型企业网站排名前十
  • 网站内容 优化泉州网站开发公司
  • 假发外贸网站模板做图库网站需要多少钱
  • 网站建设公司 知道万维科技wordpress支持移动
  • 经典网站建设邢台网站建设策划
  • 系统数据库与建设网站网站提交入口大全
  • 网站做数据分析的意义西安网站建设kxccc
  • 免费建个人网站alexa排名搜索
  • 做的网站第二年续费多钱店铺装修模板
  • 这么自己建设网站中卫网站设计厂家
  • 公司网站制作哪家公司好广州建设执业资格注册中心网站
  • 北京所有做招聘类网站建站公司Apache Wordpress伪静态处理
  • 大兴做网站公司制作网页可以用什么软件
  • 该怎么给做网站的提页面需求网上购物平台怎么建立
  • 用pw后缀的网站阳江网络问政平台首页
  • 建站网站建设哪个好网页设计个人总结
  • 网站开发时间进度表宁波网站建设使用技巧分享
  • wordpress官网案例移动端优化
  • 广告投放网宁波seo网络推广报价