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切入点使用。

     

    

猜你喜欢

转载自blog.csdn.net/qq_31865983/article/details/83240471