当前位置: 首页 > news >正文

Bean 的实例化(创建 | 获取)

  • Spring为Bean提供了多种实例化方式,包括如下4种方式:
    • 第一种:通过构造方法实例化
    • 第二种:通过简单工厂模式实例化
    • 第三种:通过factory-bean实例化(工厂方法模式实例化)
    • 第四种:通过FactoryBean接口实例化
  • Spring中为Bean对象的创建准备了多种方案,目的是为了能够更加灵活

通过构造方法实例化

  • 我们之前一直使用的就是这种方式。
  • 在spring配置文件中直接配置类全路径,即在Spring配置文件中配置bean,Spring会自动调用该类的无参数构造方法来实例化Bean

public class SpringBean {}

<?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"><bean id="springBean" class="cw.spring.study.bean.SpringBean"/></beans>

通过简单工厂模式实例化

抽象产品类

public abstract class Fruit {}

具体产品类

public class Apple extends Fruit{}

工厂类
public class FruitFactory {// 创建水果对象的方法public static Fruit getFruit() {// 最终的Apple类对象是通过调用该工厂类的该方法new的对象return new Apple();}
}
配置文件配置工厂类生产 bean
  • 在Spring配置文件中告诉Spring框架,调用哪个类的哪个方法获取 Bean
<!--factory-method属性指定的是工厂类当中的静态方法,也就是告诉Spring框架,调用这个方法可以获取Bean创建出来的为产品对象,不为工厂对象,工厂类中的方法为静态方法,通过类名直接调用创建对象通过class属性指定的类调用该类的静态工厂方法,进行对象的创建,最终创建的对象为产品对象,id为apple
-->
<bean id="apple" class="cw.spring.study.bean.FruitFactory" factory-method="getFruit"/>
测试
@org.junit.Test
public void test1() {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");System.out.println(applicationContext.getBean("apple", Fruit.class));
}

通过factory-bean实例化(工厂方法模式实例化)

抽象产品类
/*** ClassName: Fruit* Package: cw.spring.study.bean* Description:*/
public abstract class Fruit {}
具体产品类
/**
* ClassName: Apple
* Package: cw.spring.study.bean
* Description:
*/
public class Apple extends Fruit{}
抽象工厂类
/*** ClassName: FruitFactory* Package: cw.spring.study.bean* Description:*/
public abstract class FruitFactory {/*** 水果工厂生产水果的方法* * @return 水果*/public abstract Fruit getFruit();}
具体工厂类
/*** ClassName: AppleFactory* Package: cw.spring.study.bean* Description:** @Author tcw* @Create 2023-05-25 18:37* @Version 1.0*/
public class AppleFactory extends FruitFactory{// 实例方法@Overridepublic Fruit getFruit() {// 生产苹果return new Apple();}
}
配置文件配置工厂类生产 bean
  • 告诉Spring框架,调用哪个对象的哪个方法来获取Bean
<!-- 工厂方法模式,通过 factory-bean属性 + factory-method属性来共同完成 由于工厂类用于创建对象的方法为实例方法,所以需要先创建工厂对象,工厂对象也需要被spring管理AppleFactory 实际上是一个工厂bean,用于创建对象的bean
-->
<bean id="appleFactory" class="cw.spring.study.bean.AppleFactory"/>
<!--factory-bean属性告诉Spring调用哪个工厂对象,进行bean的创建factory-method属性告诉Spring调用工厂对象的哪个实例方法创建bean该配置用于指定用哪个工厂对象的哪个方法创建对象
-->
<bean id="apple" factory-bean="appleFactory" factory-method="getFruit"/>
测试
@org.junit.Test
public void test1() {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");System.out.println(applicationContext.getBean("apple", Fruit.class));
}

通过FactoryBean接口实例化

  • 以上的第三种方式中,factory-bean(生产bean的工厂bean)是我们自定义的,factory-method(生产bean的工厂方法)也是我们自己定义的。
  • 在Spring中,当我们编写的类直接实现FactoryBean接口之后,用于创建bean的factory-bean就不需要我们指定了,工厂bean的factory-method也不需要我们指定了。factory-bean会自动指向实现FactoryBean接口的类,factory-method会自动指向该类中的getObject()方法。
    • 因为我们在配置文件中指定的用于创建bean的类在实现FactoryBean接口之后,Spring就知道这是一个工厂类,并且知道工厂方法是哪个
  • 这种方式实际上就是第三种方式的简化
  • FactoryBean在Spring中是一个接口,被称为“工厂Bean”。
  • “工厂Bean”是一种特殊的Bean,所有的“工厂Bean”都是用来协助Spring框架来创建其他Bean对象的。
产品类
/*** ClassName: Person* Package: cw.spring.study.bean* Description:** @Author tcw* @Create 2023-05-25 18:56* @Version 1.0*/
public class Person {}
工厂类
import org.springframework.beans.factory.FactoryBean;/*** ClassName: PersonFactoryBean* Package: cw.spring.study.bean* Description:** @Author tcw* @Create 2023-05-25 18:57* @Version 1.0*/
public class PersonFactoryBean implements FactoryBean<Person> {// 创建bean的工厂方法@Overridepublic Person getObject() throws Exception {return new Person();}@Overridepublic Class<?> getObjectType() {return null;}
}
public interface FactoryBean<T> {String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";@NullableT getObject() throws Exception;@NullableClass<?> getObjectType();// 该方法接口进行了默认实现,工厂bean创建的对象是否为单例的// 默认情况下,创建的对象是单例的// 如果要让工厂bean创建的对象为多例,则重写该方法,返回false即可default boolean isSingleton() {return true;}
}
配置文件配置工厂类生产 bean
<!--这种方式实际上就是第三种方式的简化。由于你编写的类实现了FactoryBean接口,所以这个类是一个特殊的类,不需要你再手动指定:factory-bean、factory-method实现了FactoryBean接口,Spring知道这是一个工厂类,并且知道用于创建bean的工厂方法是哪个通过一个特殊的Bean:工厂Bean,来返回一个普通的Bean Person对象。通过FactoryBean这个工厂Bean主要是想对普通Bean进行加工处理。
-->
<bean id="person" class="cw.spring.study.bean.PersonFactoryBean"/>
测试
@org.junit.Test
public void test1() {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");System.out.println(applicationContext.getBean("person", Person.class));
}

工厂方法实例化小结

相比于通过构造方法进行bean的实例化,采用工厂方法进行bean的实例,我们可以在bean对象创建出来到将创建出来的对象交给Spring容器进行管理这一段时间内,我们可以对bean对象进行加工处理。


http://www.mrgr.cn/news/17276.html

相关文章:

  • 祝贺严建兵教授任华中农业大学校长
  • 突发!某GPU芯片独角兽!400+人 原地解散!
  • qt实现三原色滑动条变色
  • java epoll网络编程
  • 开学季老师如何发布分班?
  • 【个人笔记】python
  • (学习总结15)C++11小语法与拷贝问题
  • 【编程底层思考】线程阻塞时一定会释放cpu吗
  • 2024年8月文章一览
  • 【MySQL】事务
  • 全国大学生数学建模比赛——关联规则
  • Javascript常见面试手写题
  • DrugAgent:多智能体系统,新药研发速度提升10倍
  • 深入剖析淘宝商品详情API的调用与返回值
  • 【C++】解析friend关键字:概念、友元函数与类的使用
  • 网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。
  • 八、百度到的--centos安装artifactory--没什么用
  • 数据集格式转化
  • 《机器学习》周志华-CH5(神经网络)
  • 将二叉搜索树转化为排序的双向链表