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"的对象。
相关推荐
gjf05_0529 分钟前
人该怎样活着呢?版本75.8
学习
蜗牛互联网43 分钟前
GPT-6 与 Intelligent UI:从回答到可审计操作的产品迁移
java·人工智能·后端
SL_staff1 小时前
运维救火实录:钉钉考勤API变更引发工资计算异常,我们用JVS-Logic可视化逻辑引擎实现分钟级热修复
java·mysql·全栈
SunnyDays10112 小时前
Java 查找并高亮 Word 文字:精确查找及正则表达式模糊查找
java·查找文字·word 文档·高亮文字·正则匹配查找·模糊查找
geats人山人海2 小时前
java 4继承
java·开发语言
li星野2 小时前
【学习记录】PCB与PCBA核心知识全解析:从设计到制造的关键细节
学习·制造
众链网络2 小时前
Agent 的成本大头不在“写“,在“判断“:拆解专用决策模型的三层架构
java·开发语言·人工智能·微服务
周小董2 小时前
[1371]jdk管理工具
java·开发语言
青春逝如流水2 小时前
Java 中线程的创建方式:从基础到现代
java·开发语言·多线程·ai文章
卿卿的产品经理日记2 小时前
【AI产品经理实战】Day 35|从“沉迷工具“到回归 AI 底层:Skill 收官、系统复盘与下一个 13 天
人工智能·学习·产品经理