说实话,他俩除了名字比较像以外,好像没有其他共同点了。
创新互联公司提供高防主机、云服务器、香港服务器、双线服务器托管等
「BeanFactory和FactoryBean有哪些区别?」
和BeanFactory相关的还有一个高频的面试题
「ApplicationContext和BeanFactory有哪些区别?」
常见的创建Bean的方式有如下四种
- @Data
- @ToString
- public class User {
- private Long id;
- private String name;
- public static User createUser() {
- User user = new User();
- user.setId(1L);
- user.setName("li");
- return user;
- }
- }
- public class UserFactory {
- public User createUser() {
- return User.createUser();
- }
- }
- public class UserFactoryBean implements FactoryBean {
- @Override
- public Object getObject() throws Exception {
- return User.createUser();
- }
- @Override
- public Class> getObjectType() {
- return User.class;
- }
- }
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- https://www.springframework.org/schema/beans/spring-beans.xsd">
- factory-method="createUser"/>
- public class BeanInstantiationDemo {
- public static void main(String[] args) {
- BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/bean-instantiation-context.xml");
- User user1 = beanFactory.getBean("user-by-constructor", User.class);
- User user2 = beanFactory.getBean("user-by-static-method", User.class);
- User user3 = beanFactory.getBean("user-by-factory", User.class);
- User user4 = beanFactory.getBean("user-by-factory-bean", User.class);
- }
- }
在分析源码之前,我们先明确2个概念
「factoryBean是我们配置到容器中的实现FactoryBean接口的Bean,而subBean是用FactoryBean创建出来的Bean」
在Spring容器启动的过程中,会实例化非延迟的单例Bean,即调用如下方法 DefaultListableBeanFactory#preInstantiateSingletons
调用FactoryBean#getObject的链路如下图
通过分析DefaultListableBeanFactory#preInstantiateSingletons方法和FactoryBean#getObject的调用链路可以分析得到
「建议大家看一下DefaultListableBeanFactory#preInstantiateSingletons方法和FactoryBean#getObject方法的调用链路,就能理解上面我说的流程了,我就不贴太多源码了」
目前我只在Dubbbo源码中看到了FactoryBean的应用
「服务导出:在Dubbo中,服务提供者会被包装成ServiceBean对象,当监听到ContextRefreshedEvent事件时开始服务导出」
「服务调用:服务调用方会被包装成ReferenceBean对象,ReferenceBean实现了FactoryBean接口和InitializingBean接口,创建subBean的逻辑在ReferenceBean#getObject方法中」
「Dubbo服务引入的时机有如下2种。」
- public class ReferenceBean
extends ReferenceConfig implements FactoryBean, ApplicationContextAware, InitializingBean, DisposableBean { - @Override
- public Object getObject() {
- return get();
- }
- @Override
- @SuppressWarnings({"unchecked"})
- public void afterPropertiesSet() throws Exception {
- // 省略部分代码
- if (shouldInit()) {
- getObject();
- }
- }
- }
本文转载自微信公众号「Java识堂」,可以通过以下二维码关注。转载本文请联系Java识堂公众号。
当前题目:面试官:BeanFactory和FactoryBean有哪些区别?
转载来于:http://www.mswzjz.cn/qtweb/news41/100341.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能