• Spring 中BeanFactory和FactoryBean有什么不同之处呢?


    转自:

    Spring 中BeanFactory和FactoryBean有什么不同之处呢?

    下文笔者将讲述Spring Framework中BeanFactory和FactoryBean的区别点,如下所示:

    BeanFactory简介

    BeanFactory是所有Spring容器的根接口
    此接口为所有的Spring容器定义了一套标准(IOC容器定义了一套标准)
    常见的方法如下所示:

    方法名备注说明
    getBean(String name)Spring容器中获取对应Bean对象的方法,如存在,则返回该对象
    containsBean(String name)Spring容器中是否存在该对象
    isSingleton(String name)通过beanName是否为单例对象
    isPrototype(String name)判断bean对象是否为多例对象
    isTypeMatch(String name, ResolvableType typeToMatch)判断name值获取出来的bean与typeToMath是否匹配
    getType(String name)获取Bean的Class类型
    getAliases(String name)获取name所对应的所有的别名

    BeanFactory常见的实现类(包括抽象类)

    类名备注说明
    AbstractBeanFactory抽象Bean工厂,绝大部分的实现类,都是继承于它
    DefaultListableBeanFactorySpring默认的工厂类
    XmlBeanFactory前期使用XML配置用的比较多的时候用的Bean工厂
    AbstractXmlApplicationContext抽象应用容器上下文对象
    ClassPathXmlApplicationContextXML解析上下文对象,用户创建Bean对象我们早期写Spring的时候用的就是它

    BeanFactory的使用方法

    运用ClassPathXmlApplicationContext读取spring的配置文件获取一个实例对应上下文对象

    ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});
    BeanFactory factory = (BeanFactory) context;
    

    FactoryBean

    FactoryBean是SpringIOC容器中创建Bean的一种形式
    采用FactoryBean的方式创建Spring Bean,可以减少xml的配置

    FactoryBean中常见的方法

    方法名备注说明
    T getObject()返回实例
    Class<?> getObjectType();返回该装饰对象的Bean的类型
    default boolean isSingleton()Bean是否为单例

    FactoryBean中常用的类

    类名备注说明
    ProxyFactoryBeanAop代理Bean
    GsonFactoryBeanGson

    例:
    FactoryBean创建SpringBean的示例分享

    Spring XML方式  application.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">
    
        <bean id="demo" class="com.java265.Person">
            <property name="age" value="88"/>
            <property name="name" value="Java265"/>
        </bean>
    
        <bean id="demoFromFactory" class="com.java265.PersonFactoryBean">
            <property name="str" value="99,init from factory"/>
        </bean>
    </beans>
    
    
    personFactoryBean.java
    
    package com.java265;
    
    import com.java265.Person;
    import org.springframework.beans.factory.FactoryBean;
    
    import java.util.Objects;
    
     
    public class PersonFactoryBean implements FactoryBean<Person> {
    
        /**
         * 初始化Str
         */
        private String str;
    
        @Override
        public Person getObject() throws Exception {
            //这里我需要获取对应参数
            Objects.requireNonNull(str);
            String[] split = str.split(",");
            Person p=new Person();
            p.setAge(Integer.parseInt(split[0]));
            p.setName(split[1]);
            //这里可能需要还要有其他复杂事情需要处理
            return p;
        }
    
        @Override
        public Class<?> getObjectType() {
            return Person.class;
        }
    
        public String getInitStr() {
            return str;
        }
    
        public void setInitStr(String str) {
            this.str = str;
        }
    }
    
    
    main方法
    
    package com.java265.factory;
    
    import com.java265.Person;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.FactoryBean;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    /**
     * BeanFactory 例子
     
     */
    public class SpringBeanFactoryMain {
    
        public static void main(String[] args) {
            //这个是BeanFactory
            BeanFactory beanFactory = new ClassPathXmlApplicationContext("application.xml");
            //获取对应的对象化
            Object demo = beanFactory.getBean("demo");
            System.out.println(demo instanceof Person);
            System.out.println(demo);
             //获取从工厂Bean中获取对象
            Person demoFromFactory = beanFactory.getBean("demoFromFactory", Person.class);
            System.out.println(demoFromFactory);
    
    
            //获取对应的personFactory
            Object bean = beanFactory.getBean("&demoFromFactory");
    
            //将Spring使用xml生成的bean同FactoryBean生成的Bean进行比较
            System.out.println(bean instanceof PersonFactoryBean);
     
           PersonFactoryBean factoryBean=(PersonFactoryBean) bean;
            System.out.println("初始化参数为:"+factoryBean.getInitStr());
        }
    }
    ------运行以上代码,将输出以下信息-----
    true
    Person{name='Java265', age=88}
    Person{name='init from factory', age=99}
    true
    初始化参数为:99,init from factory
    
    
    BeanFactory同FactoryBean的区别:
       BeanFactory:负责生产和管理Bean的一个工厂接口,提供Spring Ioc容器标准
       FactoryBean: 一种Bean创建的一种方式,对Bean的一种扩展
            可以直接使用代码的方式创建一个SpringBean 
  • 相关阅读:
    住房贷款等额本息(等额本金)还款计划计算
    pytorch-损失函数-分类和回归区别
    向量数据库—加速大模型训练推理
    使用 Docker 部署 VS Code in The Browser
    Java—部署安装
    百度地图——鹰眼轨迹服务
    使用JMeter创建数据库测试
    FastAdmin后台开发框架 lang 任意文件读取漏洞复现
    odoo 开发入门教程系列-约束(Constraints)
    基于Katz维数的改进谱减算法
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/125611951