前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么需要Spring Ioc

为什么需要Spring Ioc

作者头像
java达人
发布2018-01-31 18:20:49
1.1K0
发布2018-01-31 18:20:49
举报
文章被收录于专栏:java达人java达人

如果没有没有亲自做过一些项目,直接上手就学spring那样的框架,你可能会觉得莫名其妙,有java就够了呀,为什么要学习这么一个陌生的东西。框架其实是软件的半成品,他提供的一些接口、功能,让你可以在他的基础上方便高效地开发,spring的ioc容器即是一例。

Ioc即控制反转,在spring中其实就是依赖注入。一个对象不可能单打独斗,它总要和其他对象进行交互合作,它通过构造参数,工厂方法参数或者对象属性定义其依赖关系,然后通过第三方容器(如spring ioc)在创建该对象时注入这些依赖,这就是控制反转,该对象即被称为bean,与之相反的是对象自身直接通过构造方法控制其依赖对象的实例化,或者通过ServiceLocator定位依赖对象,我们可以通过示例比较这两种方法。

比如你有个类控制对外部网站的数据爬取工作:

代码语言:js
复制
//抓取接口
public interface Crawl {
 public void crawlPage();
}
//抓取京东网站内容的实现类
public class JingdongCrawler implements Crawl{
 @Override
 public void crawlPage() {
  System.out.println("crawl Jingdong");
 }
}
//抓取控制器
public class CrawlControl {
 private Crawl crawler;
 public CrawlControl(){
 crawler = new JingdongCrawler();
   }
 public void execute(){
 crawler.crawlPage();
   }
}

注意看构造方法,他是直接在其中创建相应的依赖对象,即Jingdongrawler,这样他就和依赖对象有了一种紧密的耦合关系,这是违反软件开发中松耦合的原则的,如果我们要抓取淘宝网站,是不是要再写一个CrawlControl2,来实例化TaobaoCrawler 呢,或者我们可以用Service Locator模式,通过中间代理类来实现松耦合,但对象还是要自己去获取管理这些依赖对象,有没有一种方式,使得对象仅仅需要通过构造参数或者属性定义依赖关系,而其依赖对象的创建,管理统统交给第三方容器呢,答案就是Ioc容器

代码语言:js
复制
//抓取淘宝网站内容的实现类
public class TaobaoCrawler implements Crawl{
 @Override
 public void crawlPage() {
  System.out.print("crawl taobao");
 }
}
//CrawlControl 在ioc容器中的写法
public class CrawlControl {
 private Crawl crawler;
 public CrawlControl(Crawl crawler){
 this.crawler = crawler;
 }
 public void execute(){
 crawler.crawlPage();
 }
}

CrawlControl 构造方法中并不实例化具体crawler,而是交给ioc容器处理,ioc容器会读取配置元数据(如XML配置),知道他绑定的是哪个具体实例(既可以指定为taobaoCrawler,又可以指定为jingDongCrawler,比原来更加通用 ),然后创建,绑定,装配相应的对象。比如你在配置中指定ref='taobaoCrawler',容器帮你做的工作相当于:

CrawlControl control = new CrawlControl(new TaobaoCrawler ());

而你需要做的仅仅是获取装配创建好的对象,调用方法:control.execute();

当然容器的内部的工作流程其实复杂得多,关于如何编写相应的xml配置文件,如何从容器中获取所需对象,这个都属于使用的范畴。写这篇文章主要是告诉大家使用框架之前要明白为什么去用,主要是为了解决什么问题,而不是人云亦云,随大流,你掌握了原理,掌握了基础,自己也可以开发一套框架出来,框架是伴着实际问题,为了解决实际问题而出现的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档