spring实例化之底层实现原理

来源:互联网 发布:java手机游戏培训 编辑:程序博客网 时间:2024/05/22 17:47

spring之BeanFactory

  spring的IOC容器能够帮我们自动new对象,对象交给spring管之后我们不用自己手动去new对象了。那么它的原理是什么呢?是怎么实现的呢?下面我来简单的模拟一下spring的机制,相信看完之后就会对spring的原理有一定的了解。

  spring使用BeanFactory来实例化、配置和管理对象,但是它只是一个接口,里面有一个getBean()方法。我们一般都不直接用BeanFactory,而是用它的实现类ApplicationContext,这个类会自动解析我们配置的applicationContext.xml,然后根据我们配置的bean来new对象,将new好的对象放进一个Map中,键就是我们bean的id,值就是new的对象。

  首先我们建立一个BeanFactory接口

1 package com.spring;2 3 public interface BeanFactory {4     Object getBean(String id);5 }

  然后建立一个BeanFactory的实现类ClassPathXmlApplicationContext.java

复制代码
 1 package com.spring; 2  3 import java.util.HashMap; 4 import java.util.List; 5 import java.util.Map; 6  7 import org.dom4j.Document; 8 import org.dom4j.DocumentException; 9 import org.dom4j.Element;10 import org.dom4j.io.SAXReader;11 12 13 public class ClassPathXmlApplicationContext implements BeanFactory {14     private Map<String, Object> beans = new HashMap<String, Object>();15     public ClassPathXmlApplicationContext(String fileName) throws Exception{16         SAXReader reader = new SAXReader();17         Document document = reader.read(this.getClass().getClassLoader().getResourceAsStream(fileName));18         List<Element> elements = document.selectNodes("/beans/bean");19         for (Element e : elements) {20             String id = e.attributeValue("id");21             String value = e.attributeValue("class");22             Object o = Class.forName(value).newInstance();23             beans.put(id, o);24         }25     }26     27     public Object getBean(String id) {28         return beans.get(id);29     }30 31 }
复制代码

  然后配置applicationContext.xml

1 <?xml version="1.0" encoding="UTF-8"?>2 <beans>3     <bean id="c" class="com.spring.Car"></bean>4      <bean id="p" class="com.spring.Plane"></bean>5 </beans>

创建类的时候顺便演示一下工厂模式,其实BeanFactory它也是一种工厂模式的。

1 package com.spring;2 3 public interface Moveable {4     void run();5 }
复制代码
1 package com.spring;2 3 public class Car implements Moveable{4     5     public void run(){6         System.out.println("拖着四个轮子满街跑car·····");7     }8 }
复制代码
复制代码
1 package com.spring;2 3 public class Plane implements Moveable{4 5     public void run() {6         System.out.println("拖着翅膀天空飞plane......");7     }8     9 }
复制代码

 

现在来看一看效果吧,写一个类测试一下:

复制代码
 1 package com.spring; 2  3 import org.dom4j.DocumentException; 4  5 public class Test { 6  7     /** 8      * @param args 9      * @throws DocumentException 10      */11     public static void main(String[] args) throws Exception {12         BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");13         Object o = factory.getBean("c");14         Moveable m = (Moveable)o;15         m.run();16     }17 18 }
复制代码

由于Map容器里面保存的是Object类型,所以通过getBean()方法取出来的对象要强制类型转换。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 年轻母亲9完整高清免费观看 国产孕妇碰碰碰 厨房侵犯中文字幕 我邻居的妻子中文字幕在线 怀孕全部过程视频播放 水电工在厨房和妻子的视频 妻子出轨水电工在线播放 老公把婆婆干怀孕 在丈夫面前被侵 中文字幕全集 部长的妻子味道中文字幕 中文字幕被水电工掠夺的妻子 妻子在厨房跟水电工 互动 妻子与水电工在线 丈夫出差妻子与水电工 樱萌子被水电工侵犯中文字幕 在丈夫的面前侵犯入侵中文字幕 好妻子在线中文字幕 前田香织侵犯中文字幕 佐佐木明希上司中文字幕迅雷 医生d淫孕妇 公公一晚上要8次 公公现在就想要白关婷中文字幕 丈夫上司侵犯系列在线 义父犯美媳嫁樱花叶菜在线播放 儿子的妻子在线中文字幕云播 老公去世公公每天晚上抱着我睡 被水电工掠夺的妻子在线播放b 佐佐木明希大嫂中文字幕全集 善良的小妻子字幕 公公在我洗碗时在厨房要了我 大嫂被肉翻了天佐佐木明希1 教师蕾丝短裙中文字幕 瓜棚里和大嫂乱禽 强睡大嫂中文字 免费 佐佐木明希 房东中文字幕 与父亲干柴烈火 中文字幕丈夫不在 9大嫂被禽翻中文字幕 侵犯你的贞洁 中文字幕 年轻的妻子在线观中文字幕 大嫂被翻天了佐佐木b希中文7