Spring原理(一)--IOC原理

1 环境搭建

1 pom:
  <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-context</artifactId>
     <version>5.2.6.RELEASE</version>
   </dependency>
2 Appconfig:
 @ComponentScan("com.spring")
 @Configuration
 public class Appconfig {
 }
3 test.java:
   AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext(Appconfig.class);
    UserService bean = (UserService) ac.getBean("userServiceImpl");
    System.out.println(bean);

2 原理

2.1整体流程

通过注解或者xml文件定义的每个类,通过BeanDefinitionReader读取后把元数据存放在一个spring创建的BeanDefinition的子类对象中(例如new AnnotationBeanDefinition),把多个beanDefinition对象和对应的BeanName存放在一个beanDefinitionMap中(还会维护一个beanDefinitionNames的list存放所有的beanName)。然后通过BeanFactory从map中拿beanDefinition对象进行验证,创建bean对象(主要步骤:实例化->填充属性(注入)->初始化->代理 aop->put singletonObjects),最后把bean放在单例池map中(原型对象不会在容器初始化时创建,而是在getbean的时候创建)。

2.2 具体流程

从以下创建容器的代码开始分析ioc的具体实现原理

AnnotationConfigApplicationContext ac = new 
AnnotationConfigApplicationContext(Appconfig.class);

1 进入到new AnnotationConfigApplicationContext(Appconfig.class);
先执行父类GenericApplicationContext的构造方法创建beanFactory

	public GenericApplicationContext() {
	//创建beanFactory
		this.beanFactory = new DefaultListableBeanFactory();
	}

2 然后调用自己的构造方法this();

	public AnnotationConfigApplicationContext() {
	/**
	 1 创建一个读取注解bean定义的读取器AnnotatedBeanDefinitionReader
	 2 在此处会注册5个beanDefinition,其中一个是ConfigurationClassPostProcessor,
	是spring内部的BeanFactoryPostProcessor后置处理器,
	在后面用来解析配置类beanDefinition(就是Appconfig)
	**/
	    this.reader = new AnnotatedBeanDefinitionReader(this);
	/**
    创建一个用来扫描包的scanner(注意实际上扫描包的工作不是这个scanner做的
    而是spring自己new的一个ClassPathBeanDefinitionScanner,
    这里的scanner是为了程序员在外部调用AnnotationConfigApplicationContext.scan()方法)
    **/
	    this.scanner = new ClassPathBeanDefinitionScanner(this);
	}

2.1 AnnotatedBeanDefinitionReader构造方法:

	public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
		Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
		Assert.notNull(environment, "Environment must not be null");
		this.registry = registry;
		this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
		//在此处添加的5个beanDefinition,
		//具体是里面的registerAnnotationConfigProcessors方法,
		//可以自己点进去看一下(里面会执行多个beanDefs.add方法进行添加)
		AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
	}

3 接下来调用自己构造方法中的register(componentClasses)和spring核心方法refresh()

	public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
	    //这里调用的就是上一步的构造方法,创建reader和scanner
		this();
		//将传过来的参数注册,可以注册一个单独的bean也可以注册一个配置类,
		//这里就是Appconfig.class,
		//将Appconfig.class封装成beanDefinition对象后put进beanDefinitionMap中
		register(componentClasses);
		//调用spring核心方法
		refresh();
	}

