spring学习(spring-bean实例化(静态工厂))

目录

一、spring容器实例化bean的几种方式。

二、spring容器使用静态工厂方式实现bean实例化。

(1)基本介绍。

1、静态工厂?

2、"factory-method"属性。

3、二种操作方式。

方法一。

方法二。

(2)demo(案例)演示。

1、自定义静态工厂类,提供static方法实例化bean。

2、指定spring容器管理的类创建静态方法并提供实例化bean。


  • 本篇博客接着上篇《spring容器使用构造方法实例化bean》继续学习。

一、spring容器实例化bean的几种方式。

二、spring容器使用静态工厂方式实现bean实例化。

(1)基本介绍。
1、静态工厂?
  • 静态工厂的方式去实例化对象,只需要在bean标签中通过属性指定一个静态方法,静态方法返回一个需要的实例化bean。
  • 静态工厂方法是一种常见的方式,允许通过一个静态方法来创建bean的实例。
  • 涉及<bean>标签的属性:factory-method。

2、"factory-method"属性。
  • 对于不使用第三方jar包的前提下,通常对于自己写的类,并将它交给spring容器进行管理后,再可以用factory-method属性来指定静态方法。

3、二种操作方式。
  • 目的:在spring容器所管理的类(<bean>)中创建一个静态方法,通过静态方法返回自己需要spring容器实例化的bean。

方法一。
  • 可以提前创建好(已经交给spring容器管理的类)的静态方法。
  • 然后在<bean>标签的factory-method属性指定已创建好的静态方法名。最后在获取容器的bean时,就可以获取到静态方法中返回的实例bean。

方法二。
  • 也可以先在factory-method属性指定一个未创建的方法(方法名自己取就好了),IDEA自动帮我们在"class"属性所指定的类中去创建好一个静态方法。
  • 再在创建好的静态方法中返回需要实例化bean(对象)就行了。


(2)demo(案例)演示。
1、自定义静态工厂类,提供static方法实例化bean。
  • staticFactory(静态工厂类)。
java 复制代码
package com.fs.factory;

import com.fs.entity.Teacher;

public class staticFactory {
    //生产Teacher类bean
    public static Teacher staticBean()
    {
        /*//还可以返回Student类bean
        return new Student();*/
        return new Teacher();
    }
}
  • spring配置文件。
  • 使用<bean>配置静态工厂类。使用属性"factory-method"设定实例化bean的静态方法staticBean()方法。
XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--配置生产Teacher类的staticFactory(静态工厂)类的bean-->
    <bean id="staticFactory" class="com.fs.factory.staticFactory" factory-method="staticBean"></bean>

</beans>
  • 测试类(MainApp02类)

  • 使用ApplicationContext容器加载spring配置文件,并通过getBean()方法获取staticFactory(静态工厂类)静态方法生产的指定bean。

java 复制代码
package com.fs.test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp02 {

    public static void main(String[] args) {
        //使用IoC容器(ApplicationContext)获取spring容器管理的bean对象
        //1.创建容器对象。实例化时参数指定对应的配置文件
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springBean.xml");
        //2.通过<bean>标签的唯一标识id获取对应UserDao接口的实现类"UserDaoImpl"的实例对象
        Object obj = context.getBean("staticFactory");
        System.out.println(obj);
    }
}
  • 运行结果如下。得到Teacher类型的bean。

2、<bean>指定spring容器管理的类创建静态方法并提供实例化bean。
  • Student类。内含静态方法(生产指定类型的bean)
java 复制代码
package com.fs.entity;

public class Student {

    //指定静态方法生产Student类的bean
    public static Student staticBean() {
        return new Student();
    }
    /*//指定静态方法生产Student类的bean
    public static Teacher staticBean() {
        return new Teacher();
    }*/
}
  • spring配置文件。
XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--配置Student类的bean-->
    <!--通过属性factory-method指定生产bean的静态方法-->
    <bean id="student" class="com.fs.entity.Student" factory-method="staticBean"></bean>

</beans>
  • 测试类(Main)
  • 使用ApplicationContext容器加载spring配置文件,并通过getBean()方法获取id="student"的标签<bean>的属性"factory_method"对应的静态方法获取指定类型的bean。
java 复制代码
package com.fs.test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        //使用IoC容器(ApplicationContext)获取spring容器管理的bean对象
        //1.创建容器对象。实例化时参数指定对应的配置文件
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springBean.xml");
        //2.通过<bean>标签的唯一标识id获取对应UserDao接口的实现类"UserDaoImpl"的实例对象
        Object obj = context.getBean("student");
        System.out.println(obj);
    }
}
  • 运行结果。获取到Student或Teacher类型的bean。

  • 这是不是很像"借鸡生蛋"。
  • 也就是我只是将类"Student"交给spring容器管理,并通过容器对象的getBean()获取id为"student"的bean。但最后给我的却是类"Teacher"的对象。
相关推荐
Wpa.wk9 分钟前
自动化测试(java) - PO模式了解
java·开发语言·python·测试工具·自动化·po模式
IT 行者21 分钟前
Spring Security 7.0 新特性详解
java·后端·spring
华仔啊27 分钟前
Java 的金额计算用 long 还是 BigDecimal?资深程序员这样选
java·后端
YJlio28 分钟前
Strings 学习笔记(12.1):从二进制里“扒”出明文信息的瑞士军刀
服务器·笔记·学习
Coder_Boy_31 分钟前
业务导向型技术日志记录(2)
java·人工智能·驱动开发·微服务
凤凰战士芭比Q38 分钟前
Jenkins(环境变量、构建参数、流水线触发、通知报告)
java·servlet·jenkins
运维@小兵1 小时前
Spring AI系列——开发MCP Server和MCP Client(SSE方式)
java·人工智能·spring
有一个好名字1 小时前
设计模式-代理模式
java·设计模式·代理模式
IT 行者1 小时前
Spring Security 7.0 迁移指南
java·数据库·spring
okseekw1 小时前
Java多线程开发实战:解锁线程安全与性能优化的关键技术
java·后端