spring-beans factory包 Aware,FactoryBean,InitializingBean,ObjectFactory介面講解
一、類繼承圖
二、Aware介面功能概述
該介面跟java.io.Serializable類似,只是一個標記介面,沒有任何具體的方法,實現該介面的bean會在sping容器初始化的時候執行回撥,從而把bean需要的容器資源注入到bean中。具體的回撥方法在該介面的子介面中定義,通常情況下回調方法無返回值且只有一個引數。該介面的子介面分散在spring各個模組中,所有子介面如下圖:
具體使用參考:
三、FactoryBean介面功能概述
FactoryBean介面包含三個比較簡單的方法:
SmartFactoryBean擴充套件自FactoryBean介面,增加了兩個方法;
FactoryBean介面實現類在spring容器中是一種特殊的bean,業務程式碼獲取正常bean時是獲取bean本身,而獲取FactoryBean時則返回呼叫getObject()方法返回的例項。如果要獲取FactoryBean物件,請在bean id前面加一個&符號來獲取。該介面主要是spring自身框架程式碼使用,不建議在該介面實現類中使用註解或者反射的方式獲取其他的bean,如果需要獲取其他bean建議實現BeanFactoryAware介面。
具體使用參考:
https://www.cnblogs.com/quanyongan/p/4133724.html
https://www.cnblogs.com/redcool/p/6413461.html
SmartFactoryBean是對FactoryBean的補充,預設情況下FactoryBean是惰性初始化的,實現SmartFactoryBean介面,如果isEagerInit方法返回true則表示急切初始化。isPrototype方法表明getObject()方法返回的多個例項是否是獨立的,isSingleton方法返回false時,FactoryBean預設返回的多個例項是彼此獨立的。同樣該介面主要用於spring自身框架程式碼。 測試用例如下:
public static class LazyInitFactory implements FactoryBean<Object> {
public boolean initialized = false;
@Override
public Object getObject() {
this.initialized = true;
return "";
}
@Override
public Class<?> getObjectType() {
return String.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
public static class EagerInitFactory implements SmartFactoryBean<Object> {
public boolean initialized = false;
@Override
public Object getObject() {
this.initialized = true;
return "";
}
@Override
public Class<?> getObjectType() {
return String.class;
}
@Override
public boolean isSingleton() {
return true;
}
@Override
public boolean isPrototype() {
return false;
}
@Override
public boolean isEagerInit() {
return true;
}
}
@Test
public void testLazyInitFactory() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
lbf.registerBeanDefinition("test", new RootBeanDefinition(LazyInitFactory.class));
lbf.preInstantiateSingletons();
LazyInitFactory factory = (LazyInitFactory) lbf.getBean("&test");
assertFalse(factory.initialized);
}
@Test
public void testSmartInitFactory() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
lbf.registerBeanDefinition("test", new RootBeanDefinition(EagerInitFactory.class));
lbf.preInstantiateSingletons();
EagerInitFactory factory = (EagerInitFactory) lbf.getBean("&test");
assertTrue(factory.initialized);
}
四、InitializingBean,DisposableBean,SmartInitializingSingleton介面功能概述
業務程式碼通過InitializingBean介面執行資源初始化,通過DisposableBean介面釋放佔用的資源,容器在初始化bean完成並完成所有的屬性設定會回撥InitializingBean介面,在容器關閉或銷燬的時候回撥DisposableBean介面。具體使用參考:
https://www.cnblogs.com/study-everyday/p/6257127.html
SmartInitializingSingleton是spring 4中引入的,跟InitializingBean類似,不過只能用於非惰性初始化的單例bean,在單例bean執行預初始化後執行,InitializingBean介面後執行,該介面主要用於規避過早初始化可能造成的副作用,這個回撥類似ContextRefreshedEvent,不過更輕量,不需要實現org.springframework.context.ApplicationListener介面。
參考如下測試用例:
public static class MyTest implements InitializingBean,SmartInitializingSingleton{
public MyTest() {
System.out.println("constructor");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet");
}
@Override
public void afterSingletonsInstantiated() {
System.out.println("afterSingletonsInstantiated");
}
}
@Test
public void testInitializeFactory() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
lbf.registerBeanDefinition("test", new RootBeanDefinition(MyTest.class));
lbf.preInstantiateSingletons();
MyTest myTest= (MyTest) lbf.getBean("test");
}
五、ObjectFactory,ObjectProvider介面功能概述
通用型介面,用於返回某型別例項,ObjectFactory主要是SPI例項使用,ObjectProvider繼承自ObjectFactory,主要是AOP切入點使用。