3.1 register()方法的核心是调用AnnotatedBeanDefinitionReader的doRegisterBean()方法,里面会new一个AnnotatedGenericBeanDefinition对象,然后经过一些判断,调用BeanDefinitionReaderUtils.registerBeanDefinition将创建的beanDefinition放入beanDefinitionMap中,此时beanDefinitionMap中共有6个beanDefinition。

	private <T> void doRegisterBean(Class<T> beanClass, @Nullable String name,
			@Nullable Class<? extends Annotation>[] qualifiers, @Nullable Supplier<T> supplier,
			@Nullable BeanDefinitionCustomizer[] customizers) {
        //new AnnotatedGenericBeanDefinition对象
		AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass);
		if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
			return;
		}

		abd.setInstanceSupplier(supplier);
		ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
		//设置beanDefinition是否单例
		abd.setScope(scopeMetadata.getScopeName());
		//生成bean的名字
		String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));

		AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
		if (qualifiers != null) {
			for (Class<? extends Annotation> qualifier : qualifiers) {
				if (Primary.class == qualifier) {
					abd.setPrimary(true);
				}
				else if (Lazy.class == qualifier) {
					abd.setLazyInit(true);
				}
				else {
					abd.addQualifier(new AutowireCandidateQualifier(qualifier));
				}
			}
		}
		if (customizers != null) {
			for (BeanDefinitionCustomizer customizer : customizers) {
				customizer.customize(abd);
			}
		}
        //将beanDefinition和beanName封装到一起
		BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
		definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
		//将beanDefinitionput进将beanDefinitionMap
		//内部最终调用this.beanDefinitionMap.put(beanName, beanDefinition);
		BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
	}

4 refresh()核心方法

	@Override
	public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			// Prepare this context for refreshing.
			//准备工作,设置一些时间,属性
			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
			//得到beanFactory对象工厂
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// Prepare the bean factory for use in this context.
			//准备工作包括添加一个类加载器、设置bean的解析器,用来解析bean的表达式、
			//添加一个BeanPostProcessor后置处理器等
			prepareBeanFactory(beanFactory);

			try {
				// Allows post-processing of the bean factory in context subclasses.
				//空方法,留做扩展
				postProcessBeanFactory(beanFactory);

				// Invoke factory processors registered as beans in the context.
				//实例化和执行BeanFactoryPostProcessor(包括自定义的和spring内部定义的);
				//完成扫描注解类(执行完成后所有beanDefinition都已经放入map中)
				invokeBeanFactoryPostProcessors(beanFactory);
                实例化和注册BeanPostProcessor
				// Register bean processors that intercept bean creation.
				registerBeanPostProcessors(beanFactory);
                //完成一些国际化信息
				// Initialize message source for this context.
				initMessageSource();
                //初始化广播器,发布一些事件
				// Initialize event multicaster for this context.
				initApplicationEventMulticaster();
               //空方法,做扩展
				// Initialize other special beans in specific context subclasses.
				onRefresh();
                //注册监听器到广播器里
				// Check for listener beans and register them.
				registerListeners();
                 //完成所有非懒加载单例对象的实例化功能,通过反射实现,再进行bean的属性注入和初始化
				// Instantiate all remaining (non-lazy-init) singletons.
				finishBeanFactoryInitialization(beanFactory);

				// Last step: publish corresponding event.
				finishRefresh();
			}

			catch (BeansException ex) {
				if (logger.isWarnEnabled()) {
					logger.warn("Exception encountered during context initialization - " +
							"cancelling refresh attempt: " + ex);
				}

				// Destroy already created singletons to avoid dangling resources.
				destroyBeans();

				// Reset 'active' flag.
				cancelRefresh(ex);

				// Propagate exception to caller.
				throw ex;
			}

			finally {
				// Reset common introspection caches in Spring's core, since we
				// might not ever need metadata for singleton beans anymore...
				resetCommonCaches();
			}
		}
	}

5 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory():
这一步是用来获取beanFactory

	protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
		refreshBeanFactory();
		//调用GenericApplicationContext的getBeanFactory()方法获取beanFactory
		return getBeanFactory();
	}

6 prepareBeanFactory(beanFactory):
做一些准备工作,包括添加一个类加载器、设置bean的解析器,用来解析bean的表达式、添加一个BeanPostProcessor后置处理器 (ApplicationContextAwareProcessor还没用到),是一个list,在bean的实例化过程中可以链式执行,插手bean的实例化过程、忽略一些自动注入的对象等

		// Tell the internal bean factory to use the context's class loader etc.
		//添加一个类加载器
		beanFactory.setBeanClassLoader(getClassLoader());
		//设置bean的解析器,用来解析bean的表达式
		beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
		//添加一个BeanPostProcessor后置处理器(还没用到),
		//是一个list,在bean的实例化过程中可以链式执行,插手bean的实例化过程。
		beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

		// Configure the bean factory with context callbacks.
		//忽略一些自动注入的对象
		beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
		beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
		beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
		beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
		beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
		beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
		beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
		//.....

