博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring BeanFactory的xml工厂模式简单实现(二)
阅读量:6069 次
发布时间:2019-06-20

本文共 2674 字,大约阅读时间需要 8 分钟。

hot3.png

背景

工厂模式是大家非常熟悉的设计模式,spring BeanFactory将此模式发扬光大,今天就来讲讲,spring IOC容器是如何帮我管理Bean,构造对象的,简单的写了一个demo。

思路如下:

  1. 解析xml文件,将bean标签的,id,class存储在一个map中
  2. 获取实例对象时通过id匹配,匹配成功返回该对象

先看下常见的工厂模式

关于什么是工厂模式之前写过一个:

创建一个接口类Pizza

package com.spring.xml;public interface Pizza{    public float getPrice();}

MargheritaPizza 类

package com.spring.xml;public class MargheritaPizza implements Pizza{    public float getPrice() {        System.out.println("8.5f");        return 8.5f;           }}

CalzonePizza 类

public class CalzonePizza implements Pizza{   public float getPrice() {       System.out.println("2.5f");       return 2.5f;   }   }

建立工厂类PizzaFactory

通过传入参数id,选择不同的实例类,如果后续不断的增加新类,会频繁的修改create方法,不符合开闭原则

public class PizzaFactory {    public Pizza create(String id) {        if (id == null) {          throw new IllegalArgumentException("id is null!");        }        if ("Calzone".equals(id)) {          return new CalzonePizza();        }        if ("Margherita".equals(id)) {          return new MargheritaPizza();        }        throw new IllegalArgumentException("Unknown id = " + id);      }}

采用spring xml 配置的方式实现工厂类的管理

建立一个BeanFactory接口

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

实现类ClassPathXmlApplicationContext.java

BeanFactory实现类,主要功能是解析xml文件,封装bean到map中

public class ClassPathXmlApplicationContext implements BeanFactory {     private Map
beans = new HashMap
(); public ClassPathXmlApplicationContext(String fileName) throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read(this.getClass().getClassLoader().getResourceAsStream(fileName)); List
elements = document.selectNodes("/beans/bean"); for (Element e : elements) { //获取beanId String id = e.attributeValue("id"); //获取beanId对于的ClassPath下class全路径名称 String value = e.attributeValue("class"); //通过反射实例化该beanId 的class对象 Object o = Class.forName(value).newInstance(); //封装到一个Map里 beans.put(id, o); } } public Object getBean(String id) { return beans.get(id); } }

applicationContext.xml配置

写一个类测试一下

package com.spring.xml;  import org.dom4j.DocumentException;  public class Test {    public static void main(String[] args) throws Exception {         BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");         Pizza p = (Pizza)factory.getBean("Calzone");         p.getPrice();             } }

看完代码应该非常清楚,比起原先通过if else来选择不同的实现类方便。

转载于:https://my.oschina.net/u/923324/blog/832612

你可能感兴趣的文章
初窥系统集成
查看>>
程序员应该知道的100个Vim命令
查看>>
实验设计与排错之一静态路由
查看>>
第二篇:JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码及...
查看>>
如何应对勒索病毒
查看>>
Servlet系列文章(一)
查看>>
点击文件下载
查看>>
纯java环境下sqlsqlcipher解密sqlite数据库文件
查看>>
思科路由器基本命令学习总结
查看>>
Mysql 5.7.9源代码安装
查看>>
【表单设计】input的size和maxlength属性
查看>>
存储方案与存储产品之DAS篇
查看>>
Solr1.3的核心机制
查看>>
vue 按需加载
查看>>
OpenCV编程->ROI区域保存为图片
查看>>
SS哥的crontab教程
查看>>
python 面向对象
查看>>
兼职议会
查看>>
2012.12.18
查看>>
rpm包管理和yum的使用
查看>>