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

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

转自:

http://www.java265.com/JavaFramework/Spring/202109/964.html

下文笔者将讲述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工厂,绝大部分的实现类,都是继承于它
DefaultListableBeanFactory Spring默认的工厂类
XmlBeanFactory 前期使用XML配置用的比较多的时候用的Bean工厂
AbstractXmlApplicationContext 抽象应用容器上下文对象
ClassPathXmlApplicationContext XML解析上下文对象,用户创建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中常用的类

类名 备注说明
ProxyFactoryBean Aop代理Bean
GsonFactoryBean Gson

例:
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 
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Spring 中BeanFactory和FactoryBean有什么不同之处呢?