• BeanFactory和FactoryBean的区别


    目录

    简介

    BeanFactory

    FactoryBean

    FactoryBean代码实例


    简介

    在Spring 中,有两个很容易混淆的类:BeanFactory 和FactoryBean,它们都可以用来创建对象,设计都使用了于工厂模式。

    BeanFactory

    是一个工厂,它的作用是管理Bean,BeanFactory定义了IOC容器的最基本形式,使用BeanFactory必须严格遵守其提供的最基本的接口

    FactoryBean

    是一个能生产或者修饰对象生成的工厂Bean,但实例Bean的过程没有BeanFactory复杂。从Spring3.0开始,FactoryBean开始支持泛型,即接口声明改为FactoryBean的形式。

    有三个方法:

    • T getObject();返回实例
    • Class getObjectType();返回该装饰对象的Bean的类型
    • default boolean isSingleton();Bean是否为单例,默认为true

    FactoryBean代码实例

    创建User对象

    1. public class User {
    2. private String name;
    3. private String address;
    4. public User(String name, String address) {
    5. this.name = name;
    6. this.address = address;
    7. }
    8. public String getName() {
    9. return name;
    10. }
    11. public void setName(String name) {
    12. this.name = name;
    13. }
    14. public String getAddress() {
    15. return address;
    16. }
    17. public void setAddress(String address) {
    18. this.address = address;
    19. }
    20. @Override
    21. public String toString() {
    22. return "User{" +
    23. "name='" + name + '\'' +
    24. ", address='" + address + '\'' +
    25. '}';
    26. }
    27. }

    创建UserFactoryBean

    1. public class UserFactoryBean implements FactoryBean {
    2. @Override
    3. public User getObject() throws Exception {
    4. return new User("咩哥", "深圳");
    5. }
    6. @Override
    7. public Class getObjectType() {
    8. return User.class;
    9. }
    10. }

    创建配置文件factoryBean.xml

    1. "1.0" encoding="UTF-8"?>
    2. "http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. "userFactoryBean" class="org.springframework.factorybean.UserFactoryBean">

    测试代码

    1. public class Test {
    2. public static void main(String[] args) {
    3. ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("factoryBean.xml");
    4. User user = (User) ac.getBean("userFactoryBean");
    5. System.out.println(user);
    6. }
    7. }

    上述代码获取的是User对象,即通过FactoryBean创建的对象,如果我们要获取FactoryBean本身,则可以使用转义字符”&”

    1. public static void main(String[] args) {
    2. ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("factoryBean.xml");
    3. UserFactoryBean userFactoryBean = (UserFactoryBean) ac.getBean("&userFactoryBean");
    4. System.out.println(userFactoryBean);
    5. }

    上述代码创建的对象是单例,创建的User对象会放到缓存池中,如果不用单例,则不会放到缓存池中,并且每次创建的对象都是新对象

    使用单例

     不使用单例

    重写FactoryBean中的default boolean isSingleton()方法,并将返回值设为false。

    1. public class UserFactoryBean implements FactoryBean {
    2. @Override
    3. public User getObject() throws Exception {
    4. return new User("咩哥", "深圳");
    5. }
    6. @Override
    7. public Class getObjectType() {
    8. return User.class;
    9. }
    10. @Override
    11. public boolean isSingleton() {
    12. return false;
    13. }
    14. }

  • 相关阅读:
    UE构建基础和实践:四、使用脚本打包
    vue3 生命周期函数,都改了啥?
    (10)(10.8) 固件下载
    Win11打印机文档被挂起如何解决?
    Java校招120道面试题目合集
    生态合作|万应低代码携手华为云,赋能企业敏捷开发实践
    2-1、IOC思想以及实现
    美颜SDK免费版怎么样?应该如何选择美颜SDK?
    通过linux定时任务删除es日志索引
    CHATGPT中国免费网页版有哪些-CHATGPT中文版网页
  • 原文地址:https://blog.csdn.net/qq_35597828/article/details/126104990