二Spring框架--1重要组件类
二Spring框架--1重要组件类
二 spring组件类
2.0 spring体系结构
spring是模块化的,提供了20个模块,根据程序要求使用,允许选择适用的模块引入项目。
2.0.1 核心容器-core container
1)spring-core:提供了框架的基本组成部分,包括IOC和依赖注入;
2)spring-beans:提供beanFactory,工厂模式的实现,不再需要通过编码创建单例对象,可以把配置和依赖从编码逻辑中解耦;
3)context:建立在core和beans之上,使用类似于JNDI注册的方式访问对象。context模块继承自beans模块,添加了资源加载、事件传播、透明地创建上下文(如通过servlet容器自动创建)等。applicationContext是context的焦点。
4)spring-context-support 提供了对第三方集成到 Spring 上下文的支持,比如缓存(EhCache, Guava, JCache)、邮件(JavaMail)、调度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等
完整依赖关系如下:
2.0.2 数据访问、集成
1)JDBC——java data base connectivity
模块提供了 JDBC 抽象层,它消除了冗长的 JDBC 编码和对数据库供应商特定错误代码的解析。解决了针对不同数据库供应商的连接问题。
2)ORM——object relational mapping
模块提供了对流行的对象关系映射 API 的集成,包括 JPA、JDO 和 Hibernate 等。通过此模块可以让这些 ORM 框架和 spring的其它功能整合,比如前面提及的事务管理。
提供了Java对象与数据库表内的关系映射功能。
- OXM——object xml mapping
模块提供了对 OXM 实现的支持。解决了object与xml的映射关系
- JMS——Java message service
模块包括了生产和消费消息功能,produce和consume。
- transaction
模块对特殊接口类和所有POJO支持编程式和声明式事务的管理。
2.0.3 web
1)web
该模块提供面向web开发的基本功能和面向web的应用上下文(webApplicationContext),如文件上传、servlet监听器初始化IOC容器等,以及HTTP客户端以及spring远程调用中与web相关的部分
2)Web-MVC
模块为 web 应用提供了模型视图控制(MVC)和 REST Web服务的实现。Spring 的 MVC 框架可以使领域模型代码和 web 表单完全地分离,且可以与 Spring 框架的其它所有功能进行集成。
3)Web-socket
模块为 WebSocket-based 提供了支持,而且在 web 应用程序中提供了客户端和服务器端之间通信的两种方式
4)web-portlet
略
2.0.4 其他
1)AOP
模块提供了面向方面(切面)的编程实现,允许定义方法拦截器和切入点对代码进行解耦,从而使实现功能的代码彻底的解耦出来;
2)Aspects
模块提供与aspectj的集成,是成熟且功能强大的aop框架
3)instrumentation
提供了类加载器的实现
4)Messaging
5)test
支持对具有Junit框架的spring组件的测试。
2.4 BeanDefinition
定义了BeanDefinition相关属性的set、get方法。具体的属性定义在AbstractBeanDefinition中
public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
implements BeanDefinition, Cloneable {
private volatile Object beanClass;
@Nullable
private String initMethodName;
@Nullable
private String destroyMethodName;
@Nullable
private Boolean lazyInit;
2.5 BeanDefinitionRegistry
该类作为registry,负责BeanDefinition的注册管理相关的方法,包括register、remove、get、contains等方法。
2.6 BeanDefinitionReader
作为接口,定义了加载inputStream的操作,来加载BeanDefinition。
同时,其内定义了对于属性的get、set方法。包括[BeanDefinitionRegistry](#2.5 BeanDefinitionRegistry)、[ResourceLoader](#2.8 ResourceLoader)、beanclassloader(就是类加载器)、Enviroment
2.7 Enviroment
2.8 Resourceloader
//配置文件的地址,加载resource的加载器
public interface ResourceLoader {
String CLASSPATH_URL_PREFIX = "classpath:";
//获取配置文件spring.xml对应的resource对象
Resource getResource(String var1);
@Nullable
ClassLoader getClassLoader();
}
该实例为BeanDefinitionReader内属性,reader通过resourceLoader或者ResourcePatternResolver来通过location加载得到[resource](#2.14 Resources)(为配置xml对应的resource)。
2.9 ResourcePatternResolver
继承关系:
可知,applicationContext是继承类。且ResourcePatternResolver是ResourceLoader的继承接口。
2.10 EntityResolver
public interface EntityResolver {
public abstract InputSource resolveEntity (String publicId, String systemId)
throws SAXException, IOException;
}
2.11 ParserContext
public final class ParserContext {
private final XmlReaderContext readerContext;
private final BeanDefinitionParserDelegate delegate;
@Nullable
private BeanDefinition containingBeanDefinition;
private final Deque<CompositeComponentDefinition> containingComponents = new ArrayDeque<>();
该上下文沿着bean解析过程传递,封装了所有相关的配置和状态。
其内有属性XmlReaderContext。
2.12 ReaderContext
public class XmlReaderContext extends ReaderContext {
private final XmlBeanDefinitionReader reader;
//定位spring.handlers中namespaceURI对应的NamespaceHandler对象
private final NamespaceHandlerResolver namespaceHandlerResolver;
//获取reader内的BeanDefinitionRegistry
public final BeanDefinitionRegistry getRegistry() {
return this.reader.getRegistry();
}
public final ResourceLoader getResourceLoader() {
return this.reader.getResourceLoader();
}
public final Environment getEnvironment() {
return this.reader.getEnvironment();
}
该上下文沿着bean definition读取过程传递,封装了所有相关的配置和状态。
该readerContext内有两个属性,使得该context特定与XmlBeanDefinitionReader一起使用。并且提供对配置在XmlBeanDefinitionReader内的NamespaceHandlerResolver的获取和使用。
readercontext上下文封装了XmlBeanDefinitionReader,并能够获取到BeanDefinitionRegistry,在注册beandefinition时使用。
2.13 BeanDefinitionParserDelegate
用于解析 XML bean definition的有状态委托类。旨在供主解析器和任何扩展 {@link BeanDefinitionParser BeanDefinitionParsers} 或 {@link BeanDefinitionDecorator BeanDefinitionDecorators} 使用。
public class BeanDefinitionParserDelegate {
public static final String BEANS_NAMESPACE_URI = "http://www.springframework.org/schema/beans";
private final XmlReaderContext readerContext;
其内有属性xmlReaderContext。
2.14 BeanDefinitionParser
public interface BeanDefinitionParser {
/**
* Parse the specified {@link Element} and register the resulting
* {@link BeanDefinition BeanDefinition(s)} with the
* {@link org.springframework.beans.factory.xml.ParserContext#getRegistry() BeanDefinitionRegistry}
* embedded in the supplied {@link ParserContext}.
*
* @param element the element that is to be parsed into one or more {@link BeanDefinition BeanDefinitions}
* @param parserContext the object encapsulating the current state of the parsing process;
* provides access to a {@link org.springframework.beans.factory.support.BeanDefinitionRegistry}
* @return the primary {@link BeanDefinition}
*/
BeanDefinition parse(Element element, ParserContext parserContext);
}
parse方法,解析element,得到的beandefinition,注册入parser.getRegistry的beandefinitionregistry注册器中。
2.15后置处理器postProcessor
见3.2.2 后置处理器埋点设计
2.17 Resources
public interface Resource extends InputStreamSource {
boolean exists();
default boolean isReadable() {
return this.exists();
}
default boolean isOpen() {
return false;
}
default boolean isFile() {
return false;
}
URL getURL() throws IOException;
URI getURI() throws IOException;
File getFile() throws IOException;
resource为 InputStreamSource文件流。
2.14.1 EncodedResource
public class EncodedResource implements InputStreamSource {
private final Resource resource;
@Nullable
private final String encoding;
@Nullable
private final Charset charset;
resource添加了编码格式charset和编码encoding。
2.15 ResourceBundle
ResourceBundle这个类是用来读取classpath中文件,这个文件需要放在resources文件夹或java包的根路径下,文件名必须是*.properties这个配置文件类型。这样读取到的文件流就形成了键值对的存储形式。配置文件的示例如下(使用键值对的方式配置):
#service instance
foodTypeService=service.impl.FoodTypeService
dinnerTableService=service.impl.DinnerTableService
注意,配置文件中配置的需是接口的实现类,因为在工厂创建Bean的时候我们是使用接口来接收实现类的,这样才能够实现解耦合。
调用时候:
protected IDinnerTableService dinnerTableService = BeanFactory.getInstance("dinnerTableService",IDinnerTableService.class);
2.16 Document
接口代表整个 HTML 或 XML 文档。从概念上讲,它是文档树的根,提供对文档数据的主要访问。
2.19 Spring实例化过程相关操作类
1 BeanWrapper
是spring操作javabean的工具类,通过BeanWrapper可以直接修改bean的属性。其底层实现是反射。
BeanWrapper的使用如下:
Person person = new Person();
//创建对象的包装类
BeanWrapper beanWrapper = PropertyAccessorFactory.forBeanPropertyAccess(person);
//设置属性对应的值的property:value对
beanWrapper.setPropertyValue("name", "lbb");
beanWrapper.setPropertyValue("idCardNo", "1515151515");
beanWrapper.setPropertyValue("age", 11);
2 PropertyValues
PropertyValues有一个实现类MutablePropertyValues,其可以和BeanWrapper配合使用,来完成对象属性的赋值操作。
PropertyValues在spring中主要负责存储配置文件中定义的关于bean的属性,values包含一个或多个PropertyValues对象,这是个key-value形式的对象。
PropertyValues使用如下:
//创建MutablePropertyValues
MutablePropertyValues propertyValues = new MutablePropertyValues();
//设置key-value的属性值
propertyValues.addPropertyValue("name", "lbb");
propertyValues.addPropertyValue("idCardNo", "1515151515");
propertyValues.addPropertyValue("age", 11);
Person person = new Person();
//创建bean对应的包装类
BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(person);
//通过propertyValues设置wrapper的属性
wrapper.setPropertyValues(propertyValues);
3 PropertyDescriptor
属性描述符,描述的是bean对象内关于属性的所有信息,包括setter、getter方法。可以通过PropertyDescriptor来获取bean内属性的get、set方法。getReadMethod获取的是getter方法;getWriteMethod获取的是setter方法。
PropertyDescriptor使用如下:
Person person = new Person();
//创建Person.class类的属性name的属性描述符
PropertyDescriptor propertyDescriptor = new PropertyDescriptor("name", Person.class);
//获取name属性的getter方法
Method readMethod = propertyDescriptor.getReadMethod();
//获取name属性的setter方法
Method writeMethod = propertyDescriptor.getWriteMethod();
//调用setter方法,设置name属性值
writeMethod.invoke(person, "lbb");
String name = (String) readMethod.invoke(person);