BeanFactory 和 FactoryBean的区别

简介: 本文介绍了Spring框架中的`BeanFactory`和`FactoryBean`。`BeanFactory`是Spring的核心接口,用于管理Bean的创建、配置及依赖注入。其实现包括`DefaultListableBeanFactory`和已废弃的`XmlBeanFactory`。`FactoryBean`则用于动态创建Bean实例,支持懒加载及AOP代理创建。文章还通过示例展示了如何实现一个`FactoryBean`,并通过测试验证其功能。最后附上了作者信息及版权声明。

1、定义

1.1 简单理解

BeanFactory  翻译下 bean工厂,是一个工厂。

FactoryBean  翻一下 工厂Bean,是一个bean 。

1.2 你看到的实例

BeanFactory 最直接的实现就是DefaultListableBeanFactory,认识吧,简单点就是spring的容器

FactoryBean的最直接的实现就是 JpaRepositoryFactory ,认识不

1.3 废话解释

BeanFactory定义了IOC容器的最基本形式,并提供了IOC容器应遵守的的最基本的接口。在Spring代码中,BeanFactory只是个接口,并不是IOC容器的具体实现,但是Spring容器给出了很多种实现,如 DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,都是附加了某种功能的实现。

FactoryBean 在某些情况下,实例化Bean过程比较复杂,则需要提供大量的配置信息。采用编码的方式可能会得到更灵活简单的方案。Spring为此提供了一个org.springframework.bean.factory.FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑。

2、使用场景

2.1 beanFactory

通常会使用 ApplicationContext 接口的实现类,例如 ClassPathXmlApplicationContext 或者 AnnotationConfigApplicationContext,因为它们扩展了 BeanFactory 接口,提供了更多的功能,如国际化支持、事件发布等。

总的来说,BeanFactory 是 Spring 中负责管理 Bean 的核心接口,它在应用程序中起着至关重要的作用。

在一个Spring应用中,通常只会存在一个BeanFactory实例。BeanFactory是Spring框架中负责管理Bean的核心接口,它负责创建、配置和管理Bean对象,以及解决Bean之间的依赖关系。

在Spring中,有两种常用的BeanFactory实现:

DefaultListableBeanFactory

:这是Spring的默认实现,它支持完整的Bean定义、注册、查找和解析等功能。

XmlBeanFactory

(已在Spring 3.1中废弃):它从一个XML文件中读取Bean的配置信息,属于比较早期的实现。

通常情况下,一个Spring应用会初始化一个BeanFactory,该BeanFactory会根据配置文件中的信息创建、管理各种Bean。

如果你在一个Spring应用中确实有多个BeanFactory,那通常是因为你在特殊情况下需要手动创建额外的BeanFactory实例,例如为了实现特定的定制化需求或测试目的。但这不是常见的做法,绝大多数情况下,一个Spring应用只会使用一个BeanFactory。

2.2 FactoryBean

动态创建Bean

FactoryBean 可以根据需要动态地创建不同类型的Bean实例。这在某些场景下是非常有用的,比如根据配置文件中的条件来动态选择创建哪种类型的Bean。

AOP(面向切面编程):

通过 FactoryBean 可以实现自定义的AOP代理创建逻辑,从而在创建代理对象时可以添加一些额外的处理。

懒加载:

FactoryBean 可以实现懒加载,即只有在第一次获取Bean时才会进行初始化和创建。 FactoryBean在Spring中最为典型的一个应用就是用来创建AOP的代理对象。

AOP是Spring在运行时创建了代理对象,而不是一开始就定义好的,这很符合工厂方法模式。AOP代理对象通过Java的反射机制,在运行时创建了一个代理对象,在代理对象的目标方法中根据业务要求织入了相应的方法。这个对象在Spring中就是——ProxyFactoryBean。

3、FactoryBean实例

3.1 创建FactoryBean

创建FactoryBean 的实现类TestFactoryBean ,并使用@Service注解放入IOC容器中

js

代码解读

复制代码


@Service
public class TestFactoryBean implements FactoryBean {
 
 
    @Override
    public Object getObject() throws Exception {
		//手动创建bean
        return new PlayerServiceImpl();
    }
 
    @Override
    public Class<?> getObjectType() {
        return PlayerServiceImpl.class;
    }
 
	//这个方法可以不用覆写,父类默认是单例,如果想设置成非单例可以覆写方法返回false
    public boolean isSingleton() {
        return false;
    }
}

3.2 创建PlayerServiceImpl类,

这里我们没有使用@Service,@Componet等注解,在应用启动后不会被加入Springboot的容器当中。

js

代码解读

复制代码

public class PlayerServiceImpl implements IPlayerService{
 
    public void say() {
        System.out.println("hello 香菜");
    }
}

3.3 测试一下

js

代码解读

复制代码

@SpringBootTest
class DemoApplicationTests {
 
    @Autowired
    ApplicationContext applicationContext;
 
    @Test
    void test() {
        PlayerService bean = applicationContext.getBean(IPlayerService .class);
        System.out.println(bean);
        bean.say();
        PersonService bean2 = applicationContext.getBean(IPlayerService .class);
        System.out.println(bean2);
    }
 
}


转载来源:https://juejin.cn/post/7292958028306989071

相关文章
|
6月前
|
设计模式 Java Spring
BeanFactory与FactoryBean的区别
BeanFactory与FactoryBean的区别
|
6月前
|
Java 容器 Spring
BeanFactory和ApplicationContext有什么区别?
BeanFactory和ApplicationContext有什么区别?
|
Java Spring 容器
BeanFactory 和 ApplicationContext 有什么区别
BeanFactory 和 ApplicationContext 有什么区别
36 1
|
XML Java 数据库连接
FactoryBean的使用~
FactoryBean的使用~
|
XML Java 数据格式
BeanFactory 与 ApplicationContext 区别
BeanFactory 是 Spring 框架中 IoC 容器的顶层接⼝, 它只是⽤来定义⼀些基础功能, 定义⼀些基础规范
40 0
|
Java 开发者 Spring
BeanFactory和FactoryBean
BeanFactory和FactoryBean
92 0
|
Java Spring 容器
【Spring源码】 BeanFactory和FactoryBean是什么?
面试官:“看过Spring源码吧,简单说说Spring中BeanFactory和FactoryBean的区别是什么?”
17467 6
【Spring源码】 BeanFactory和FactoryBean是什么?
|
Java Spring 容器
BeanFactory 和 ApplicationContext 有什么区别?
BeanFactory 和 ApplicationContext 有什么区别?
76 0
|
XML 自动驾驶 小程序
BeanFactory和ApplicationContext有什么区别?
BeanFactory和ApplicationContext有什么区别?
BeanFactory和ApplicationContext有什么区别?
|
XML JSON Java
Spring源码解析 - FactoryBean&&BeanFactory(上)
Spring源码解析 - FactoryBean&&BeanFactory
125 0
Spring源码解析 - FactoryBean&&BeanFactory(上)