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