BeanFactory和FactoryBean區別
阿新 • • 發佈:2020-12-27
技術標籤:Spring Corejavabeanspring 5spring boot設計模式
BeanFactory是Spring中提供的一個工廠,可以產生物件,最常用的API就是getBean(),可以通過be-anName或者Bean的型別(Class)得到一個Bean。FactoryBean則是一個Bean。
如果一個類實現了FactoryBean,那麼Spring容器中存在兩個物件,一個是getObject()返回的物件,還有一個是當前物件。
如果需要通過BeanFactory的getBean方法來獲取FactoryBean本身,必須在beanName前面拼接上“&”,如果不拼接,實際獲得的是getObject()方法所返回的物件。
什麼時候使用FactoryBean?
當構造的物件依賴關係非常複雜的時候可以使用FactoryBean來構造它們。經典的應用場景例如My Batis的MapperFactoryBean。
程式碼示例
public class CustomizedFactoryBean implements FactoryBean<CustomizedFactoryBean.CreatedByFactoryBean> {
@Override
public CreatedByFactoryBean getObject() throws Exception {
return new CreatedByFactoryBean();
}
@Override
public Class<?> getObjectType() {
return CreatedByFactoryBean.class;
}
class CreatedByFactoryBean{
}
public static void main(String[] args) {
//
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext ();
context.register(CustomizedFactoryBean.class);
context.refresh();
CreatedByFactoryBean createdByFactoryBean = context.getBean("customizedFactoryBean",CreatedByFactoryBean.class);
System.out.println("如果未拼接&,實際得到的FactoryBean例項的getObject方法所返回的Bean: " + createdByFactoryBean);
CustomizedFactoryBean factoryBean = context.getBean("&customizedFactoryBean", CustomizedFactoryBean.class);
System.out.println("如果拼接&,才能FactoryBean本身: " +factoryBean);
}
}
執行結果: