首先看一下接口定义 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public interface FactoryBean <T > { @Nullable T getObject () throws Exception ; @Nullable Class<?> getObjectType(); default boolean isSingleton () { return true ; } }
由接口定义可以看出来,实现这个接口的bean不是主要功能,getObject()
创建的对象才是重点。那么在这我们就可以猜到了,可以是使用FactoryBean
创建一些实例化过程比较复杂的bean
FactoryBean
的注册FactoryBean
的处理逻辑在AbstractBeanFactory.doGetBean
方法内
1 2 3 4 5 6 7 8 9 10 11 12 13 14 protected <T> T doGetBean( final String name, final Class<T> requiredType, final Object [] args, boolean typeCheckOnly) throws BeansException { final String beanName = transformedBeanName(name); Object bean; bean = getObjectForBeanInstance(sharedInstance, name, beanName, null ); return (T) bean; }
看一下具体的逻辑,这里需要注意Spring关于bean的name有个潜规则,凡是以&开头的bean名称都默认为FactoryBean
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 protected Object getObjectForBeanInstance( Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) { if (BeanFactoryUtils .isFactoryDereference(name)) { if (beanInstance instanceof NullBean ) { return beanInstance; } if (!(beanInstance instanceof FactoryBean )) { throw new BeanIsNotAFactoryException (transformedBeanName(name), beanInstance.getClass()); } } if (!(beanInstance instanceof FactoryBean ) || BeanFactoryUtils .isFactoryDereference(name)) { return beanInstance; } Object object = null ; if (mbd == null ) { object = getCachedObjectForFactoryBean(beanName); } if (object == null ) { FactoryBean <?> factory = (FactoryBean <?>) beanInstance; if (mbd == null && containsBeanDefinition(beanName)) { mbd = getMergedLocalBeanDefinition(beanName); } boolean synthetic = (mbd != null && mbd.isSynthetic()); object = getObjectFromFactoryBean(factory, beanName, !synthetic); } return object ; } protected Object getObjectFromFactoryBean(FactoryBean <?> factory, String beanName, boolean shouldPostProcess) { if (factory.isSingleton() && containsSingleton(beanName)) { synchronized (getSingletonMutex()) { Object object = this .factoryBeanObjectCache.get(beanName); if (object == null ) { object = doGetObjectFromFactoryBean(factory, beanName); Object alreadyThere = this .factoryBeanObjectCache.get(beanName); if (alreadyThere != null ) { object = alreadyThere; } else { if (shouldPostProcess) { if (isSingletonCurrentlyInCreation(beanName)) { return object ; } beforeSingletonCreation(beanName); try { object = postProcessObjectFromFactoryBean(object , beanName ) ; } catch (Throwable ex) { throw new BeanCreationException (beanName, "Post-processing of FactoryBean's singleton object failed" , ex); } finally { afterSingletonCreation(beanName); } } if (containsSingleton(beanName)) { this .factoryBeanObjectCache.put(beanName, object ) ; } } } return object ; } } else { Object object = doGetObjectFromFactoryBean(factory, beanName); if (shouldPostProcess) { try { object = postProcessObjectFromFactoryBean(object , beanName ) ; } catch (Throwable ex) { throw new BeanCreationException (beanName, "Post-processing of FactoryBean's object failed" , ex); } } return object ; } }
生成bean对象的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 private Object doGetObjectFromFactoryBean(final FactoryBean <?> factory, final String beanName) throws BeanCreationException { Object object ; try { if (System .getSecurityManager() != null ) { AccessControlContext acc = getAccessControlContext(); try { object = AccessController .doPrivileged((PrivilegedExceptionAction <Object >) factory::getObject, acc); } catch (PrivilegedActionException pae) { throw pae.getException(); } } else { object = factory.getObject(); } } catch (FactoryBeanNotInitializedException ex) { throw new BeanCurrentlyInCreationException (beanName, ex.toString()); } catch (Throwable ex) { throw new BeanCreationException (beanName, "FactoryBean threw exception on object creation" , ex); } if (object == null ) { if (isSingletonCurrentlyInCreation(beanName)) { throw new BeanCurrentlyInCreationException ( beanName, "FactoryBean which is currently in creation returned null from getObject" ); } object = new NullBean (); } return object ;}
Spring的实现 Spring中实现这个接口的bean有很多,但是我们最熟悉也是最重要的就是在我之前文章中提到过得ProxyFactoryBean
这个bean是实现AOP技术的重点,简单回顾一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 public Object getObject() throws BeansException { initializeAdvisorChain(); if (isSingleton()) { return getSingletonInstance(); } else { if (this .targetName == null ) { logger.warn("Using non-singleton proxies with singleton targets is often undesirable. " + "Enable prototype proxies by setting the 'targetName' property." ); } return newPrototypeInstance(); } } private synchronized Object getSingletonInstance() { if (this .singletonInstance == null ) { this .targetSource = freshTargetSource(); if (this .autodetectInterfaces && getProxiedInterfaces().length == 0 && !isProxyTargetClass()) { Class<?> targetClass = getTargetClass(); if (targetClass == null ) { throw new FactoryBeanNotInitializedException("Cannot determine target class for proxy" ); } setInterfaces(ClassUtils.getAllInterfacesForClass(targetClass, this .proxyClassLoader)); } super .setFrozen(this .freezeProxy); this .singletonInstance = getProxy(createAopProxy()); } return this .singletonInstance; }
如果文章对您有所帮助,收藏、转发、在看安排一下!!!