Spring源码学习(一)

Spring是最常见的框架,那么他的内在机制是什么呢?

public class TestBean {
	private String str = "haha";

	public String getStr() {
		return str;
	}
}
public class TestSpring {
	public static void main(String[] args) {
		DefaultListableBeanFactory f = new XmlBeanFactory(new ClassPathResource("test.xml"));
		System.out.println(f.getBeanDefinitionCount());
		TestBean bean = (TestBean) f.getBean("testStr");
		System.out.println(bean.getStr());
	}
}
<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd">
	<bean id = "testStr" class="cn.pn.spring.TestBean"></bean>
</beans>

为什么通过这样一种方式就直接获取到了Bean实例呢?

猜想一下,我们要定义了Bean,然后定义配置文件,就可以获取了。它的内在机制应该是拿到配置文件信息,根据反射获取Bean的实例。

那么就有两个重点。

获取Bean的配置信息,可以是xml可以是注解。

根据配置信息去装配Bean,延迟加载或者直接实例化。

 

画了一下XmlBeanFactory的结构图:

最顶级的BeanFactory接口定义了Bean的基本功能:获取bean的模板方式和判断bean的属性。

实现它的有三个扩展接口:

AutowireCapableBeanFactory:顾名思义这个扩展接口主要定义的功能是:自动装配的方式,bean的依赖关系,包含了Bean的初始化和销毁,我的理解是定义了bean的生命周期功能。

HierarchicalBeanFactory:这个接口定义了两个方法,获取父类Bean工厂和判断是否包含本级的bean,如果看过Servlet源码能理解这个地方,让子类能专注做自己的事情。

ListableBeanFactory:一句话解释就是,提供了获取所有bean的配置清单,而不是显示调用getBean的时候去实例化Bean,换句话说就是获取非延迟加载的bean工厂都需要实现这个接口。包含了获取bean的几种方式,bean的数量和name。

下面描述一下其他的类:

AliasRegistry:定义了对alias的简单增删改等操作。

SingletonBeanRegistry:定义了对单例的bean的注册和获取。

ConfigurableBeanFactory:提供了配置factory的各种方法,scope,bean的依赖等各种方法。

对于学习Spring源码的网站,可以参考以下链接: 1. Spring官方网站:https://spring.io/ 在官方网站上,你可以找到关于Spring的所有文档、教程和源码下载链接。它是学习Spring的首要资源。 2. GitHub上的Spring源码仓库:https://github.com/spring-projects/spring-framework 这是Spring源码的官方GitHub仓库,你可以在这里找到最新的Spring源码,并参与到开发讨论中。 3. CSDN博客:https://blog.csdn.net/navyfrost/article/details/102919323 这是一篇关于Spring源码学习的博客文章,作者分享了学习Spring源码的心得和方法,并提供了一些学习资源和案例。 希望以上资源可以帮助你开始学习Spring源码。祝你学习顺利!<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span> #### 引用[.reference_title] - *1* [Spring源码学习加注释,方便学习.zip](https://download.csdn.net/download/weixin_47367099/85350853)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* *4* [Spring源码学习系列——源码下载和环境](https://blog.csdn.net/shangguoli/article/details/124710529)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值