1. 程式人生 > >spring-beans factory包 Aware,FactoryBean,InitializingBean,ObjectFactory介面講解

spring-beans factory包 Aware,FactoryBean,InitializingBean,ObjectFactory介面講解

一、類繼承圖

二、Aware介面功能概述 

      該介面跟java.io.Serializable類似,只是一個標記介面,沒有任何具體的方法,實現該介面的bean會在sping容器初始化的時候執行回撥,從而把bean需要的容器資源注入到bean中。具體的回撥方法在該介面的子介面中定義,通常情況下回調方法無返回值且只有一個引數。該介面的子介面分散在spring各個模組中,所有子介面如下圖:

      

      具體使用參考:

      

https://www.jianshu.com/p/c5c61c31080b    

三、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切入點使用。