自己动手写一个SpringIOC!
2018-03-08 06:49
495 查看
话说:
各位读者盆友,早上好!还是那句话:学会一样东西的感觉是快乐的,如果能够创造点什么,会更加快乐。
理解一个东西,除了概念理解之外,最好的方式就是去实现一下。今天目标:自己实现一个IOC.
我们自己配置一个myspring.xml,配置好id class,然后手动写一个我们的工程-beanFactory,来写方法实现读取myspring.xml,来实例化这个对象。
目录
1.整体结构图
2.pom.xml
3.myspring.xml
4.后端代码
5.总结
1.整体结构图
2.pom.xml
3.myspring.xml
4.后端代码
1)类Hello
2)接口BeanFactory
3)实现类ClassPathXmlApplicationContext
4)测试TestMySpringIoc
1)类Hello
2)接口BeanFactory
3)实现类ClassPathXmlApplicationContext
4)测试TestMySpringIoc
5.总结
1.IOC核心就是通过xml配置来替我们实例化对象,所以这里要用到xml解析。如何解析xml?我们通过jdom,通过SAXBuilder来得到Document对象,然后操作节点;
2.为什么new就可以了,还这么麻烦要通过配置文件?
涉及到对象产生的条件。new的时候,必须要知道对象,如果不知道呢?就通过配置文件。
3.如何得到一个流?
this.getClass().getClassLoader().getResourcesAsStream();
如何根据类名实例化这个类:Class.forName().newInstance();
4.既然可以读取xml中的内容?如何写进去?下一篇博客,让我们拭目以待!
好了,下一篇让我们拭目以待吧!.
各位读者盆友,早上好!还是那句话:学会一样东西的感觉是快乐的,如果能够创造点什么,会更加快乐。
理解一个东西,除了概念理解之外,最好的方式就是去实现一下。今天目标:自己实现一个IOC.
我们自己配置一个myspring.xml,配置好id class,然后手动写一个我们的工程-beanFactory,来写方法实现读取myspring.xml,来实例化这个对象。
目录
1.整体结构图
2.pom.xml
3.myspring.xml
4.后端代码
5.总结
1.整体结构图
2.pom.xml
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- 引入第三方库 --> <dependency> <groupId>jdom</groupId> <artifactId>jdom</artifactId> <version>1.1</version> </dependency>
3.myspring.xml
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="hello" class="com.hmc.demo.Hello"></bean> </beans>
4.后端代码
1)类Hello
2)接口BeanFactory
3)实现类ClassPathXmlApplicationContext
4)测试TestMySpringIoc
1)类Hello
package com.hmc.demo; import org.apache.log4j.Logger; /** * *2018年3月7日 *User:Meice *上午11:15:50 */ public class Hello { public Logger log = Logger.getLogger(this.getClass()); public void sayHello() { log.info("Hello World! meice ~ *.* 20180307"); } }
2)接口BeanFactory
package com.hmc.demo; /** * *2018年3月7日 *User:Meice *上午11:29:14 */ /** * 创建工厂 生产对象实例 * @author Administrator * */ public interface BeanFactory { //获取对象实例的方法 Object getBean(String id); }
3)实现类ClassPathXmlApplicationContext
package com.hmc.demo; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.apache.log4j.Logger; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; /** * *2018年3月7日 *User:Meice *上午11:30:53 */ public class ClassPathXmlApplicationContext implements BeanFactory { private Map<String, Object> beans;//模拟Spring容器 public Logger log = Logger.getLogger(this.getClass()); //初始化类的时候Map这个模拟容器中就要有bean public ClassPathXmlApplicationContext() throws ClassNotFoundException, JDOMException, IOException, InstantiationException, IllegalAccessException { beanInit(null); } //具体获得 对象实例的方法 public Object getBean(String id) { return beans.get(id); } //定义初始化对象的方法 public void beanInit(String xmlFileName) throws JDOMException, IOException, ClassNotFoundException, InstantiationException, IllegalAccessException { //初始化beans beans = new HashMap<String, Object>(); log.info("===============初识化bean================"); //1.避免如果没有传入文件 "".equals(xmlFileName)和xmlFileName.equals("")是有区别的,第二个本身就NullPointerException,第一种 可避免 if("".equals(xmlFileName) || xmlFileName == null) { xmlFileName = "myspring.xml"; } //2.创建jdom对象 注意以下导包都是:jdom下面的 SAXBuilder builder = new SAXBuilder(); //3.创建输入流 InputStream is = this.getClass().getClassLoader().getResourceAsStream(xmlFileName); //4.获取Document对象 Document document = builder.build(is); //5.获取根元素 Element element = document.getRootElement(); //6.获取子元素集合 List<Element> elementList = element.getChildren(); //7.遍历取值 for(Element element2 :elementList) { String id = element2.getAttributeValue("id"); String clazz = element2.getAttributeValue("class");//这里class是关键字,用clazz代替或者beanClass log.info("=========================解析xml配置: id="+id + "=======class: "+clazz); //根据类名,如何实例化这个类? Object beanObj = Class.forName(clazz).newInstance(); //存放到我们定义的“容器“beans里面 beans.put(id, beanObj); } //遍历输出Map Set<Entry<String, Object>> enty = beans.entrySet(); if(enty != null) { for(Entry<String, Object> en:enty) { System.out.println("key "+en.getKey()+" value "+en.getValue()); } } log.info("===============bean初始化结束================"); } }
4)测试TestMySpringIoc
package myspringioc2; import java.io.IOException; import org.jdom.JDOMException; import org.junit.Test; import com.hmc.demo.BeanFactory; import com.hmc.demo.ClassPathXmlApplicationContext; import com.hmc.demo.Hello; /** * *2018年3月8日 *User:Meice *上午5:13:08 */ public class TestMySpringIoc { @Test public void testSpringIoc() throws ClassNotFoundException, JDOMException, IOException, InstantiationException, IllegalAccessException { //创建我们自己写的“工厂” BeanFactory beanFactory = new ClassPathXmlApplicationContext(); //得到bean Hello hello =(Hello) beanFactory.getBean("hello"); //检测是否实例化 hello.sayHello(); } /** * 运行结果: * [INFO ] 2018-03-08 05:37:35,865 method:com.hmc.demo.ClassPathXmlApplicationContext.beanInit(ClassPathXmlApplicationContext.java:47) ===============初识化bean================ [INFO ] 2018-03-08 05:37:36,090 method:com.hmc.demo.ClassPathXmlApplicationContext.beanInit(ClassPathXmlApplicationContext.java:67) =========================解析xml配置: id=hello=======class: com.hmc.demo.Hello key hellovalue com.hmc.demo.Hello@6bc168e5 [INFO ] 2018-03-08 05:37:36,096 method:com.hmc.demo.ClassPathXmlApplicationContext.beanInit(ClassPathXmlApplicationContext.java:86) ===============bean初始化结束================ [INFO ] 2018-03-08 05:37:36,098 method:com.hmc.demo.Hello.sayHello(Hello.java:16) Hello World! meice ~ *.* 20180307 */ }
5.总结
1.IOC核心就是通过xml配置来替我们实例化对象,所以这里要用到xml解析。如何解析xml?我们通过jdom,通过SAXBuilder来得到Document对象,然后操作节点;
2.为什么new就可以了,还这么麻烦要通过配置文件?
涉及到对象产生的条件。new的时候,必须要知道对象,如果不知道呢?就通过配置文件。
3.如何得到一个流?
this.getClass().getClassLoader().getResourcesAsStream();
如何根据类名实例化这个类:Class.forName().newInstance();
4.既然可以读取xml中的内容?如何写进去?下一篇博客,让我们拭目以待!
好了,下一篇让我们拭目以待吧!.
相关文章推荐
- spring ioc原理(看完后大家可以自己写一个spring)
- spring ioc原理(看完后大家可以自己写一个spring)
- 自己动手搭建一个简易的SpringBoot环境
- 深入理解Spring--动手实现一个简单的SpringIOC容器-非注解版
- spring ioc原理(看完后大家可以自己写一个spring)
- spring ioc原理(看完后大家可以自己写一个spring)
- spring ioc原理(看完后大家可以自己写一个spring)
- 深入理解Spring--动手实现一个简单的SpringIOC容器
- spring ioc原理(看完后大家可以自己写一个spring)
- spring ioc原理(看完后大家可以自己写一个spring)
- 自己动手模拟spring的IOC
- 自己动手写个spring IOC容器
- spring ioc原理(看完后大家可以自己写一个spring)
- 【转】spring ioc原理(看完后大家可以自己写一个spring)
- 自己动手实现一个简单的 IOC
- 自己写一个简单的Spring IOC容器
- spring ioc原理(看完后大家可以自己写一个spring)
- spring ioc原理(看完后大家可以自己写一个spring)
- spring ioc原理(看完后大家可以自己写一个spring)
- 自己动手写一个简单的IOC框架,使用注解绑定资源和事件