Spring整体架构
1.Core Container核心容器,包含Core,Beans,Context,Expression Language.Core和Beans提供最基本的IOC(控制反转)和依赖注入。
- Core模块主要包含Spring基本框架的核心工具类。
- Beans模块包含访问配置文件,创建和管理bean,以及Inversion of Control/Dependency Injection相关的所有操作。
- Context在Core和Beans模块的基础上,提供了类似与JNDI(Java naming directory interface)注册器的框架式的对象访问方式。Context模块继承了Beans的特性,为Spring核心提供了大量扩展。
- Expression Language 模块提供了一个强大的表达式语言用于在运行时查询和操纵对象。(EL表达式)
2.Data Access/Integration数据访问/整合,这一层包含JDBC,ORM,OXM,JMS和Transation模块。
JDBC模块提供了一个JDBC抽象层,这个模块包含了Spring对JDBC数据访问进行封装的所有类。
ORM模块是对象-关系映射API,例如:Hibernate,iBatis等。提供了一个交互层,可以混合使用所有Spring提供的特性进行O/R映射。
- OXM模块提供了一个对Object/XML映射实现的抽象层。
- JMS(Java Messaging Service) 模块主要包含了一些制造和消费消息的特性。
- Transation模块支持编程和声明的事务管理,这些事物类必须实现特定的接口,并且对所有的POJO都适用。
3.Web。Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。所以,Spring框架支持与Struts的集成。还简化了处理多部分请求以及将请求以及请求参数绑定到域对象的工作。
- Web模块:提供了基础的面向Web的集成特性。例如:多文件上传,使用servlet listeners初始化IoC容器以及一个面向Web的应用上下文。
- Web-Servlet:该模块包含Spring的MVC的实现。
- Web-Struts:该模块提供了对struts的支持。
4.AOP提供了一个面向切面编程。
5.Test模块支持使用JUnit和TestNG对Spring组件进行测试。
容器的基本实现(bean)
1.最简单的例子:
public class MyTestBean{
private String testStr = "testStr";
public String getTestStr(){
return testStr;
}
public void setTestStr(String testStr){
this.testStr = testStr;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<bean id="myTestBean" class="bean.MyTestBean">
</beans>
public class BeanFactoryTest{
BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactoryTest.xml"));
MyTestBean bean = (MyTestBean)bf.getBean("myTestBean");
bean.getTestStr();
}
2.上述实例最简单的架构图
- ConfigReader:读取配置文件,放到内存中。
- reflection:根据配置文件中的配置进行反射实例化。
- app:完成代码逻辑。
3.时序图:
- Resource资源的封装:Java中的配置文件是通过ClassPathResource进行封装,经过一系列的处理返回一个Resource类。
3.资源处理相关类图:
- InputStreamSource:返回任何能返回InputStream的类,比如File,ClassPath下的资源等,返回一个全新的InputStream对象。
public interface InputStreamSource {
InputStream getInputStream() throws IOException;
}
- Reource抽象了所有Spring内部使用到的底层资源:File,URL,Classpath等,定义了判断当前资源状态的方法。
public interface Resource extends InputStreamSource {
boolean exists();
boolean isReadable();
boolean isOpen();
URL getURL() throws IOException;
URI getURI() throws IOException;
File getFile() throws IOException;
long contentLength() throws IOException;
long lastModified() throws IOException;
Resource createRelative(String var1) throws IOException;//创建相对资源
String getFilename();
String getDescription();//用于在错误信息中详细打印出错的资源文件
}
- 剩下的类就是对不同来源的资源文件都有相应的Reource实现:文件(FileSystemReource),Classpath资源(ClassPathReource),URL资源(UrlResource),InputStream资源(InputStreamResource),Byte数组(ByteArrayResource)等。
4.继续分析XmlBeanFactory:
public XmlBeanFactory(Resource resource) throws BeansException {
this(resource, (BeanFactory)null);
}
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);//核心1
this.reader = new XmlBeanDefinitionReader(this);
this.reader.loadBeanDefinitions(resource);//核心2
}
根据上述的核心1方法super()继续跟踪有一个ignoreDependencyInterface方法:
public