在spring的常见面试题中,经常会被问及FactoryBean和BeanFactory的区别与联系。这两个类虽然长得很像,但是他们的作用确实完全不像。其实这二者本就并没有什么关系,要是一定要说说关系,那或者就是二者都是一个接口吧。但要是说区别却能说出一大堆
那么这个类的使用场景是什么呢?一般情况下,Spring通过反射机制利用<bean>的class属性指定实现类实例化Bean,但这种实例化Bean的方式看起来似乎有点笨拙。我举一个简单的例子,比如你的项目里面需要根据一个参数来判定具体要实例化哪个Bean,Class A或者Class B. 那么你会怎么做呢?可能你会把这两个类都实例化出来,然后业务中根据参数来调用Class A or Class B。但更好的实现方式如下
public class C implements FactoryBean {
@Value("${icd.version}")
private String icdVersion;
@Override
public Object getObject() throws Exception {
if (xxx) {
return SpringManager.getBean(A.class);
} else{
return SpringManager.getBean(B.class);
}
}
@Override
public Class<?> getObjectType() {
//A和B的共同父类
return xxx.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
SpringManager
@Component
public class SpringManager implements ApplicationContextAware {
private static ApplicationContext context = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return context;
}
public static Object getBean(String name) {
return context.getBean(name);
}
public static <T> T getBean(Class<T> clazz) {
return context.getBean(clazz);
}
}
这样我们外面只需要用SpringManager.getBean(C)
的方式就可以获取到Class A or Class B了,完美。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。