BeanFactory 和 FactoryBean的区别

2024-10-09 11:54:38 浏览数 (5)

1、定义

1.1 简单理解

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

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

1.2 你看到的实例

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

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

image.pngimage.png

编辑

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); } }

0 人点赞