1. 程式人生 > 其它 >BeanFactory和FactoryBean區別

BeanFactory和FactoryBean區別

技術標籤: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); } }

執行結果:在這裡插入圖片描述