6 postProcessBeanFactory(beanFactory);
空方法,留给扩展
7 invokeBeanFactoryPostProcessors(beanFactory):
实例化和执行BeanFactoryPostProcessor(包括自定义的和spring内部定义的)

	protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
	/**
     getBeanFactoryPostProcessors()是获得程序员在外部手动调用  
	AnnotationConfigApplicationContext.addBeanFactoryPostProcessor()给spring添加的  
	BeanFactoryPostProcessor
	这行代码是处理手动添加的和spring内部的BeanFactoryPostProcessor,
	若没有自己手动给spring添加的,这里就是执行,上面刚开始给spring添加的ConfigurationClassPostProcessor
	用来解析配置类appconfig,将包下配置的所有注解类封装成beanDefinition放入beanDefinitionMap中
	
	invokeBeanFactoryPostProcessors的invokeBeanDefinitionRegistryPostProcessors
	方法会调用ConfigurationClassPostProcessor#processConfigBeanDefinitions的parser.parse(candidates);进行具体的解析
	**/

		PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
	
//.....
	}

8 finishBeanFactoryInitialization(beanFactory);
完成所有非懒加载单例对象的实例化功能,通过反射实现,再进行bean的属性注入和初始化

	protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
		// Initialize conversion service for this context.
		//.....
		// Register a default embedded value resolver if no bean post-processor
		// (such as a PropertyPlaceholderConfigurer bean) registered any before:
		// at this point, primarily for resolution in annotation attribute values.
        //.....
		// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
		//....

		// Stop using the temporary ClassLoader for type matching.
		beanFactory.setTempClassLoader(null);

		// Allow for caching all bean definition metadata, not expecting further changes.
		beanFactory.freezeConfiguration();

		// Instantiate all remaining (non-lazy-init) singletons.
		beanFactory.preInstantiateSingletons();
	}

8.1 beanFactory.preInstantiateSingletons();方法进行创建单例bean

	public void preInstantiateSingletons() throws BeansException {
		if (logger.isTraceEnabled()) {
			logger.trace("Pre-instantiating singletons in " + this);
		}

		// Iterate over a copy to allow for init methods which in turn register new bean definitions.
		// While this may not be part of the regular factory bootstrap, it does otherwise work fine.
		//得到维护beanDefinitionName的list(刚开始有讲到spring不仅会维护beanDefinitionMap,
		//还会维护一个beanDefinitionNames的list存放所有的beanName,也就是map中的key,方便来遍历map)
		List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

		// Trigger initialization of all non-lazy singleton beans...
		for (String beanName : beanNames) {
		//从beanDefinitionMap中根据key拿到value,就是beanDefinition
			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
			//拿到beanDefinition后进行一些验证,是不是抽象、单例、懒加载,是不是FactoryBean
			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
				if (isFactoryBean(beanName)) {
					Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
					if (bean instanceof FactoryBean) {
						final FactoryBean<?> factory = (FactoryBean<?>) bean;
						boolean isEagerInit;
						if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
							isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
											((SmartFactoryBean<?>) factory)::isEagerInit,
									getAccessControlContext());
						}
						else {
							isEagerInit = (factory instanceof SmartFactoryBean &&
									((SmartFactoryBean<?>) factory).isEagerInit());
						}
						if (isEagerInit) {
						//通过验证调用getBean(beanName),实际完成bean的创建
							getBean(beanName);
						}
					}
				}
				else {
					getBean(beanName);
				}
			}
		}

		// Trigger post-initialization callback for all applicable beans...
	

	}

