把之前分享的spring框架整理一份放在這里。
整體架構:
Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架
框架圖(選自:http://docs.spring.io/spring/docs/3.0.x/reference/overview.html):
core Container為spring的核心,實現了基於IoC的bean管理容器。上層的aop /Aspects都是基於他基礎上實現的AOP。他們構成了spring的核心功能。
在IoC和AOP基礎上,我們有擴展了數據層和web層
使用場景:
web應用使用場景:(springmvc + spring)
rpc應用使用場景:
IoC:
應用控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體,將其所依賴的對象的引用,傳遞給它。也可以說,依賴被注入到對象中。所以,控制反轉是,關於一個對象如何獲取他所依賴的對象的引用,這個責任的反轉。
IoC容器框架的類關系:
beanFactory 和 applicationContext的比較,applicationContext支持的功能更多:
applicationContext支持不同的信息源:ApplicationContext擴展了MessageSource接口,可以支持國際化的實現。
訪問資源:ApplicationContext繼承了DefaultResourceLoader的子類,提供ResourceLoader和Resource的支持
支持應用事件:ApplicationContext繼承了ApplicationEventPublisher接口
applicationContext啟動流程(AbstractApplicationContext):
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory); // Register bean processors that intercept bean creation. registerBeanPostProcessors(beanFactory); // Instantiate all remaining (non-lazy-init) singletons. finishBeanFactoryInitialization(beanFactory);
bean介紹:
按照注入bean的種類分類:
分為 普通bean和 FactoryBean
factoryBean 需要實現FactoryBean接口,應用於一個bean作為工廠方法產生不同的bean實例,常用於應用層框架的搭建,可以根據特定條件返回接口的不同實現
public interface FactoryBean<T> { T getObject() throws Exception; Class<?> getObjectType(); boolean isSingleton(); }
bean的資源定義如何載入到容器:
xmlBeanFactory:
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException { super(parentBeanFactory); this.reader.loadBeanDefinitions(resource); }
applicationContext
編程式獲取bean的方法
ApplicationContext context = new ClassPathXmlApplicationContext("JunitNoHsfApplicationContext.xml"); FuwuDao fuwuDao = (FuwuDao)context.getBean("fuwuDao");
Web應用程序bean實例化的配置
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:application.xml</param-value> </context-param> <context-param> <param-name>${contextClassKey}</param-name> <param-value>com.taobao.data.fmp.spring.FmpApplicationContext</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
bean的注冊流程:
如何自定義bean標簽
獲取bean的流程:
bean的生命周期
生命周期中的擴展
- 各類Aware接口
- BeanPostProcessor接口
- InitializingBean接口
spring在web中如何啟動
bean的注解
@Autowired或@Resource
@Component(不推薦使用)、@Repository、@Service、@Controller
注解功能的實現原理
- 注解標簽的解析
<context:component-scan base-package="com.taobao.data.fmp" />
http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler
- 實現注解功能用到的beanPostProcessor
AutowiredAnnotationBeanPostProcessor CommondAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor RequiredAnnotationBeanPostProcessor
問題互動:
Bean 的循環依賴會報錯嗎
如何擴展一個bean的定義標簽
Web applicationContext什么時候實例化 bean
AOP
面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。
實現原理
webx介紹
http://www.openwebx.org/
webx是在spring基礎上對標簽解析這進行了更一步的擴張,是標簽解析和bean載入模式更加靈活