把之前分享的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载入模式更加灵活