栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring源码解析(一)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring源码解析(一)

Spring源码解析(一)

文章目录
  • Spring源码解析(一)
    • 1.AnnotationConfigApplicationContext 的构造方法--this()分析
    • 2.AnnotationConfigApplicationContext 的构造方法--register()分析
    • 3.AnnotationConfigApplicationContext 的构造方法--refresh()分析-未完待续



由于当前更多是使用Spring注解进行开发,所以从Spirng的注解容器AnnotationConfigApplicationContext开始分析。

 public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringSourceApplication.class);
        Object userDao = applicationContext.getBean("userDao");
        System.out.println(userDao);
    }

从上面代码可以看容器实例化后就直接从容器获取Bean了,所以可以判断在容器实例化的时候已经完成了Bean的创建,所以我们直接看AnnotationConfigApplicationContext的构造方法。

1.AnnotationConfigApplicationContext 的构造方法–this()分析
public AnnotationConfigApplicationContext(Class... annotatedClasses) {
		this();
		register(annotatedClasses);
		refresh();
}

由于AnnotationConfigApplicationContext继承了GenericApplicationContext,所以会先执行GenericApplicationContext的构造

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

在GenericApplicationContext的构造方法中,实例化了Bean工厂,并作为AnnotationConfigApplicationContext的属性存在。
接下来看AnnotationConfigApplicationContext的this方法

public AnnotationConfigApplicationContext() {
		this.reader = new AnnotatedBeanDefinitionReader(this);
		this.scanner = new ClassPathBeanDefinitionScanner(this);
	}

在this方法中分别实例化了AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner,先进入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);
		AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
	}

Conditionevaluator是用来处理@Condition注解的,后面分析到@Condition再看,接下来进入AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);

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));
		}

		if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
		}

		if (!registry.containsBeanDefinition(REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition(RequiredAnnotationBeanPostProcessor.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
		}

		// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
		if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
		}

		// Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.
		if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition();
			try {
				def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
						AnnotationConfigUtils.class.getClassLoader()));
			}
			catch (ClassNotFoundException ex) {
				throw new IllegalStateException(
						"Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
			}
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
		}

		if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
		}

		if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
		}

上面代码是将Spring内置的Bean定义(internalConfigurationAnnotationProcessor、internalEventListenerFactory、internalAutowiredAnnotationProcessor、internalRequiredAnnotationProcessor、internalCommonAnnotationProcessor、internalEventListenerProcessor)注册到Bean注册中心。
打断点可以看到在执行前bean定义个数为0:

执行后个数为6个:

接下来进入ClassPathBeanDefinitionScanner:

public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters,
			Environment environment, @Nullable ResourceLoader resourceLoader) {

		Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
		this.registry = registry;

		if (useDefaultFilters) {
			registerDefaultFilters();
		}
		setEnvironment(environment);
		setResourceLoader(resourceLoader);
	}

进入registerDefaultFilters,通过下图看到这段代码为ClassPathBeanDefinitionScanner(Bean扫描组件)添加过滤器,只扫描加了@Component和@ManagedBean注解的类。

总结下this方法做的事情,将spring内置Bean的Bean定义放入到BeanFactory,为BeanScanner添加过滤器,接下来分析register

2.AnnotationConfigApplicationContext 的构造方法–register()分析
public void register(Class... annotatedClasses) {
		for (Class annotatedClass : annotatedClasses) {
			registerBean(annotatedClass);
		}
}

annotatedClasses是我们实例化AnnotationConfigApplicationContext的时候传入的class,一般是我们的主配置类,类型于xml形式的configuration文件。
进入registerBean:
1.实例化Bean定义AnnotatedGenericBeanDefinition
2.判断该实体是否有@Condition注解,并进行处理
3.注册Bean定义

AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);
		if (this.conditionevaluator.shouldSkip(abd.getmetadata())) {
			return;
		}

		abd.setInstanceSupplier(instanceSupplier);
		Scopemetadata scopemetadata = this.scopemetadataResolver.resolveScopemetadata(abd);
		abd.setScope(scopemetadata.getScopeName());
		String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));

		AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
		if (qualifiers != null) {
			for (Class qualifier : qualifiers) {
				if (Primary.class == qualifier) {
					abd.setPrimary(true);
				}
				else if (Lazy.class == qualifier) {
					abd.setLazyInit(true);
				}
				else {
					abd.addQualifier(new AutowireCandidateQualifier(qualifier));
				}
			}
		}
		for (BeanDefinitionCustomizer customizer : definitionCustomizers) {
			customizer.customize(abd);
		}

		BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
		definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopemetadata, definitionHolder, this.registry);
		BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);

通过断点可以发现在执行完Register后加入了参数类Bean定义到BeanFactory

3.AnnotationConfigApplicationContext 的构造方法–refresh()分析-未完待续
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/288604.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号