目錄
?
AbstractBeanFactory的作用
源碼解析
屬性
獲取bean實例
Spring BeanFactory
Spring AbstractBeanFactory
Spring AbstractAutowireCapableBeanFactory
Spring DefaultListableBeanFactory
?
AbstractBeanFactory的作用
- BeanFactory接口實現的基類,同時實現了ConfigurableBeanFactory的SPI,提供了所有的功能
- 通過DefaultSingletonBeanRegistry實現單例bean的緩存,同時提供了單例和多例和別名的定義等操作.
- 通過name獲取bean定義,已經通過bean定義創建實例的模板方法,具有由子類AbstractAutowireCapableBeanFactory#createBean和DefaultListableBeanFactory#getBeanDefinition實現。
源碼解析
屬性
// 父類容器
private BeanFactory parentBeanFactory;
// 類加載器
private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader();
// 臨時加載器
private ClassLoader tempClassLoader;
// bean的元數據緩存
private boolean cacheBeanMetadata = true;
// bean的表達式解析器
private BeanExpressionResolver beanExpressionResolver;
// 類型轉換器
private ConversionService conversionService;
// 屬性編輯器
private final Set<PropertyEditorRegistrar> propertyEditorRegistrars = new LinkedHashSet<>(4);
// 類的屬性編輯器
private final Map<Class<?>, Class<? extends PropertyEditor>> customEditors = new HashMap<>(4);
// 類型轉換器
private TypeConverter typeConverter;
// 為嵌入的值(如注釋屬性)添加字符串解析器
private final List<StringValueResolver> embeddedValueResolvers = new CopyOnWriteArrayList<>();
// 后置處理器
private final List<BeanPostProcessor> beanPostProcessors = new CopyOnWriteArrayList<>();
// InstantiationAwareBeanPostProcessors是否已注冊
private volatile boolean hasInstantiationAwareBeanPostProcessors;
// DestructionAwareBeanPostProcessors是否已注冊
private volatile boolean hasDestructionAwareBeanPostProcessors;
// 作用域
private final Map<String, Scope> scopes = new LinkedHashMap<>(8);
// 提供安全作用域
private SecurityContextProvider securityContextProvider;
// 合并后的BeanDefinition
private final Map<String, RootBeanDefinition> mergedBeanDefinitions = new ConcurrentHashMap<>(256);
// bean實例是否已創建
private final Set<String> alreadyCreated = Collections.newSetFromMap(new ConcurrentHashMap<>(256));
// 本地緩存,正在創建的多例bean。這邊用本地線程,是因為其他線程創建bean與當前線程不沖突
private final ThreadLocal<Object> prototypesCurrentlyInCreation = new NamedThreadLocal<>("Prototype beans currently in creation");
?
customEditors 是自定義的屬性編輯器,適用于該beanFactory的所有bean。
propertyEditorRegistrars屬性編輯器的注冊器,使用于該beanFactory的所有bean。
beanPostProcessors 創建bean時應用的beanPostProcessors。
hasInstantiationAwareBeanPostProcessors 表明是否注冊有任何的InstantiationAwareBeanPostProcessors。
hasDestructionAwareBeanPostProcessors表明是否注冊有任何的DestructionAwareBeanPostProcessors
scopes:域標識符和對應域的鍵值對集合。
securityContextProvider 運行SecurityManager時使用的security context。
?
獲取bean實例
@Overridepublic Object getBean(String name) throws BeansException {return doGetBean(name, null, null, false);}@Overridepublic <T> T getBean(String name, Class<T> requiredType) throws BeansException {return doGetBean(name, requiredType, null, false);}@Overridepublic Object getBean(String name, Object... args) throws BeansException {return doGetBean(name, null, args, false);}public <T> T getBean(String name, @Nullable Class<T> requiredType, @Nullable Object... args)throws BeansException {return doGetBean(name, requiredType, args, false);}
最終調用的是doGetBean方法。
doGetBean有四個參數:
- name:bean的名稱
- requiredType: 返回的類型
- args: 傳遞的構造參數
- typeCheckOnly: 檢查類型
protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {//如果是別名轉化為實際的name,如果是&開頭的(所有的都去掉),去掉&再轉化別名。final String beanName = transformedBeanName(name);Object bean;// Eagerly check singleton cache for manually registered singletons.//獲取單例實例:DefaultSingletonBeanRegistry.getSingletonObject sharedInstance = getSingleton(beanName);//已經創建了,且沒有構造參數,進入這個方法,如果有構造參數,則根據構造函數創建beanif (sharedInstance != null && args == null) {if (logger.isTraceEnabled()) {if (isSingletonCurrentlyInCreation(beanName)) {logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +"' that is not fully initialized yet - a consequence of a circular reference");}else {logger.trace("Returning cached instance of singleton bean '" + beanName + "'");}}// 如果是普通bean,直接返回,是FactoryBean,返回他的getObjectbean = getObjectForBeanInstance(sharedInstance, name, beanName, null);}else {// 沒創建過bean或者是多例的情況或者有參數的情況// 創建過Prototype的bean,會循環引用,拋出異常,單例才嘗試解決循環依賴的問題if (isPrototypeCurrentlyInCreation(beanName)) {throw new BeanCurrentlyInCreationException(beanName);}// 父容器存在,本地沒有當前beanName,從父容器取BeanFactory parentBeanFactory = getParentBeanFactory();if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {// 如果名稱以&開頭,則beanName以&開頭。String nameToLookup = originalBeanName(name);if (parentBeanFactory instanceof AbstractBeanFactory) {return ((AbstractBeanFactory) parentBeanFactory).doGetBean(nameToLookup, requiredType, args, typeCheckOnly);}else if (args != null) {// Delegation to parent with explicit args.return (T) parentBeanFactory.getBean(nameToLookup, args);}else if (requiredType != null) {// No args -> delegate to standard getBean method.return parentBeanFactory.getBean(nameToLookup, requiredType);}else {return (T) parentBeanFactory.getBean(nameToLookup);}}if (!typeCheckOnly) {// typeCheckOnly為false,將beanName放入alreadyCreated中markBeanAsCreated(beanName);}//以上沒有獲取到bean實例。try {//合并父子bean的定義final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);//檢查合并之后的bean的定義,必要時拋異常checkMergedBeanDefinition(mbd, beanName, args);//如果有依賴bean,先初始化當前bean所依賴的beanString[] dependsOn = mbd.getDependsOn();if (dependsOn != null) {for (String dep : dependsOn) {//循環引用,拋出異常if (isDependent(beanName, dep)) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");}//注冊依賴的bean,registerDependentBean(dep, beanName);try {//生成bean實例。getBean(dep);}catch (NoSuchBeanDefinitionException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"'" + beanName + "' depends on missing bean '" + dep + "'", ex);}}}// 創造bean實例。if (mbd.isSingleton()) {//如果是單例,則調用createBean。(被子類覆蓋的方法)sharedInstance = getSingleton(beanName, () -> {try {return createBean(beanName, mbd, args);}catch (BeansException ex) {//最后從緩存中移除對應的實例原因有://1.每當有bean在創建時,允許循環參考來解析對應的beanDefinition//2.刪除臨時引用該bean的beandestroySingleton(beanName);throw ex;}});bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}else if (mbd.isPrototype()) {// 多例,創建新的bean。Object prototypeInstance = null;try {beforePrototypeCreation(beanName);prototypeInstance = createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}else {//其他作用域。String scopeName = mbd.getScope();final Scope scope = this.scopes.get(scopeName);if (scope == null) {throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");}try {Object scopedInstance = scope.get(beanName, () -> {beforePrototypeCreation(beanName);try {return createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}});bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);}catch (IllegalStateException ex) {throw new BeanCreationException(beanName,"Scope '" + scopeName + "' is not active for the current thread; consider " +"defining a scoped proxy for this bean if you intend to refer to it from a singleton",ex);}}}catch (BeansException ex) {cleanupAfterBeanCreationFailure(beanName);throw ex;}}//檢查類型與實際的bean的是否匹配if (requiredType != null && !requiredType.isInstance(bean)) {try {T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);if (convertedBean == null) {throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}return convertedBean;}catch (TypeMismatchException ex) {if (logger.isTraceEnabled()) {logger.trace("Failed to convert bean '" + name + "' to required type '" +ClassUtils.getQualifiedName(requiredType) + "'", ex);}throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}}return (T) bean;}
?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生
總結
以上是生活随笔為你收集整理的Spring AbstractBeanFactory的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。