本文采用的Spring版本是5.1.1spring
首先咱们采用Spring官方推荐的JavaConfig风格+注解的方式来初始化Spring:缓存
// 配置类
@Configuration
@ComponentScan(basePackages = {"com.demo.learn.service"})
public class AppConfig {
}
// 入口类
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
DemoServiceImpl serviceImpl = (DemoServiceImpl)applicationContext.getBean(DemoServiceImpl.class);
System.out.println(serviceImpl);
}
复制代码
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
// 调用自身无参构造方法 -> 1.2
this();
register(annotatedClasses);
refresh();
}
复制代码
AnnotationConfigApplicationContext继承了GenericApplicationContext因此此处隐式调用了父类的无参构造方法建立了一个Bean工厂:DefaultListableBeanFactorybash
GenericApplicationContext
实现了BeanDefinitionRegistry
接口,而AnnotationConfigApplicationContext
继承了GenericApplicationContext
,因此AnnotationConfigApplicationContext
就是一个registryapp
BeanDefinitionRegistry 是一个接口,定义了关于 BeanDefinition 的注册、移除、查询等一系列的操做。该接口有三个实现类:DefaultListableBeanFactory、GenericApplicationContext、SimpleBeanDefinitionRegistry,其中 GenericApplicationContext 底层调用的是 DefaultListableBeanFactory 中的实现方法,因此严格意义上来讲,只有两个实现类。ide
public GenericApplicationContext() {
this.beanFactory = new DefaultListableBeanFactory();
}
复制代码
此处初始化了一个读取器和一个扫描器post
// 注解形式bean的读取器
private final AnnotatedBeanDefinitionReader reader;
// ...
public AnnotationConfigApplicationContext() {
// 给注册表建立一个bean读取器
// 初始化一个DefaultListableBeanFactory -> 1.3
this.reader = new AnnotatedBeanDefinitionReader(this);
//scanner的用处不是很大,它仅仅是在咱们外部手动调用 .scan 等方法才有用,常规方式是不会用到scanner对象的
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
复制代码
this.reader = new AnnotatedBeanDefinitionReader(this);
一路点下去,咱们会看到一系列初始化过程public ConditionContextImpl(@Nullable BeanDefinitionRegistry registry,
@Nullable Environment environment, @Nullable ResourceLoader resourceLoader) {
this.registry = registry;
this.beanFactory = deduceBeanFactory(registry);
this.environment = (environment != null ? environment : deduceEnvironment(registry));
this.resourceLoader = (resourceLoader != null ? resourceLoader : deduceResourceLoader(registry));
this.classLoader = deduceClassLoader(resourceLoader, this.beanFactory);
}
复制代码
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
BeanDefinitionRegistry registry, @Nullable Object source) {
// 建立beanFactory
DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
if (beanFactory != null) {
if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
}
if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
}
}
Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);
if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// ...
}
复制代码
BeanDefinition是什么,顾名思义,它是用来描述Bean的,里面存放着关于Bean的一系列信息,好比Bean的做用域,Bean所对应的Class,是否懒加载,是否Primary等等,这个BeanDefinition也至关重要ui
DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
在此以前registry为AnnotationConfigApplicationContext
,根据1.2得知是GenericApplicationContext
的子类,执行1.5.1处代码this
@Nullable
private static DefaultListableBeanFactory unwrapDefaultListableBeanFactory(BeanDefinitionRegistry registry) {
if (registry instanceof DefaultListableBeanFactory) {
return (DefaultListableBeanFactory) registry;
}
// 1.5.1
else if (registry instanceof GenericApplicationContext) {
return ((GenericApplicationContext) registry).getDefaultListableBeanFactory();
}
else {
return null;
}
}
复制代码
GenericApplicationContext
的beanFactory
,beanFactory
在1.2的时候已经被赋值为DefaultListableBeanFactory
public final DefaultListableBeanFactory getDefaultListableBeanFactory() {
return this.beanFactory;
}
复制代码
registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)
方法,咱们点进去能够看到这个方法中给RootBeanDefinition
设置了一个角色BeanDefinition.ROLE_INFRASTRUCTURE
, 此角色表名用此方法注册的bean彻底是spring的内部bean,与最终用户无关private static BeanDefinitionHolder registerPostProcessor(
BeanDefinitionRegistry registry, RootBeanDefinition definition, String beanName) {
definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
registry.registerBeanDefinition(beanName, definition);
return new BeanDefinitionHolder(definition, beanName);
}
复制代码
registry.registerBeanDefinition(beanName, definition)
方法能够看到这个方法是一个接口,先来看下此接口都有哪些方法spa
public interface BeanDefinitionRegistry extends AliasRegistry {
// 注册BeanDefinition
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;
// 移除BeanDefinition
void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
// 获取BeanDefinition
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
// 根据bean name判断是否存在BeanDefinition
boolean containsBeanDefinition(String beanName);
// 获取全部的BeanDefinition
String[] getBeanDefinitionNames();
// 获取BeanDefinition数量
int getBeanDefinitionCount();
// 判断bean name是否被占用
boolean isBeanNameInUse(String beanName);
}
复制代码
此时咱们须要找它的实现类(由1.5.2得知为DefaultListableBeanFactory)debug
这个类就是咱们的Bean容器所在的位置
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
复制代码
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
// 存储全部的BeanDefinition,key就是bean name,这个Map就是咱们一直所说的Bean容器
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
// 存储全部的bean name
private volatile List<String> beanDefinitionNames = new ArrayList<>(256);
/**
* 注册bean
* @param beanName bean name
* @param BeanDefinition bean对应的BeanDefinition
*/
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException {
Assert.hasText(beanName, "Bean name must not be empty");
Assert.notNull(beanDefinition, "BeanDefinition must not be null");
if (beanDefinition instanceof AbstractBeanDefinition) {
try {
// 验证:
1. 验证是否重写了方法
2. 若是重写了方法,经过beanName获取方法,若是为0则方法不存在,抛出异常,为1则设置overload属性为false
((AbstractBeanDefinition) beanDefinition).validate();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
"Validation of bean definition failed", ex);
}
}
// 从bean容器(beanDefinitionMap)中经过beanName获取beanDefinition
BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);
if (existingDefinition != null) {
// 判断是否容许重写beanDefinition,不容许则抛出异常
if (!isAllowBeanDefinitionOverriding()) {
throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);
}
// 当原beanDefinition的角色小于新的beanDefinition角色时,输出warn日志,提示beanDefinition被覆盖
else if (existingDefinition.getRole() < beanDefinition.getRole()) {
// e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTURE
if (logger.isInfoEnabled()) {
logger.info("Overriding user-defined bean definition for bean '" + beanName +
"' with a framework-generated bean definition: replacing [" +
existingDefinition + "] with [" + beanDefinition + "]");
}
}
// 当新beanDefinition的属性值不等于原beanDefinition的属性值时,输出info提示beanDefinition被覆盖
else if (!beanDefinition.equals(existingDefinition)) {
if (logger.isDebugEnabled()) {
logger.debug("Overriding bean definition for bean '" + beanName +
"' with a different definition: replacing [" + existingDefinition +
"] with [" + beanDefinition + "]");
}
}
else {
if (logger.isTraceEnabled()) {
logger.trace("Overriding bean definition for bean '" + beanName +
"' with an equivalent definition: replacing [" + existingDefinition +
"] with [" + beanDefinition + "]");
}
}
// 添加至bean容器,并覆盖原beanDefinition
this.beanDefinitionMap.put(beanName, beanDefinition);
}
// 容器中无对应的beanDefinition则直接注册
else {
// 判断此工厂bean建立流程是否已经开始
if (hasBeanCreationStarted()) {
// Cannot modify startup-time collection elements anymore (for stable iteration)
synchronized (this.beanDefinitionMap) {
// 添加beanDefinition至bean容器
this.beanDefinitionMap.put(beanName, beanDefinition);
// 建立新的beanNames集合,并将已经存在的beanNames放入该集合
List<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);
updatedDefinitions.addAll(this.beanDefinitionNames);
updatedDefinitions.add(beanName);
this.beanDefinitionNames = updatedDefinitions;
// 在手动建立bean的集合中,若是存在同名的beanName,则将集合中已经存的beanName移除
if (this.manualSingletonNames.contains(beanName)) {
Set<String> updatedSingletons = new LinkedHashSet<>(this.manualSingletonNames);
updatedSingletons.remove(beanName);
this.manualSingletonNames = updatedSingletons;
}
}
}
else {
// Still in startup registration phase
// 将当前bean对应的beanDefinition放入容器中
this.beanDefinitionMap.put(beanName, beanDefinition);
// 将当前beanName放入beanDefinitionNames中
this.beanDefinitionNames.add(beanName);
// 删除同名的beanName
this.manualSingletonNames.remove(beanName);
}
// 将保存冻结beanDefinition的Map设为null
this.frozenBeanDefinitionNames = null;
}
// 若是当前注册的beanDefinition已经存在,或者在(缓存单例bean实例map)中存在
if (existingDefinition != null || containsSingleton(beanName)) {
// 重置给定bean的全部bean定义缓存,包括从其派生的bean的缓存
resetBeanDefinition(beanName);
}
}
}
复制代码