1 BeanFactory 是ioc容器的底層實現(xiàn)接口苔可,是ApplicationContext 頂級接口
spring不允許我們直接操作 BeanFactory bean工廠,所以為我們提供了ApplicationContext 這個接口繼承BeanFactory 接口酝碳,ApplicationContext包含BeanFactory的所有功能,同時還進行更多的擴展增热。
BeanFactory 接口又衍生出以下接口洪橘,其中我們經(jīng)常用到的是ApplicationContext 接口
ApplicationContext 繼承圖
CongihuableApplicationContext 中添加了一些方法:
... 其他省略
//刷新ioc容器上下文
void refresh() throws BeansException, IllegalStateException;
// 關(guān)閉此應(yīng)用程序上下文鲸睛,釋放所有資源并鎖定,銷毀所有緩存的單例bean瞻惋。
@Override
void close();
//確定此應(yīng)用程序上下文是否處于活動狀態(tài),即援岩,是否至少刷新一次且尚未關(guān)閉歼狼。
boolean isActive();
... 其他省略
主要作用在ioc容器進行相應(yīng)的刷新,關(guān)閉等操作享怀!
FileSystemXmlApplicationContext 和ClassPathXmlApplicationContext 是用來讀取xml文件創(chuàng)建bean對象
ClassPathXmlApplicationContext : 讀取類路徑下xml 創(chuàng)建bean
FileSystemXmlApplicationContext :讀取文件系統(tǒng)下xml創(chuàng)建bean
AnnotationConfigApplicationContext 主要是注解開發(fā)獲取ioc中的bean實例
2 FactoryBean 是spirng提供的工廠bena的一個接口
FactoryBean 接口提供三個方法羽峰,用來創(chuàng)建對象,
FactoryBean 具體返回的對象是由getObject 方法決定的添瓷。
*/
public interface FactoryBean<T> {
//創(chuàng)建的具體bean對象的類型
@Nullable
T getObject() throws Exception;
//工廠bean 具體創(chuàng)建具體對象是由此getObject()方法來返回的
@Nullable
Class<?> getObjectType();
//是否單例
default boolean isSingleton() {
return true;
}
}
創(chuàng)建一個FactoryBean 用來生產(chǎn)User對象
@Component
public class FactoryBeanTest implements FactoryBean<User> {
//創(chuàng)建的具體bean對象的類型
@Override
public Class<?> getObjectType() {
return User.class;
}
//是否單例
@Override
public boolean isSingleton() {
return true;
}
//工廠bean 具體創(chuàng)建具體對象是由此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();
}
}
}
結(jié)果
true
User [id=null, name=null, age=0]
簡單的總結(jié):
BeanFactory是個bean 工廠梅屉,是一個工廠類(接口), 它負責生產(chǎn)和管理bean的一個工廠
是ioc 容器最底層的接口鳞贷,是個ioc容器坯汤,是spring用來管理和裝配普通bean的ioc容器(這些bean成為普通bean)。
FactoryBean是個bean搀愧,在IOC容器的基礎(chǔ)上給Bean的實現(xiàn)加上了一個簡單工廠模式和裝飾模式玫霎,是一個可以生產(chǎn)對象和裝飾對象的工廠bean,由spring管理后妈橄,生產(chǎn)的對象是由getObject()方法決定的(從容器中獲取到的對象不是
“ FactoryBeanTest ” 對象)庶近。