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"的对象。
相关推荐
evans在进步38 分钟前
LeetCode 2 两数相加:链表模拟加法,Java 图解进位过程
java·leetcode·链表
math_hongfan1 小时前
鸿蒙离线数据缓存高级架构:弱网预加载/离线数据优先级/同步冲突解决/上线后数据合并策略
学习·缓存·华为·架构·harmonyos·鸿蒙
划水的code搬运工小李1 小时前
Simulink学习-自定义Storage Class配置
学习
2401_858286111 小时前
OS82.【Linux】设计线程池
java·linux·运维·服务器·开发语言·算法·线程池
数据知道1 小时前
IDOR 不安全的直接对象引用:API 越权实战检测
java·开发语言·网络·安全·网络安全
堕落年代1 小时前
Ollama CPU 推理大提示词优化实测报告(细致化数据版)
java·后端·spring
一尘之中2 小时前
量子计算机能“参禅”吗?从叠加态到不二法门的技术哲学追问
学习·ai写作·量子计算
KobeSacre2 小时前
ForkJoinPool 源码
java
wear工程师2 小时前
Kafka 消费者心跳正常,为什么还会被踢出组?拆清 max.poll.interval.ms
java·kafka
cfm_29142 小时前
基于OAuth2.0实现微服务SSO单点登录
后端·spring·微服务·架构