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 ” 對象)。