热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用工厂模式+反射对依赖注入做个探究

概述创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象的模式叫工厂模式,结

概述

创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象的模式叫工厂模式,结合以前学的反射来对依赖注入做个简单的探究

大体思路是有一个实体BeanDefinition记录类的信息,而XmlBeanConfigParser负责解析xml文件,并将实体信息传给BeansFactory,BeansFactory根据实体信息创建相应的对象,如图
在这里插入图片描述

demo

ClassPathXmlApplication类:

public class ClassPathXmlApplication {private BeansFactory beansFactory;private XmlBeanConfigParser beanConfigParser;public ClassPathXmlApplication(String config){this.beansFactory &#61; new BeansFactory();this.beanConfigParser &#61; new XmlBeanConfigParser();loadBeanDefinition(config);}private void loadBeanDefinition(String config) {InputStream in &#61; null;try {in &#61; this.getClass().getResourceAsStream("/"&#43;config);if (in &#61;&#61; null){throw new RuntimeException("can not find config file:"&#43;config);}List<BeanDefinition> beanDefinitions &#61; beanConfigParser.parse(in);beansFactory.addBeanDefinitions(beanDefinitions);} catch (DocumentException e) {e.printStackTrace();}finally {if (in!&#61;null){try {in.close();} catch (IOException e) {e.printStackTrace();}}}}public Object getBean(String beanId){return beansFactory.getBean(beanId);}public static void main(String[] args) {ClassPathXmlApplication xmlApplication &#61; new ClassPathXmlApplication("beans.xml");Person person &#61; (Person) xmlApplication.getBean("person");System.out.println(person);}}

XmlBeanConfigParser 类:解析xml配置文件&#xff0c;生成BeanDefinition的List传给BeanFactory

public class XmlBeanConfigParser {public List<BeanDefinition> parse(InputStream inputStream) throws DocumentException {List<BeanDefinition> beanDefinitions &#61; new ArrayList<>();SAXReader reader &#61; new SAXReader();;Document document &#61; reader.read(inputStream);Element root &#61; document.getRootElement();Iterator<Element> it&#61;root.elementIterator("bean");while (it.hasNext()){BeanDefinition beanDefinition &#61; new BeanDefinition();Element child &#61; it.next();Iterator<Attribute> attribute &#61; child.attributeIterator();while(attribute.hasNext()) {Attribute attr &#61; attribute.next();if ("id".equalsIgnoreCase(attr.getName())){beanDefinition.setId(attr.getValue());}if ("class".equalsIgnoreCase(attr.getName())){beanDefinition.setClassName(attr.getValue());}}beanDefinitions.add(beanDefinition);}return beanDefinitions;}}

BeansFactory:把解析过来的

List<BeanDefinition> beanDefinitionList

存到一个Map对象中&#xff0c;需要的时候从Map中拿

public class BeansFactory {private ConcurrentHashMap<String, BeanDefinition> beanDefinitions &#61; new ConcurrentHashMap<>();public void addBeanDefinitions(List<BeanDefinition> beanDefinitionList){for (BeanDefinition bean:beanDefinitionList) {this.beanDefinitions.put(bean.getId(),bean);}}public Object getBean(String beanId){BeanDefinition beanDefinition &#61; beanDefinitions.get(beanId);if (beanDefinition&#61;&#61;null){throw new NoSuchBeanDefinitionException("没有这个bean类");}//创建类return createBean(beanDefinition);
}private Object createBean(BeanDefinition beanDefinition) {Object bean &#61; null;try {Class beanClass &#61; Class.forName(beanDefinition.getClassName());bean &#61; beanClass.newInstance();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();}return bean;}
}

BeanDefinition:保存xml中bean对象的信息

public class BeanDefinition {private String id;private String className;public void setId(String id) {this.id &#61; id;}public void setClassName(String className) {this.className &#61; className;}public String getId() {return id;}public String getClassName() {return className;}
}

测试一下:
在这里插入图片描述


推荐阅读
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
author-avatar
mobiledu2402851173
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有