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

相关文章
|
传感器 Java API
Spring揭秘:Aware接口应用场景及实现原理!
Aware接口赋予了Bean更多自感知的能力,通过实现不同的Aware接口,Bean可以轻松地获取到Spring容器中的其他资源引用,像ApplicationContext、BeanFactory等。 这样不仅增强了Bean的功能,还提高了代码的可维护性和扩展性,从而让Spring的IoC容器变得更加强大和灵活。
463 0
Spring揭秘:Aware接口应用场景及实现原理!
|
2月前
|
监控 安全 Java
|
2月前
|
SQL 人工智能 Rust
Java 开发中Stream的toMap与Map 使用技巧
本文深入解析了 Java 中 `toMap()` 方法的三大问题:重复键抛出异常、`null` 值带来的风险以及并行流中的性能陷阱,并提供了多种替代方案,如使用 `groupingBy`、`toConcurrentMap` 及自定义收集器,帮助开发者更安全高效地进行数据处理。
189 0
|
5月前
|
负载均衡 前端开发 Java
SpringCloud调用组件Feign
本文深入探讨微服务Spring体系中的Feign组件。Feign是一个声明式Web服务客户端,支持注解、编码器/解码器,与Spring MVC注解兼容,并集成Eureka、负载均衡等功能。文章详细介绍了SpringCloud整合Feign的步骤,包括依赖引入、客户端启用、接口创建及调用示例。同时,还涵盖了Feign的核心配置,如超时设置、拦截器实现(Basic认证与自定义)和日志级别调整。最后,总结了`@FeignClient`常用属性,帮助开发者更好地理解和使用Feign进行微服务间通信。
485 1
|
11月前
|
存储 开发者
HashMap和Hashtable的key和value可以为null吗,ConcurrentHashMap呢
HashMap的key可以为null,value也可以为null;Hashtable的key不允许为null,value也不能为null;ConcurrentHashMap的key不允许为null
|
8月前
|
负载均衡 算法
架构学习:7种负载均衡算法策略
四层负载均衡包括数据链路层、网络层和应用层负载均衡。数据链路层通过修改MAC地址转发帧;网络层通过改变IP地址实现数据包转发;应用层有多种策略,如轮循、权重轮循、随机、权重随机、一致性哈希、响应速度和最少连接数均衡,确保请求合理分配到服务器,提升性能与稳定性。
1840 11
架构学习:7种负载均衡算法策略
|
缓存 NoSQL Java
避免缓存失效的三大杀手:缓存击穿、穿透与雪崩的解决方案
避免缓存失效的三大杀手:缓存击穿、穿透与雪崩的解决方案
987 0
|
11月前
|
XML Java 数据格式
BeanFactory 和 ApplicationContext 的区别
【10月更文挑战第24天】在 Spring 框架中,`BeanFactory` 和 `ApplicationContext` 是两个核心的容器接口。`BeanFactory` 提供基本的 Bean 管理功能,支持延迟加载,适用于轻量级应用和资源受限环境。`ApplicationContext` 则在 `BeanFactory` 基础上扩展了丰富的企业级功能,如国际化、事件处理和资源管理,适用于企业级和 Web 应用开发。两者各有特点,需根据具体需求选择使用。
192 2
|
开发框架 Java 开发者
Spring Boot中的自动装配原理
Spring Boot中的自动装配原理
2249 1
|
XML Java 数据格式
Spring中BeanFactory和FactoryBean详解
Spring中BeanFactory和FactoryBean详解
617 1