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

Java-教程王 Spring 发布时间:2021-09-03 10:17:21 阅读数:7567 1
下文笔者将讲述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中常用的类
类名备注说明
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 
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/Spring/202109/964.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者