Spring之【详解FactoryBean】
目录
FactoryBean接口
通过FactoryBean创建Bean对象
如何获取FactoryBean中getObject方法创建的Bean
如何获取FactoryBean本身
源码分析
beanDefinitionMap
singletonObjects
factoryBeanObjectCache
FACTORY_BEAN_PREFIX
BeanFactory
BeanFactoryUtils#isFactoryDereference
看看Spring自己是怎么获取FactoryBean对象
FactoryBean接口
提供了三个方法
- 方法一:返回由工厂管理的Bean实例对象
- 方法二:返回Bean实例对象的类型
- 方法三:Bean是否为单例,默认为单例
通过FactoryBean创建Bean对象
- 定义一个普通的Java类
package spring.demo;public class Cat {
}
- 定义一个组件实现FactoryBean接口
package spring.demo;import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;@Component
public class CatFactoryBean implements FactoryBean<Cat> {@Overridepublic Cat getObject() throws Exception {return new Cat();}@Overridepublic Class<?> getObjectType() {return Cat.class;}@Overridepublic boolean isSingleton() {return true;}
}
如何获取FactoryBean中getObject方法创建的Bean
通过beanName获取
package spring.demo;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class AppMain {public static void main(String[] args) {// 容器启动AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);// 通过beanName获取Object bean = applicationContext.getBean("catFactoryBean");System.out.println(bean);}
}
如何获取FactoryBean本身
通过&+beanName获取
package spring.demo;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class AppMain {public static void main(String[] args) {// 容器启动AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);// 通过&+beanName获取Object bean = applicationContext.getBean("&catFactoryBean");System.out.println(bean);}
}