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"的对象。
相关推荐
TT哇30 分钟前
【Java EE初阶】计算机是如何⼯作的
java·redis·java-ee
Fireworkitte7 小时前
Apache POI 详解 - Java 操作 Excel/Word/PPT
java·apache·excel
weixin-a153003083167 小时前
【playwright篇】教程(十七)[html元素知识]
java·前端·html
DCTANT8 小时前
【原创】国产化适配-全量迁移MySQL数据到OpenGauss数据库
java·数据库·spring boot·mysql·opengauss
sealaugh328 小时前
aws(学习笔记第四十八课) appsync-graphql-dynamodb
笔记·学习·aws
Touper.8 小时前
SpringBoot -- 自动配置原理
java·spring boot·后端
黄雪超8 小时前
JVM——函数式语法糖:如何使用Function、Stream来编写函数式程序?
java·开发语言·jvm
ThetaarSofVenice8 小时前
对象的finalization机制Test
java·开发语言·jvm
水木兰亭8 小时前
数据结构之——树及树的存储
数据结构·c++·学习·算法
鱼摆摆拜拜8 小时前
第 3 章:神经网络如何学习
人工智能·神经网络·学习