• 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 
  • 相关阅读:
    数组的常见算法
    Java Double valueOf(String s)方法具有什么功能呢?
    【AI视野·今日NLP 自然语言处理论文速览 第七十九期】Thu, 18 Jan 2024
    辰视工业级视觉·汽车主机厂动力总成车间中无序工件上下料解决方案
    Linux和Windows之间文件自动同步
    SSM实验室门禁管理系统毕业设计-附源码221252
    中国石油大学(北京)-《汽车保险与理赔》作业
    GBase gcrcman 备份恢复工具
    【黑马程序员】MySQL学习记录二(SQL)案例
    C/C++调用Python
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/125611951