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"的对象。
相关推荐
coder!mq几秒前
说几个常见的语法糖?
java·开发语言·算法
gugucoding3 分钟前
38. 【Java】Stream API(下):高级操作与性能
java·开发语言
小弥儿27 分钟前
GitHub今日热榜 | 2026-08-11:图原生基础设施首日登顶
学习·开源·github
心平气和量大福大30 分钟前
android-实例-蒲公英-更新与安装-5-签名与生成APK
android·java·开发语言
952361 小时前
Spring-cloud配置中心
java·spring·spring cloud·微服务
ydd1001001 小时前
寻找两个正序数组的中位数 Java 题解,二分分割详解
java·开发语言
真上帝的左手3 小时前
10. 软件设计&架构-Spring Security 7 整合CAS SSO 单点登录
java·spring·架构·sso
Zane19943 小时前
单例线程安全、生产者消费者、死锁:并发面试三连问串讲
java·后端
for_ever_love__4 小时前
python基础语法学习: 数据容器
windows·python·学习
云烟成雨TD4 小时前
Micrometer 系列【42】链路追踪:Span 体系 | 核心 API
java·链路追踪·micrometer