8.2 上一个方法中的getBean(beanName)中调用doGetBean方法

	protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
			@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
        //判断beanName是否合法
		final String beanName = transformedBeanName(name);
		Object bean;

		// Eagerly check singleton cache for manually registered singletons.
		//判断bean是否已被创建成功
		Object sharedInstance = getSingleton(beanName);
		if (sharedInstance != null && args == null) {
		  //.........
		}

		else {
			// Fail if we're already creating this bean instance:
			// We're assumably within a circular reference.

			// Check if bean definition exists in this factory.
			}
			
             //.......进行一系列的验证
                
				// Create bean instance.
				if (mbd.isSingleton()) {
				//验证通过进入getSingleton方法
					sharedInstance = getSingleton(beanName, () -> {
						try {
							return createBean(beanName, mbd, args);
						}
				}
				//...............
		
		return (T) bean;
	}

8.3 上一个方法中的getSingleton方法

	public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
		Assert.notNull(beanName, "Bean name must not be null");
		synchronized (this.singletonObjects) {
		//还会判断再单例池中有没有这个bean
			Object singletonObject = this.singletonObjects.get(beanName);
			if (singletonObject == null) {
			//......
               //判断当前bean是否在排除bean集合之内,若不在将beanName放入一个set中
               //(singletonsCurrentlyInCreation),表示当前bean正在被创建
				beforeSingletonCreation(beanName);
	       //......
				try {
				//会调用createBean(beanName, mbd, args),
				//这就是上个一方法中getSingleton Lambda表达式体中的createBean方法;
					singletonObject = singletonFactory.getObject();
					newSingleton = true;
				}
				catch (IllegalStateException ex) {
					// Has the singleton object implicitly appeared in the meantime ->
					// if yes, proceed with it since the exception indicates that state.
				
				}
				//......
				if (newSingleton) {
				    //将创建好的bean放入单例池
					addSingleton(beanName, singletonObject);
				}

		
			}
			return singletonObject;
		}
	}

8.5 createBean(beanName, mbd, args)方法

@Override
	protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
			throws BeanCreationException {

	  //.......

		// Make sure bean class is actually resolved at this point, and
		// clone the bean definition in case of a dynamically resolved Class
		// which cannot be stored in the shared merged bean definition.
		//得到类对象
		Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
          //.................
		try {
		//进行具体的创建
			Object beanInstance = doCreateBean(beanName, mbdToUse, args);
        //.......
			return beanInstance;
		}
	}

8.5 上个方法中的doCreateBean方法:

//完成创建,仅仅是通过反射进行实例化
instanceWrapper = createBeanInstance(beanName, mbd, args);
//判断bean是否单例、是否支持循环依赖、是否正在创建
earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&isSingletonCurrentlyInCreation(beanName));
//判断通过执行addSingletonFactory方法
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
//........
//完成属性注入
populateBean(beanName, mbd, instanceWrapper);
//完成初始化和aop(applyBeanPostProcessorsAfterInitialization方法完成)
exposedObject = initializeBean(beanName, exposedObject, mbd);

8.6 上个方法中的addSingletonFactory方法:

    //放入三级缓存,完成循环依赖的关键,
	this.singletonFactories.put(beanName, singletonFactory);
	//从二级缓存remove掉
	this.earlySingletonObjects.remove(beanName);

8.7最后调用addSingleton(beanName, singletonObject);将返回的singletonObject放入单例池

	protected void addSingleton(String beanName, Object singletonObject) {
		synchronized (this.singletonObjects) {
		    //放入单例池(一级缓存)
			this.singletonObjects.put(beanName, singletonObject);
			//从三级缓存remove掉
			this.singletonFactories.remove(beanName);
			//从二级缓存remove掉
			this.earlySingletonObjects.remove(beanName);
			this.registeredSingletons.add(beanName);
		}
	}

//未完待续,关于循环依赖和aop的实现请看本人下一边文章

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值