🤵♂️ 个人主页:@香菜的个人主页,加 ischongxin ,备注csdn
✍🏻作者简介:csdn 认证博客专家,游戏开发领域优质创作者,华为云享专家,2021年度华为云年度十佳博主
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
系列文章:Spring Boot学习大纲,可以留言自己想了解的技术点
目录
1、定义
1.1 简单理解
1.2 你看到的实例
1.3 废话解释
2、使用场景
2.1 beanFactory
2.2 FactoryBean
3、FactoryBean实例
3.1 创建FactoryBean
3.2 创建PlayerServiceImpl类,
3.3 测试一下
被问起这个问题,记录下。
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容器中
@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的容器当中。
public class PlayerServiceImpl implements IPlayerService{
public void say() {
System.out.println("hello 香菜");
}
}
3.3 测试一下
@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);
}
}