把以前分享的spring框架整理一份放在這裏。html
總體架構:java
Spring是一個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架web
框架圖(選自:http://docs.spring.io/spring/docs/3.0.x/reference/overview.html):spring
core Container爲spring的核心,實現了基於IoC的bean管理容器。上層的aop /Aspects都是基於他基礎上實現的AOP。他們構成了spring的核心功能。編程
在IoC和AOP基礎上,咱們有擴展了數據層和web層架構
使用場景:mvc
web應用使用場景:(springmvc + spring)app
rpc應用使用場景:框架
IoC:ui
應用控制反轉,對象在被建立的時候,由一個調控系統內全部對象的外界實體,將其所依賴的對象的引用,傳遞給它。也能夠說,依賴被注入到對象中。因此,控制反轉是,關於一個對象如何獲取他所依賴的對象的引用,這個責任的反轉。
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的生命週期
生命週期中的擴展
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
AutowiredAnnotationBeanPostProcessor CommondAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor RequiredAnnotationBeanPostProcessor
問題互動:
Bean 的循環依賴會報錯嗎
如何擴展一個bean的定義標籤
Web applicationContext何時實例化 bean
AOP
面向切面編程,經過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。
實現原理
webx介紹
http://www.openwebx.org/
webx是在spring基礎上對標籤解析這進行了更一步的擴張,是標籤解析和bean載入模式更加靈活