目录
2、指定spring容器管理的类创建静态方法并提供实例化bean。
- 本篇博客接着上篇《spring容器使用构造方法实例化bean》继续学习。
一、spring容器实例化bean的几种方式。
- 使用构造方法实例化bean。spring学习(spring-bean实例化(无参构造与有参构造方法实现)详解)-CSDN博客
- 其它实例化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(静态工厂类)。
javapackage 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。
javapackage 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)
javapackage 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。
javapackage 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"的对象。