spring bean parse

发布时间:2020-04-07 20:00:06 作者:mingyongyao_cto
来源:网络 阅读:405

BeanDefinitionParserDelegate

解析<bean id="" name=""  name中的内容可以用“,”,“:”,“  ”作为分隔符

如果id为空,就将name中的第一个值赋给id


Entry-->BeanEntry

public final class ParseState {

    /**
     * Tab character used when rendering the tree-style representation.
     */
    private static final char TAB = '\t';

    /**
     * Internal {@link Stack} storage.
     */
    private final Stack<Entry> state;


    /**
     * Create a new {@code ParseState} with an empty {@link Stack}.
     */
    public ParseState() {
        this.state = new Stack<Entry>();
    }

    /**
     * Create a new {@code ParseState} whose {@link Stack} is a {@link Object#clone clone}
     * of that of the passed in {@code ParseState}.
     */
    @SuppressWarnings("unchecked")
    private ParseState(ParseState other) {
        this.state = (Stack<Entry>) other.state.clone();
    }


    /**
     * Add a new {@link Entry} to the {@link Stack}.
     */
    public void push(Entry entry) {
        this.state.push(entry);
    }

    /**
     * Remove an {@link Entry} from the {@link Stack}.
     */
    public void pop() {
        this.state.pop();
    }

    /**
     * Return the {@link Entry} currently at the top of the {@link Stack} or
     * {@code null} if the {@link Stack} is empty.
     */
    public Entry peek() {
        return this.state.empty() ? null : this.state.peek();
    }

    /**
     * Create a new instance of {@link ParseState} which is an independent snapshot
     * of this instance.
     */
    public ParseState snapshot() {
        return new ParseState(this);
    }


    /**
     * Returns a tree-style representation of the current {@code ParseState}.
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (int x = 0; x < this.state.size(); x++) {
            if (x > 0) {
                sb.append('\n');
                for (int y = 0; y < x; y++) {
                    sb.append(TAB);
                }
                sb.append("-> ");
            }
            sb.append(this.state.get(x));
        }
        return sb.toString();
    }


    /**
     * Marker interface for entries into the {@link ParseState}.
     */
    public interface Entry {

    }

}

 


public class BeanEntry implements ParseState.Entry {

    private String beanDefinitionName;


    /**
     * Creates a new instance of {@link BeanEntry} class.
     * @param beanDefinitionName the name of the associated bean definition
     */
    public BeanEntry(String beanDefinitionName) {
        this.beanDefinitionName = beanDefinitionName;
    }


    @Override
    public String toString() {
        return "Bean '" + this.beanDefinitionName + "'";
    }

}





BeanDefinition的实例:GenericBeanDefinition bd = new GenericBeanDefinition();

AbstractBeanDefinition-->BeanMetadataAttributeAccessor


public class BeanMetadataAttributeAccessor extends AttributeAccessorSupport implements BeanMetadataElement {

    private Object source;

    ........

}

public abstract class AttributeAccessorSupport implements AttributeAccessor, Serializable {

    /** Map with String keys and Object values */
    private final Map<String, Object> attributes = new LinkedHashMap<String, Object>(0);

....

}



BeanMetadataAttribute attribute :

public class BeanMetadataAttribute implements BeanMetadataElement {

    private final String name;

    private final Object value;

    private Object source;

}


LookupOverride:

public class LookupOverride extends MethodOverride {

    private final String beanName;

    private Method method;
.......}


public abstract class MethodOverride implements BeanMetadataElement {

    private final String methodName;

    private boolean overloaded = true;

    private Object source;

...........}


public class MethodOverrides {

    private final Set<MethodOverride> overrides = new LinkedHashSet<MethodOverride>(0);

......}



ReplaceOverride

    public class ReplaceOverride extends MethodOverride {

    private final String methodReplacerBeanName;

    private List<String> typeIdentifiers = new LinkedList<String>();


     。。。。。}


   constructor-arg:只有一个子元素(must not contain more than one sub-element)

       is only allowed to contain either 'ref' attribute OR 'value' attribute OR sub-element

     

ref作为属性,则转换成RuntimeBeanReference

public class RuntimeBeanReference implements BeanReference {

    private final String beanName;

    private final boolean toParent;

    private Object source;

。。。。}

        

如果value作为属性则转换成:

    public class TypedStringValue implements BeanMetadataElement {

    private String value;

    private volatile Object targetType;

    private Object source;

    private String specifiedTypeName;

    private volatile boolean dynamic;

   。。。。。}

构造函数解析存放的对象:

    public class ConstructorArgumentValues {

    private final Map<Integer, ValueHolder> indexedArgumentValues = new LinkedHashMap<Integer, ValueHolder>(0);

    private final List<ValueHolder> genericArgumentValues = new LinkedList<ValueHolder>();

。。。。}

对应<constructor index....   利用indexedArgumentValues 存放

没有index的利用genericArgumentValues存放


Property解析:

    public class PropertyValue extends BeanMetadataAttributeAccessor implements Serializable {

    private final String name;

    private final Object value;

    private Object source;

    private boolean optional = false;

    private boolean converted = false;

    private Object convertedValue;

    /** Package-visible field that indicates whether conversion is necessary */
    volatile Boolean conversionNecessary;

    /** Package-visible field for caching the resolved property path tokens */
    transient volatile Object resolvedTokens;

.......}

其中PropertyValue 中的value保存的类型就是ManagedList


public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
        implements BeanDefinition, Cloneable {


.........

private MutablePropertyValues propertyValues;

.........

} 作为存储默认元素的属性



Qualifier子元素的解析:

    public class AutowireCandidateQualifier extends BeanMetadataAttributeAccessor {

    public static String VALUE_KEY = "value";

    private final String typeName;

     ......

    }


    public class BeanMetadataAttributeAccessor extends AttributeAccessorSupport implements BeanMetadataElement {

    private Object source;

   ..............

   }


   public abstract class AttributeAccessorSupport implements AttributeAccessor, Serializable {

    /** Map with String keys and Object values */
    private final Map<String, Object> attributes = new LinkedHashMap<String, Object>(0);

    ........

   }



 


  

推荐阅读:
  1. Spring Core Container 源码分析七:注册 Bean Definitions
  2. 如何解决Spring框架单例模式与线程安全之间矛盾

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

storage spring private

上一篇:ma680t开局指导

下一篇:jquery.multiSelect下拉框多选

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》