返回顶部
首页 > 资讯 > 精选 >Spring工厂的反射和配置文件源码分析
  • 839
分享到

Spring工厂的反射和配置文件源码分析

2023-07-05 23:07:15 839人浏览 八月长安
摘要

这篇文章主要介绍了spring工厂的反射和配置文件源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring工厂的反射和配置文件源码分析文章都会有所收获,下面我们一起来看看吧。反射和配置文件学习 Spr

这篇文章主要介绍了spring工厂的反射和配置文件源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring工厂的反射和配置文件源码分析文章都会有所收获,下面我们一起来看看吧。

    反射和配置文件

    学习 Spring 的时候,虽然可以知道是通过反射和配置文件的方式来获取 JavaBean 对象,但是一直没有机会自己尝试一次,探究以下内部原理,虽然有人推荐阅读源码,但是可能还是感觉学的不好,一直没有尝试过。现在刚好学习设计模式刚好遇到了这部分的内容了,感觉自己对这个有了一个较好的理解了。

    设计模式中,为了满足开闭原则,大都引入了抽象层,如工厂方法模式、抽象工厂模式等。客户端针对抽象层编程,而在程序运行的时候再指定其子类,根据里氏代换原则和面向对象的多态性,子类对象再运行时将覆盖父类对象。如果需要对系统进行扩展,只需要修改子类类名即可。在具体实现时,通过引入配置文件可以使得用户再不修改客户端任何代码的前提下增加或替换子类,

    其基本实现过程过程为:

    1. 客户端针对抽象层编程,客户端代码中不能出现具体的类名,即客户端不直接实例化对象。

    2. 引入纯文本格式的配置文件,通常是 XML 文件,将具体类类名存储在配置文件中。

    3. 通过 DOM(Document Object Model,文档对象模型)、SAX(Simpleapi for XML)等 XML 解析技术获取存储在配置文件中类名。

    4. 在客户端代码中通过反射机制根据类名创建对象,用反射所创建的对象代替父类对象的引用,程序运行时,将调用子类方法来实现业务功能。

    5. 如果需要扩展功能,只需要添加一个新的子类继承抽象父类,再修改配置文件,重新运行程序即可;如果需要替换功能,只需要另一个子类类名替换存储再配置文件中的原有子类类名。无论是扩展还是替换都无须修改既有类库和客户端源码,完全符合开闭原则。

    Talk is cheap, show me the code.

    直接通过代码来理解上面的内容吧。

    <?xml version="1.0" encoding="UTF-8"?><beans><bean>com.reflect.Dog</bean></beans>

    测试实体类

    package com.reflect;public class Dog {private String name;private Integer age;public Dog() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Dog [name=" + name + ", age=" + age + "]";}}

    对象工厂类(类似Spring工厂的简单实现)

    package com.reflect;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.*;public class Factory {public static Object getBean() {try {Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("src/beans.xml");//获取包含类名的文本节点nodeList nodeList  = doc.getElementsByTagName("bean");Node node = nodeList.item(0).getFirstChild();String name = node.getNodeValue();//通过类名生成实例对象并将其返回Class<?> clazz = Class.forName(name);return clazz.newInstance();} catch (Exception e) {e.printStackTrace();return null; } }}

    测试类

    package com.reflect;public class Test {public static void main(String[] args) {Dog dog = null;dog = (Dog)Factory.getBean();dog.setName("小黑");dog.setAge(12);System.out.println(dog.toString());}}

    项目目录结构
    注意这里需要使用 dom4j 的jar包,下载导入即可!

    Spring工厂的反射和配置文件源码分析

    运行结果

    Spring工厂的反射和配置文件源码分析

    现在需求变了,不想使用 Dog 类,而要使用 HuntDog 类,只要增加 HuntDog 类, 并继承 Dog 类即可,项目源码不需要改动,满足开闭原则。

    package com.reflect;public class HuntDog extends Dog {private String name;private Integer age;public HuntDog() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "HuntDog [name=" + name + ", age=" + age + "]";}public void say() {System.out.println("Hello, I am HuntDog: "+this.toString());}}

    修改 XML 如下:

    <?xml version="1.0" encoding="UTF-8"?><beans><bean>com.reflect.HuntDog</bean></beans>

    修改后的运行结果

    Spring工厂的反射和配置文件源码分析

    关于“Spring工厂的反射和配置文件源码分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Spring工厂的反射和配置文件源码分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

    --结束END--

    本文标题: Spring工厂的反射和配置文件源码分析

    本文链接: https://lsjlt.com/news/355761.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Spring工厂的反射和配置文件源码分析
      这篇文章主要介绍了Spring工厂的反射和配置文件源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring工厂的反射和配置文件源码分析文章都会有所收获,下面我们一起来看看吧。反射和配置文件学习 Spr...
      99+
      2023-07-05
    • 浅析Spring工厂的反射和配置文件
      目录反射和配置文件Talk is cheap, show me the code.测试实体类对象工厂类(类似Spring工厂的简单实现)总结反射和配置文件 学习 Spring 的时候...
      99+
      2023-05-14
      Spring工厂 Spring反射 Spring配置
    • Java中dom4j怎么读取配置文件实现抽象工厂+反射
      本篇内容主要讲解“Java中dom4j怎么读取配置文件实现抽象工厂+反射”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中dom4j怎么读取配置文件实现抽象工厂+反射”吧!在Java中也可...
      99+
      2023-06-17
    • Spring配置类源码分析详解
      目录spring配置类解析源码解析配置类解析源码分析判断配置类解析配置类配置类的处理总结扩展点spring配置类解析源码解析 上一篇分析spring的启动过程中,会把BeanDefi...
      99+
      2024-04-02
    • Spring配置文件的拆分和整合过程分析
      目录一、Spring配置文件拆分:二、Spring配置文件整合:一、Spring配置文件拆分: 在实际应用里,随着应用规模的增加,系统中 Bean 数量也大量增加,导致配置文件非常庞...
      99+
      2024-04-02
    • Spring Boot配置文件实例分析
      今天小编给大家分享一下Spring Boot配置文件实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一...
      99+
      2024-04-02
    • Redis配置文件代码的示例分析
      这篇文章将为大家详细讲解有关Redis配置文件代码的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis配置文件解析网上都有,这里不赘述了。提供一些值得修改的...
      99+
      2024-04-02
    • Spring 加载多个xml配置文件的原理分析
      目录示例spring-configlication.xml:spring-config-instance-factory.xmljava示例代码实现AbstractRefreshab...
      99+
      2024-04-02
    • logBack配置日志文件及编码配置的示例分析
      这篇文章主要介绍了logBack配置日志文件及编码配置的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。logback输出到文件文件大小设置问题目前网上能搜到的关于输出...
      99+
      2023-06-20
    • hibernate中配置文件工作原理的示例分析
      这篇文章主要为大家展示了“hibernate中配置文件工作原理的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“hibernate中配置文件工作原理的示例...
      99+
      2024-04-02
    • spring@value注入配置文件值失败的原因分析
      目录spring@value注入配置文件值失败的原因spring配置文件@Value注解注入失败或为null解决方案代码示例问题解析问题拓展spring@value注入配置文件值失败...
      99+
      2024-04-02
    • SpringBoot上传文件并配置本地资源映射来访问文件的实例代码
      1.准备工作 1、新建一个SpringBoot项目加上web依赖, 所有依赖 <dependency> <groupId>org.springframe...
      99+
      2024-04-02
    • SpringBoot深入分析AutoConfigurationImportFilter自动化条件配置源码
      目录1. AutoConfigurationImportFilter的作用2. AutoConfigurationImportFilter UML类图说明3. FilteringSp...
      99+
      2024-04-02
    • Redis3.2.6配置文件的示例分析
      小编给大家分享一下Redis3.2.6配置文件的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Redis3.2.6最新配...
      99+
      2024-04-02
    • Mysql配置文件的示例分析
      这篇文章给大家分享的是有关Mysql配置文件的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。[mysqld]port = 3306serverid = 1socket =...
      99+
      2024-04-02
    • package.json文件配置的示例分析
      这篇文章将为大家详细讲解有关package.json文件配置的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。package.json 是npm init命令初始化...
      99+
      2024-04-02
    • Hibernate配置文件的示例分析
      小编给大家分享一下Hibernate配置文件的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!有两种Hibernate配置文件格式,一种是XML,默认为Hi...
      99+
      2023-06-17
    • Ubuntu网络配置软件源的示例分析
      小编给大家分享一下Ubuntu网络配置软件源的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!sudo pppoeconf  ...
      99+
      2023-06-16
    • Spring注解之@Import注解的使用和源码分析
      目录介绍@Import导入bean的三种方式普通类ImportSelector接口ImportBeanDefinitionRegistrar接口源码解析总结介绍 今天主要介...
      99+
      2023-05-16
      Spring注解@Import Spring注解 @Import注解的使用 注解@Import源码
    • Redis配置文件redis.conf的详细分析
      这篇文章主要介绍了Redis配置文件redis.conf的详细分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。文章目录一、常用的三十条配置...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作