spring之BeanFactory
本文内容纲要:
spring的IOC容器能够帮我们自动new对象,对象交给spring管之后我们不用自己手动去new对象了。那么它的原理是什么呢?是怎么实现的呢?下面我来简单的模拟一下spring的机制,相信看完之后就会对spring的原理有一定的了解。
spring使用BeanFactory来实例化、配置和管理对象,但是它只是一个接口,里面有一个getBean()方法。我们一般都不直接用BeanFactory,而是用它的实现类ApplicationContext,这个类会自动解析我们配置的applicationContext.xml,然后根据我们配置的bean来new对象,将new好的对象放进一个Map中,键就是我们bean的id,值就是new的对象。
首先我们建立一个BeanFactory接口
1packagecom.spring;
2
3publicinterfaceBeanFactory{
4ObjectgetBean(Stringid);
5}
然后建立一个BeanFactory的实现类ClassPathXmlApplicationContext.java
1packagecom.spring;
2
3importjava.util.HashMap;
4importjava.util.List;
5importjava.util.Map;
6
7importorg.dom4j.Document;
8importorg.dom4j.DocumentException;
9importorg.dom4j.Element;
10importorg.dom4j.io.SAXReader;
11
12
13publicclassClassPathXmlApplicationContextimplementsBeanFactory{
14privateMap<String,Object>beans=newHashMap<String,Object>();
15publicClassPathXmlApplicationContext(StringfileName)throwsException{
16SAXReaderreader=newSAXReader();
17Documentdocument=reader.read(this.getClass().getClassLoader().getResourceAsStream(fileName));
18List<Element>elements=document.selectNodes("/beans/bean");
19for(Elemente:elements){
20Stringid=e.attributeValue("id");
21Stringvalue=e.attributeValue("class");
22Objecto=Class.forName(value).newInstance();
23beans.put(id,o);
24}
25}
26
27publicObjectgetBean(Stringid){
28returnbeans.get(id);
29}
30
31}
然后配置applicationContext.xml
1<?xmlversion="1.0"encoding="UTF-8"?>
2<beans>
3<beanid="c"class="com.spring.Car"></bean>
4<beanid="p"class="com.spring.Plane"></bean>
5</beans>
创建类的时候顺便演示一下工厂模式,其实BeanFactory它也是一种工厂模式的。
1packagecom.spring;
2
3publicinterfaceMoveable{
4voidrun();
5}
1packagecom.spring;
2
3publicclassCarimplementsMoveable{
4
5publicvoidrun(){
6System.out.println("拖着四个轮子满街跑car·····");
7}
8}
1packagecom.spring;
2
3publicclassPlaneimplementsMoveable{
4
5publicvoidrun(){
6System.out.println("拖着翅膀天空飞plane......");
7}
8
9}
现在来看一看效果吧,写一个类测试一下:
1packagecom.spring;
2
3importorg.dom4j.DocumentException;
4
5publicclassTest{
6
7/**
8*@paramargs
9*@throwsDocumentException
10*/
11publicstaticvoidmain(String[]args)throwsException{
12BeanFactoryfactory=newClassPathXmlApplicationContext("applicationContext.xml");
13Objecto=factory.getBean("c");
14Moveablem=(Moveable)o;
15m.run();
16}
17
18}
由于Map容器里面保存的是Object类型,所以通过getBean()方法取出来的对象要强制类型转换。
本文内容总结:
原文链接:https://www.cnblogs.com/liuling/archive/2013/04/14/BeanFactory.html