Spring FactoryBean和BeanFactory 區別


1 BeanFactory 是ioc容器的底層實現接口,是ApplicationContext 頂級接口


        spring不允許我們直接操作 BeanFactory  bean工廠,所以為我們提供了ApplicationContext 這個接口 此接口集成BeanFactory 接口,ApplicationContext包含BeanFactory的所有功能,同時還進行更多的擴展。

      BeanFactory  接口又衍生出以下接口,其中我們經常用到的是ApplicationContext 接口

ApplicationContext 繼承圖

 

在這里插入圖片描述

CongihuableApplicationContext 中添加了一些方法:

... 其他省略
    
    //刷新ioc容器上下文
    void refresh() throws BeansException, IllegalStateException;

// 關閉此應用程序上下文,釋放所有資源並鎖定,銷毀所有緩存的單例bean。
    @Override
    void close();

//確定此應用程序上下文是否處於活動狀態,即,是否至少刷新一次且尚未關閉。
    boolean isActive();

    ... 其他省略

主要作用在ioc容器進行相應的刷新,關閉等操作!

FileSystemXmlApplicationContext 和ClassPathXmlApplicationContext 是用來讀取xml文件創建bean對象
ClassPathXmlApplicationContext  : 讀取類路徑下xml 創建bean
FileSystemXmlApplicationContext :讀取文件系統下xml創建bean
AnnotationConfigApplicationContext 主要是注解開發獲取ioc中的bean實例

2 FactoryBean 是spirng提供的工廠bean的一個接口

FactoryBean 接口提供三個方法,用來創建對象,
FactoryBean 具體返回的對象是由getObject 方法決定的。

*/
public interface FactoryBean<T> {

//創建的具體bean對象的類型
    @Nullable
    T getObject() throws Exception;

 //工廠bean 具體創建具體對象是由此getObject()方法來返回的
    @Nullable
    Class<?> getObjectType();
    
  //是否單例
    default boolean isSingleton() {
        return true;
    }

}

創建一個FactoryBean 用來生產User對象

@Component
public class FactoryBeanTest implements FactoryBean<User> {


    //創建的具體bean對象的類型
    @Override
    public Class<?> getObjectType() {
        return User.class;
    }


    //是否單例
    @Override
    public boolean isSingleton() {
        return true;
    }

    //工廠bean 具體創建具體對象是由此getObject()方法來返回的
    @Override
    public User getObject() throws Exception {
        return new User();
    }
}

Junit測試

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {FactoryBeanTest.class})
@WebAppConfiguration
public class SpringBootDemoApplicationTests {
    @Autowired
    private ApplicationContext applicationContext;

    @Test
    public void tesst() {
        FactoryBeanTest bean1 = applicationContext.getBean(FactoryBeanTest.class);
        try {
            User object = bean1.getObject();
            System.out.println(object==object);
            System.out.println(object);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

結果

true
User [id=null, name=null, age=0]

簡單的總結:

BeanFactory是個bean 工廠,是一個工廠類(接口), 它負責生產和管理bean的一個工廠 是ioc 容器最底層的接口,是個ioc容器,是spring用來管理和裝配普通bean的ioc容器(這些bean成為普通bean)。
FactoryBean是個bean,在IOC容器的基礎上給Bean的實現加上了一個簡單工廠模式和裝飾模式,是一個可以生產對象和裝飾對象的工廠bean,由spring管理后,
生產的對象是由getObject()方法決定的(從容器中獲取到的對象不是 “ FactoryBeanTest ” 對象)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM