Spring interfaces

InstantiationStrategy?

负责创建RootBeanDefinition相应实例的接口

实现类SimpleInstantiationStrategy

实现了下列3个方法,factory是独立实现的

如果beanDefination有MethodOverride的话需要有cglib子类初始化

public?interface?InstantiationStrategy?{
//无参数的创建bean
????Object?instantiate(RootBeanDefinition?beanDefinition,?String?beanName,?BeanFactory?owner)
??????throws?BeansException;
??????//有参数的创建bean
??????Object?instantiate(RootBeanDefinition?beanDefinition,?String?beanName,?BeanFactory?owner,
??????Constructor?ctor,?Object[]?args)?throws?BeansException;
??????//factoryBean的方式创建bean
??????Object?instantiate(RootBeanDefinition?beanDefinition,?String?beanName,?BeanFactory?owner,
??????Object?factoryBean,?Method?factoryMethod,?Object[]?args)?throws?BeansException;
}
### BeanMetadataElement 搭载元数据配置来源的信息
public?interface?BeanMetadataElement?{

???Object?getSource();

}
### ParameterNameDiscoverer? 获取方法的参数的名字 实现类 **PrioritizedParameterNameDiscoverer**:里面放一组parameterNameDiscoverers,取第一个 **DefaultParameterNameDiscoverer**:判断是不是JDK1.8,JDK1.8有个refect.Parameter? JDK1.8使用StandardReflectionParameterNameDiscoverer,使用Parameter极为简单 然而并不是,使用LocalVariableTableParameterNameDiscoverer需要读取字节码
public?interface?ParameterNameDiscoverer?{

???/**
????*?Return?parameter?names?for?this?method
????*/
???String[]?getParameterNames(Method?method);

???/**
????*?Return?parameter?names?for?this?constructor,
????*/
???String[]?getParameterNames(Constructor?ctor);

}

AutowireCandidateResolver?

判断一个指定的beanDefination能无能成为一个指定bean的注入候选

SimpleAutowireCandidateResolver:isAutowireCandidate直接返回beanDefination的属性,其他返回null

public?interface?AutowireCandidateResolver?{

????//这个bean能不能注入的这个描述符的field里面
???boolean?isAutowireCandidate(BeanDefinitionHolder?bdHolder,?DependencyDescriptor?descriptor);

???Object?getSuggestedValue(DependencyDescriptor?descriptor);

???Object?getLazyResolutionProxyIfNecessary(DependencyDescriptor?descriptor,?String?beanName);

}

BeanNameGenerator?

生成bean的name

public?interface?BeanNameGenerator?{
????String?generateBeanName(BeanDefinition?definition,?BeanDefinitionRegistry?registry);
}

BeanDefinitionReader?

读取BeanDefinition

设计一个读取bean信息的东西需要什么

读取完bean之后需要注册到beanDefination的map里面

需要能加载资源的东西

需要加载资源

AbstractBeanDefinitionReader:实现了基本的接口除了loadBeanDefinitions(resource),基本都指向了这个函数

XmlBeanDefinitionReader:处理xml校验解析相关内容

public?interface?BeanDefinitionReader?{

???BeanDefinitionRegistry?getRegistry();

???ResourceLoader?getResourceLoader();

???ClassLoader?getBeanClassLoader();
???//名字生成器
???BeanNameGenerator?getBeanNameGenerator();
????//加载资源,返回数量
???int?loadBeanDefinitions(Resource?resource)?throws?BeanDefinitionStoreException;

???int?loadBeanDefinitions(Resource...?resources)?throws?BeanDefinitionStoreException;

???int?loadBeanDefinitions(String?location)?throws?BeanDefinitionStoreException;

???int?loadBeanDefinitions(String...?locations)?throws?BeanDefinitionStoreException;

}

ResourceLoader?

public?interface?ResourceLoader?{

???//classpath:
???String?CLASSPATH_URL_PREFIX?=?ResourceUtils.CLASSPATH_URL_PREFIX;

????/**
????*?根据位置加载资源
????*?
  • Must?support?fully?qualified?URLs,?e.g.?"file:C:/test.dat". ????*?
  • Must?support?classpath?pseudo-URLs,?e.g.?"classpath:test.dat". ????*?
  • Should?support?relative?file?paths,?e.g.?"WEB-INF/test.dat". ????*/</span> ???Resource?getResource(String?location); ???ClassLoader?getClassLoader(); }</pre> ### BeanDefinitionRegistry? 基本就是个map<String beanName,BeanDefination bd> **DefaultListableBeanFactory**
    public?interface?BeanDefinitionRegistry?extends?AliasRegistry?{
    
    ???void?registerBeanDefinition(String?beanName,?BeanDefinition?beanDefinition)
    ?????????throws?BeanDefinitionStoreException;
    
    ???void?removeBeanDefinition(String?beanName)?throws?NoSuchBeanDefinitionException;
    
    ???BeanDefinition?getBeanDefinition(String?beanName)?throws?NoSuchBeanDefinitionException;
    
    ???boolean?containsBeanDefinition(String?beanName);
    
    ???String[]?getBeanDefinitionNames();
    
    ???int?getBeanDefinitionCount();
    
    ???boolean?isBeanNameInUse(String?beanName);
    
    }
    ### PropertyResolver? 解决各种source属性的接口
    public?interface?PropertyResolver?{
    
    ???boolean?containsProperty(String?key);
    
    ???String?getProperty(String?key);
    
    ???String?getProperty(String?key,?String?defaultValue);
    
    ????T?getProperty(String?key,?Class?targetType)</span></span>;
    
    ????T?getProperty(String?key,?Class?targetType,?T?defaultValue)</span></span>;
    
    ????Class?getPropertyAsClass(String?key,?Class?targetType)</span></span>;
    
    ???String?getRequiredProperty(String?key)?throws?IllegalStateException;
    
    ????T?getRequiredProperty(String?key,?Class?targetType)</span>?throws?IllegalStateException</span>;
    
    ???String?resolvePlaceholders(String?text);
    
    ???String?resolveRequiredPlaceholders(String?text)?throws?IllegalArgumentException;
    
    }</pre>
    
    Environment?
    
    表示当前应用程序正在运行的环境的接口
    
    配置文件和属性
    
    无论是在XML中还是通过注释定义的配置文件
    
    可能源自各种来源:属性文件,JVM系统属性,系统,环境变量,JNDI,servlet上下文参数,ad-hoc属性对象,地图等等。
    
    环境对象与属性关系的作用是为用户提供方便的服务接口,用于配置资源并从中解析属性。
    
    
    public?interface?Environment?extends?PropertyResolver?{
    
    ???String[]?getActiveProfiles();
    
    ???String[]?getDefaultProfiles();
    
    ???boolean?acceptsProfiles(String...?profiles);
    
    }
    ### BeanDefinitionDocumentReader? 注册bean **DefaultBeanDefinitionDocumentReade****r**:整个类都在处理这个接口registerBeanDefinitions
    public?interface?BeanDefinitionDocumentReader?{
    
    ???void?setEnvironment(Environment?environment);
    
    ???void?registerBeanDefinitions(Document?doc,?XmlReaderContext?readerContext)
    ?????????throws?BeanDefinitionStoreException;
    
    }