本文介紹了學習Spring源碼前需要掌握的核心知識點,包括IOC、AOP、Bean生命周期、初始化和Transaction事務。通過Hello World示例,講解瞭如何使用Spring,並指出了深入瞭解Spring內部機制的方向。 ...
前言
講解Spring之前,我們首先梳理下Spring有哪些知識點可以進行入手源碼分析,比如:
- Spring IOC依賴註入
- Spring AOP切麵編程
- Spring Bean的聲明周期底層原理
- Spring 初始化底層原理
- Spring Transaction事務底層原理
Hello World
通過這些知識點,後續我們慢慢在深入Spring的使用及原理剖析,為了更好地理解Spring,我們需要先瞭解一個最簡單的示例——Hello World。在學習任何框架和語言之前,Hello World都是必不可少的。
//在以前大家都是spring.xml進行註入bean後供Spring框架解析
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) context.getBean("userService");
userService.test();
spring.xml中的內容為:
<context:component-scan base-package="com.zhouyu"/>
<bean id="userService" class="com.zhouyu.service.UserService"/>
如果對上面的代碼或者xml形式很陌生,再看下麵一種代碼,也是目前流行的一種形式
//通過我們的配置類進行註入bean並解析
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MySpringConfig.class);
//ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) context.getBean("userService");
userService.test()
MySpringConfig中的內容為:
@ComponentScan("com.xiaoyu")
public class MySpringConfig {
@Bean
public UserService userService(){
return new UserService();
}
}
相信很多人都會對上面的代碼不陌生,那我們來看下這三行代碼都做了那些工作:
- 構造一個ClassPathXmlApplicationContext類解析配置文件 或者AnnotationConfigApplicationContext類 解析配置類,那麼調用該構造方法除開會實例化得到一個對象,還會做哪些事情?
- 從context中獲取一個名字為"userService"的userService對象,那麼為什麼輸入一個字元串就可以得到對象呢,好像跟Map<String,Object>有些類似,getBean()又是如何實現的?返回的UserService對象和我們自己直接new的UserService對象有區別嗎?
- 通過獲取到的UserService對象調用test方法,這個不難理解。
雖然我們目前很少直接使用這種方式來使用Spring,而是使用Spring MVC或者Spring Boot,但是它們都是基於上面這種方式的,都需要在內部去創建一個
ApplicationContext的,只不過:
- Spring MVC創建的是XmlWebApplicationContext,和ClassPathXmlApplicationContext類似,都是基於XML配置的
- Spring Boot創建的是AnnotationConfigApplicationContext
根據上面這三步我們大概找到了進行源碼深入的方向,本章只是簡單講解下如何簡單使用Spring,先對這些流程有個印象,並帶著疑惑來進一步探究Spring的內部機制,好了,今天就講到這裡,我是小雨,我們下期再見。