3,工厂模式--模拟spring的bean工厂beanFactory
2013-04-01 16:12
405 查看
1.今天咱们自己写一个工程用于模拟spring的bean工厂,在spring中我们可以把类配置到applicationContext.xml文件中,然后就可以从beanFactoy中取出这个类的对象,这里需要用得到java中xml的解析技术,常用的有四种解析技术,我们这里用到的是jdom解析,首先需要在jdom的官网上www.jdom.org下载jdom的jar文件,把lib下的全部jar包引进和jdom.jar这个核心jar包引进就OK了.
下面直接上代码
交通工具接口
package com.soukenan.spring.factory;
public interface Vehicle {
public void run();
}
两个实现了这个接口的类
汽车类
package com.soukenan.spring.factory;
public class Car implements Vehicle{
@Override
public void run() {
System.out.println("我有四个轱辘,我可以跑的很快,,,,,,,");
}
}
火车类
package com.soukenan.spring.factory;
public class Train implements Vehicle{
@Override
public void run() {
System.out.println("我有很多的轱辘,我可以跑的非常非常的快,,,,,,");
}
}
spring的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans >
<bean id="car" class="com.soukenan.spring.factory.Car"></bean>
<bean id="train" class="com.soukenan.spring.factory.Train"></bean>
</beans>
BeanFactory接口
package com.soukenan.spring.factory;
public interface BeanFactory {
public Object getBean(String id);
}
实现了该接口的ClassPathXmlApplicationContext类
package com.soukenan.spring.factory;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.jdom2.xpath.XPath;
public class ClassPathXmlApplicationContext implements BeanFactory {
public Map<String,Object> container = new HashMap<String,Object>();
public ClassPathXmlApplicationContext(String path) throws Exception{
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream(path));
Element root = doc.getRootElement();
List list = XPath.selectNodes(root, "/beans/bean");
for (int i = 0; i < list.size(); i++) {
Element bean = (Element) list.get(i);
String id = bean.getAttributeValue("id");
String className = bean.getAttributeValue("class");
Object o = Class.forName(className).newInstance();
container.put(id, o);
}
}
@Override
public Object getBean(String id) { return this.container.get(id);
}
}
各个文件的目录
测试主类
package com.soukenan.spring.factory;
import java.io.IOException;
import java.util.Properties;
public class Main {
public static void main(String[] args) throws IOException, InstantiationException, IllegalAccessException, Exception{
BeanFactory bf = new ClassPathXmlApplicationContext("applicationContext.xml");
Vehicle v = (Vehicle) bf.getBean("car");
v.run();
}
}
看看用法是不是和spring的一模一样呢? 很神奇吧
有问题的话,请回复我哦!
本文出自 “Kenan_ITBlog” 博客,请务必保留此出处http://soukenan.blog.51cto.com/5130995/1062462
下面直接上代码
交通工具接口
package com.soukenan.spring.factory;
public interface Vehicle {
public void run();
}
两个实现了这个接口的类
汽车类
package com.soukenan.spring.factory;
public class Car implements Vehicle{
@Override
public void run() {
System.out.println("我有四个轱辘,我可以跑的很快,,,,,,,");
}
}
火车类
package com.soukenan.spring.factory;
public class Train implements Vehicle{
@Override
public void run() {
System.out.println("我有很多的轱辘,我可以跑的非常非常的快,,,,,,");
}
}
spring的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans >
<bean id="car" class="com.soukenan.spring.factory.Car"></bean>
<bean id="train" class="com.soukenan.spring.factory.Train"></bean>
</beans>
BeanFactory接口
package com.soukenan.spring.factory;
public interface BeanFactory {
public Object getBean(String id);
}
实现了该接口的ClassPathXmlApplicationContext类
package com.soukenan.spring.factory;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.jdom2.xpath.XPath;
public class ClassPathXmlApplicationContext implements BeanFactory {
public Map<String,Object> container = new HashMap<String,Object>();
public ClassPathXmlApplicationContext(String path) throws Exception{
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream(path));
Element root = doc.getRootElement();
List list = XPath.selectNodes(root, "/beans/bean");
for (int i = 0; i < list.size(); i++) {
Element bean = (Element) list.get(i);
String id = bean.getAttributeValue("id");
String className = bean.getAttributeValue("class");
Object o = Class.forName(className).newInstance();
container.put(id, o);
}
}
@Override
public Object getBean(String id) { return this.container.get(id);
}
}
各个文件的目录
测试主类
package com.soukenan.spring.factory;
import java.io.IOException;
import java.util.Properties;
public class Main {
public static void main(String[] args) throws IOException, InstantiationException, IllegalAccessException, Exception{
BeanFactory bf = new ClassPathXmlApplicationContext("applicationContext.xml");
Vehicle v = (Vehicle) bf.getBean("car");
v.run();
}
}
看看用法是不是和spring的一模一样呢? 很神奇吧
有问题的话,请回复我哦!
本文出自 “Kenan_ITBlog” 博客,请务必保留此出处http://soukenan.blog.51cto.com/5130995/1062462
相关文章推荐
- 由歌词引发的模式思考之下篇(模拟Spring的BeanFactory)
- 由歌词引发的模式思考之下篇(模拟Spring的BeanFactory)
- Spring学习笔记一: Bean工厂(BeanFactory )与应用上下文(ApplicationContext)BeanFactory
- Spring 通过工厂方法(Factory Method)来配置bean
- 框架 day37 Spring3,AOP,代理模式(动态/CGLIB/工厂bean),传统AOP,AspectJ框架(基于xml/注解),切入点表达式,jdbcTemplate
- [Java] 设计模式之工厂系列 04 (自定义模拟 spring 读取xml文件 beanFactory)
- Spring配置bean的方法(工厂方法和Factorybean)
- [Java] 设计模式之工厂系列 04 (自定义模拟 spring 读取xml文件 beanFactory)
- spring 与设计模式(创建型)之工厂模式Factory
- spring详解:通过FactoryBean自定义工厂初始化Bean
- Spring配置bean的方法(工厂方法和Factorybean)
- Spring学习(7)--Spring中通过工厂方法和FactoryBean配置bean
- Spring-配置bean的方法(工厂方法和Factorybean)【转】
- Spring - BeanFactory 新旧工厂差异
- Spring配置bean的方法(工厂方法和Factorybean)
- Spring源码学习之:模拟实现BeanFactory,从而说明IOC容器的大致原理
- spring Bean使用案例 静态方法方式 和工厂模式
- Spring--IoC--Bean的装配--工厂方法设计模式
- 从源代码解读spring之DataSource实现和FactoryBean模式(JndiObjectFactoryBean)
- Spring源代码分析(15)---LocalSessionFactoryBean(工厂的工厂)