范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Spring容器IOC解析

  Spring有两大核心特性 IOC和AOP,今天我们来聊的是IOC。相信很多同学每天都在使用Spring的IOC特性,但对其原理及实现理解比较模糊,那么今天就借助Spring容器实现原理,简单说说IOC。说到IOC 就涉及到两个概念控制反转(Inversion of Control  )、依赖注入(Dependency Injection)  。
  首先来看什么是控制反转
  在介绍控制反转之前呢我们看一段最早的代码Public class PersonServiceBean{        Private PersonDaoBean  personDao = new PersonDaoBean();          Public void  save(Personperson){       personDao.insert(person);     }      }
  PersonDaoBean 是在应用内部创建及维护的 。所谓控制反转就是应用本身不负责依赖对象的创建及维护  ,依赖对象的创建及维护是由外部容器负责的  。这样控制反转权就由应用转到了外部容器,控制权的转移就是所谓反转。
  用Spring的写法:把依赖对象交给外部容器去负责Public class PersonServiceBean{        Private PersonDaoBean personDao;       //把容器创建好的对象依赖注入进PersonServiceBean,通过构造方法或 set方法     Public PersonServiceBean(PersonDaoBean  personDao){         this.personDao = personDao;     }       或       Public void setPersonDao(PersonDaoBean  personDao){         this.personDao = personDao;     }       Public void  save(Personperson){         personDao.insert(person);     }   }
  其次来看什么是依赖注入
  所谓依赖注入:就是在运行期间  ,由外部容器动态的将依赖对象注入到组件中。
  简单的说,Spring就是通过工厂+反射将我们的bean放到它的容器中,当我们想用某个bean的时候,只需要调用 getBean("beanId")方法。
  依赖注入的方式:
  第一.构造器注入;
  第二.set方法注入;
  第三.使用Field注入(用于注解方式)
  然后我们写一段简单的模拟Spring的代码来实现IOC容器
  思路:Spring容器的原理实现主要依赖于反射。过程其实就是通过解析xml文件,获取到用户配置的bean,然后通过反射将这些bean进行存储(放到集合中),然后对我提供一个getBean方法,以便我们获取到这些bean。下面是一段简单的模拟代码:package com.spring.factory;   import java.util.HashMap; import java.util.List; import java.util.Map;   import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; import org.jdom.xpath.XPath;   public class ClassPathXmlApplicationContext implements BeanFactory {     //容器的核心,用来存放注入的Bean     private Map container = new HashMap();       //解析xml文件,通过反射将配置的bean放到container中     public ClassPathXmlApplicationContext(String fileName) throws Exception {         SAXBuilder sb = new SAXBuilder();         Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream(fileName));         Element root = doc.getRootElement();         List list = XPath.selectNodes(root, "/beans/bean");         //扫描配置文件中的bean         for (int i = 0; i < list.size(); i++) {             Element bean = (Element) list.get(i);             String id = bean.getAttributeValue("id");             String clazz = bean.getAttributeValue("class");             // 反射             Object o = Class.forName(clazz).newInstance();             container.put(id, o);         }     }       @Override     public Object getBean(String id) {         return container.get(id);     } }
  说明:首先声明一个存放bean的Map,然后通过jdom解析配置文件,循环遍历所有的节点,并通过反射将它们放到我们之前声明的Map中.然后提供一个getBean的方法,让我们可以通过beanId来获取到我们想要的bean。
  下面是一个简单的xml配置文件:<?xml  version="1.0" encoding="UTF-8"?>                             
  客户端通过调用前面的ClassPathXmlApplicationContext,来加载上面的配置文件,然后就可以通过Id来获得我们需要的bean了:package  com.spring.factory;  public  class Test {    public  static void main(String[] args) throws Exception {              //加载配置文件               BeanFactory f = new  ClassPathXmlApplicationContext("applicationContext.xml");              //英格兰               Object oe =  f.getBean("E");              Team e = (Team)oe;              e.say();              //西班牙               Object os =  f.getBean("S");              Team s = (Team)os;              s.say();              //葡萄牙               Object op =  f.getBean("P");              Team p = (Team)op;              p.say();          }    }
  输出结果:England:我们是欧洲的中国队,不在乎这次小组没出线...  Spain   :我们是两届欧洲杯冠军、一届世界杯冠军!   Portugal:我们的C罗一个顶十个!
  其它代码://工厂接口    package com.spring.factory;  public  interface BeanFactory {          Object getBean(String id);   }   //Team接口    package com.spring.factory;  public  interface Team {          void say();      }  //英格兰    package com.spring.factory;  public  class England implements Team{  public void say() {                System.out.println("England:我们是欧洲的中国队,不在乎这次小组没出线...");          }       }  //西班牙    package com.spring.factory;  public  class Spain implements Team{  @Override          public void say() {               System.out.println("Spain:我们是两届欧洲杯冠军、一届世界杯冠军!");          }    }  //葡萄牙    package com.spring.factory;  public  class Portugal implements Team {  @Override          public void say() {               System.out.println("Portugal:我们的C罗一个顶十个!");           }    }
  以上内容是对Spring的一个简单模拟,当然Spring远比这个要复杂的多,也强大的多,而且获取bean的方式也不止通过工厂这一种。这里只是做一个粗略的Demo说说对容器的简单理解,向Spring致敬。
  扩展,那么如果有 property属性的bean该如何初始化呢?(依赖注入)
  如xml配置方式: bean有 property属性, 包含name和ref。
  这里提供思路,感兴趣的同学可以自行实现,也可参看spring的源码。
  思路:
  1. 获取Bean的set方法 setA --- 反射
  2. 获取Bean的声明的属性.equals(propertyDefine.getName())
  3. 获取Bean的ref 通过ref作为Key从Map中获取到实例对象
  4. setA.invoke(Bean,实例对象) --- 反射
  整个原理大致分三步:
  1.读取xml文件
  2.实例化bean 保存到map中
  3.为有property 的Bean注入Bean0对象
  说了这么多,那么IOC有什么好处呢
  降低组件的耦合,使各层解耦。bean对象交于容器管理。
  小结
  相信读完此篇会对Spring IOC的概念和实现原理更加清晰。
  控制反转:就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器Spring负责。
  依赖注入:由外部容器Spring动态的将依赖对象注入到组件中。
  实现原理:JAVA反射机制。

继萨尔瓦多之后中非共和国成为第二个将比特币作为法币的国家财联社区块链日报4月28日讯(记者董宇佳),当地时间4月27日,中非共和国总统办公厅表示,该国已将比特币作为其法定货币。据悉,中非共和国成为非洲第一个,也是世界第二个承认比特币为法中国智能手机周销量回到十年前的水平这个数据透露了什么?首先是背景的原因。整个手机行业已经进入中后期,太成熟了,没有太大的变化和进步。近两年在各种新旗舰机的讨论中,看到很多人认为Mate40的体验非常好,不输给最新的旗舰。而Mate40工信部发布一季度电信服务质量通告简网生活圈猎豹移动等10家企业投诉处理及时率未达要求中国网科技4月28日讯工信部网站今日发布2022年第一季度电信服务质量通告,通告显示,2022年第一季度,全国电信用户百万申诉率为30。6人次。其中,涉及服务争议的百万用户申诉率为北京哪能打到没有司机的出租车?运营企业回应4月28日,小马智行率先取得北京市智能网联汽车政策先行区首批无人化示范应用道路测试通知书,获准向公众提供主驾位无安全员副驾有安全员的自动驾驶出行服务。取得许可后,小马智行获准在北京神州信息一季度实现营业收入19。25亿元中证网讯(记者董添)神州信息4月28日晚间披露2022年一季报。报告期内,公司共实现营业收入19。25亿元,实现归属上市公司股东净利润3114。86万元。软件开发及技术服务业务营收以创新为驱动力企业加速进化服务机器人来源人民网当前,新一轮科技革命和产业变革加速演进,新一代信息技术生物技术新能源新材料等与机器人技术深度融合。十四五机器人产业发展规划中提出,2025年我国将成为全球机器人技术创新策主攻高端细分人群华为WATCHGT3Pro成智能手表产业成熟的标志智能手表市场已经走过八年时间,作为一个新品类从无到有,从稚嫩迈向成熟。今天,华为WATCHGT3Pro系列发布,面向细分人群主攻高端,在打造了颜值天花板的同时也给行业带来了一些新的大神帮我看下我这diy电脑怎么样,兼容吗,有什么地方需要改进吗?还缺什么吗?帮我看下我这DIY电脑怎么样,兼容性吗?有什么需要改进的吗?还缺什么吗?题主的配置是完全没有问题的。也就是硬盘的选择问题,我看其他人也提过这个问题了。感觉现在的主机不上个m。2的固有没有黑色背景美女图片?(原图)深色与黑色背景人像。这个算吗?人物肖像摄影黑色背景,有其优点人物之动态清晰鲜明突出,摄影师往往利用自然光多种灯光,抓拍出精彩瞬间,创作出完美之摄影作品欣赏几幅摄影作品谢谢信阿里旗下Lazada不只复制淘宝天猫那么简单环球网科技记者林迪3月21日,东南亚第一大电商平台Lazada在新加坡举办Lazmall品牌未来论坛,Lazada宣布,未来将帮助中小企业以及全球品牌在东南亚六大重点市场继续成长,买酒19分钟送达,到手还是冰的,1919与天猫开启酒水新零售今后,在天猫淘宝饿了么点一杯冰啤酒,19分钟就能给你送上门,到手还是冰的。3月21日,在成都举办的第100届全国春季糖酒会上,天猫食品总经理王丹宣布,1919已经全面接入阿里商业操
考驾照时的6张色觉检测图,第5张图若看错,驾照可能考不了每天三分钟,用车更轻松!大家好,我是你们的好朋友木沐阳。据不完全统计,我国持有驾驶证人数已超过4亿多,远远超过2亿多的汽车保有量。越来越多的人将驾照考试安排在计划中,但并不是所有人95号汽油车,加92号汽油会坏吗?汽油混加对车有啥影响?偶尔加一次92号汽油不会坏,但是长期加92号汽油会造成发动机的损坏。规定使用95号汽油的车,如果长期使用低标号汽油,会引起发动机爆燃现象,严重时甚至会造成发动机拉缸活塞化顶和气门折24999元的华为智慧屏V75Super,强在哪里?在前天的华为发布会中,除了P50的发布,另一个重磅产品无疑是新一代的华为智慧屏V75了。作为华为主推的旗舰级电视类产品,其售价自然不菲,高达24999元,我们一起来看看,它到底贵在华为P50系列正式发布起售价4488元华为P50于29日正式发布,在推迟数月之后P50系列也是终于与我们见面了,这其中的艰难想必大家都明白。P50系列分为P50标准版P50Pro以及P50Pro。29日晚发布的为前两款准备好带华为P50Pro回家了吗?明日1008正式开售上月底,华为发布了P50系列。虽然此次发布推迟了数月,但这并不影响粉丝们对它的喜爱。在发布会之后,华为就开启了预售活动。据官网信息显示,P50Pro将会在明天(8月12日)上午10刚上市订单就破万,口碑爆棚,这台车为什么会这么火?每天三分钟,用车更轻松!大家好,我是你们的好朋友木沐阳。全球智能专业越野平台打造,搭载了长行程的主动悬架系统电控减震器主动稳定杆三把差速锁坦克转弯蠕行模式底盘透视L2级自动驾驶全速手握30万买车,宝马奔驰奥迪,值得买吗?应该怎么选?手握30万买车,可供选择的车型有很多,但是以过来人的经验还是建议直接选择BBA。因为在当今国内大环境下,车标的影响力往往占主导地位。我并不是说其他车型不好,只是在有选择的情况下,不车子开久了底盘松散怎么办?教你检查三部分,恢复到新车底盘老司机有过这个感受,车子开久了容易出现各种异响余振,虽不会危及驾驶,但是极度影响心情。这样的不适在过坑过坎或过不平整的路面时尤为明显。这是由于车子底盘在日常保养中往往容易被忽视,长首次买车的人不明白的5件事,老司机说破嘴都没用,得自己体会首次买车的朋友大多数对汽车的了解都不够,在他们的眼中,老司机要么只会嘴上开车,要么真的就是车界老油条。遇到真正的老司机,新手买车时还是愿意听他们的推荐,这在一定程度上也能少走弯路。开10万的车和开50万的车是什么体验?40万的差价,给我上了一课本文所述为真实发生的事,如有雷同,纯属巧合。故事的主角是我一哥们,从小玩到大,家里条件不错,大学毕业后一直在南京工作。对于汽车几乎不感冒,在他的眼里汽车真就是个代步工具,毕业后因为老司机分享高速公路驾驶经验,每一条都关乎安全,新手要牢记高速行车,安全第一,别的废话就不说了,这一句是这篇文章的核心。一高速行车遇到路面有异物怎么办?很常见,这种情形小木就遇到过不下于五次,常见的异物有饮料瓶树枝车身部件石子等等。遇到这