Spring源码(二-3)-XML文件的读取-factory-method的使用

简介: Spring 可以通过 factory-method 实例化对象。factory-method方式是 Spirng 实例对象的方式之一。
日积月累,水滴石穿 😄

Spring可以通过factory-method实例化对象。factory-method方式是 Spirng 实例对象的方式之一。

创建对象的方式有两种方式:

  • 一种是静态工厂注入(其中的方法必须是静态的)。
  • 另一种是实例工厂注入。

下面一起来看看两种方式的使用方式

静态工厂注入

创建 A 对象,提供基本的属性和 get、set方法、构造函数、toString 方法。

public class A {

    private String name;

    private String email;

    public A() {
    }

    public A(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "A{" +
                "name='" + name + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

静态工厂类

public class AFactory {

    private static A a;

    //静态方法 创建 A 对象
    public static A getInstance(String name){
        return  new A(name);
    }
}

添加配置

<!--静态获取Bean对象-->
<bean id="aFactory" class="com.gongj.factoryMethod.AFactory"
      factory-method="getInstance">
    <!--getInstance方法的参数-->
    <constructor-arg index="0" value="GONGJ"></constructor-arg>
</bean>

class 属性指定工厂类的路径;factory-method 属性指定工厂类中静态方法constrctor-arg 属性用于给静态方法传递参数。

测试

public static void main(String[] args) {
    ClassPathXmlApplicationContext cxt = new ClassPathXmlApplicationContext("factoryMethod.xml");
    Object aFactory = cxt.getBean("aFactory");
    System.out.println("结果:" +aFactory);
}
结果:A{name='GONGJ', email='null'}

当然也可以指定参数获得对象:

Object aFactory = cxt.getBean("aFactory","哈哈哈哈");
System.out.println("结果:" +aFactory);

结果:A{name='哈哈哈哈', email='null'}

指定参数这种方式需要将 aFactory 的作用域改为 prototype。这里使用的 ClassPathXmlApplicationContext 容器,容器启动的时候就将 aFactory 创建了(懒加载单例bean),并使用 xml 指定的构造函数创建A

实例工厂注入

实例工厂方式需要先实例化工厂类,然后再通过已经实例化的工厂对象中一个方法来创建bean,并注入到容器中。

还是使用上面使用的 AFactory 类,在其中增加方法 getInstanceMethod,与上述 getInstance 方法就少了一个 static 关键字。

public A getInstanceMethod(String name){
   
       return new A(name);
    
}

修改配置

<!--实例化工厂类-->
<bean class="com.gongj.factoryMethod.AFactory" id="aFactory"></bean>
<!--实例化A对象 factory-bean配置实例化工厂类的名称  factory-method配置工厂类里的实例方法-->
<bean class="com.gongj.factoryMethod.A" id="a"
      factory-bean="aFactory" factory-method="getInstanceMethod">
    <constructor-arg index="0" value="yuanj"></constructor-arg>
</bean>

测试

public static void main(String[] args) {
        ClassPathXmlApplicationContext cxt = new ClassPathXmlApplicationContext("factoryMethod.xml");
        Object a = cxt.getBean("a");
        System.out.println("结果:" +a);
}
结果:A{name='yuanj', email='null'}

也是可以指定参数获得对象:

Object a= cxt.getBean("a","哈哈哈哈");
System.out.println("结果:" +a);

结果:A{name='哈哈哈哈', email='null'}

这种方式需要将 a 的作用域改为 prototype

各位也会发现,两种方式获得对象的方式不一样。静态工厂创建对象时获取的对象是 cxt.getBean("aFactory");,而实例工厂创建对象时获取的对象是cxt.getBean("a");,当然两种方式返回的对象都是 A

学会了使用,我们看看源码是如何被解析的:直接进入 BeanDefinitionParserDelegate 类的 parseBeanDefinitionAttributes 方法,其中有这一段代码:

//解析 factory-method 属性
if (ele.hasAttribute(FACTORY_METHOD_ATTRIBUTE)) {
    bd.setFactoryMethodName(ele.getAttribute(FACTORY_METHOD_ATTRIBUTE));
}
//解析 factory-bean 属性
if (ele.hasAttribute(FACTORY_BEAN_ATTRIBUTE)) {
    bd.setFactoryBeanName(ele.getAttribute(FACTORY_BEAN_ATTRIBUTE));
}

很简单,获取 bean 标签里的 factory-method 属性的值,并赋值给 AbstractBeanDefinitionfactoryMethodName属性,获取 bean 标签里的 factory-bean 属性的值,并赋值给 AbstractBeanDefinitionfactoryBeanName属性。

  • 如你对本文有疑问或本文有错误之处,欢迎评论留言指出。如觉得本文对你有所帮助,欢迎点赞和关注。
相关文章
|
7月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
1636 1
|
2月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
|
7月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
303 0
|
6月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
398 70
|
5月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
10月前
|
XML Java 数据格式
【SpringFramework】Spring IoC-基于XML的实现
本文主要讲解SpringFramework中IoC和DI相关概念,及基于XML的实现方式。
196 69
|
7月前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
125 0
|
10月前
|
XML Java 数据格式
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
本文介绍了在使用Spring框架时,如何通过创建`applicationContext.xml`配置文件来管理对象。首先,在resources目录下新建XML配置文件,并通过IDEA自动生成部分配置。为完善配置,特别是添加AOP支持,可以通过IDEA的Live Templates功能自定义XML模板。具体步骤包括:连续按两次Shift搜索Live Templates,配置模板内容,输入特定前缀(如spring)并按Tab键即可快速生成完整的Spring配置文件。这样可以大大提高开发效率,减少重复工作。
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
|
9月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
316 7