二Spring框架--1重要组件类

二Spring框架--1重要组件类

二 spring组件类

2.0 spring体系结构

spring是模块化的,提供了20个模块,根据程序要求使用,允许选择适用的模块引入项目。

Spring 体系结构

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)等

完整依赖关系如下:

Spring 体系结构

2.0.2 数据访问、集成

1)JDBC——java data base connectivity

模块提供了 JDBC 抽象层,它消除了冗长的 JDBC 编码和对数据库供应商特定错误代码的解析。解决了针对不同数据库供应商的连接问题。

2)ORM——object relational mapping

模块提供了对流行的对象关系映射 API 的集成,包括 JPA、JDO 和 Hibernate 等。通过此模块可以让这些 ORM 框架和 spring的其它功能整合,比如前面提及的事务管理。

提供了Java对象与数据库表内的关系映射功能。

  1. OXM——object xml mapping

模块提供了对 OXM 实现的支持。解决了object与xml的映射关系

  1. JMS——Java message service

模块包括了生产和消费消息功能,produce和consume。

  1. 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;
     

image-20220319010634961

2.5 BeanDefinitionRegistry

image-20220309211612904

该类作为registry,负责BeanDefinition的注册管理相关的方法,包括register、remove、get、contains等方法。

2.6 BeanDefinitionReader

作为接口,定义了加载inputStream的操作,来加载BeanDefinition。

image-20220309213523336

同时,其内定义了对于属性的get、set方法。包括[BeanDefinitionRegistry](#2.5 BeanDefinitionRegistry)、[ResourceLoader](#2.8 ResourceLoader)、beanclassloader(就是类加载器)、Enviroment

image-20220317113730906

2.7 Enviroment

image-20230309164854104

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)。

image-20220317120558953

2.9 ResourcePatternResolver

继承关系:

image-20230309165054689

可知,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解析过程传递,封装了所有相关的配置和状态。

image-20230309165144738

其内有属性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

image-20210728062914136
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);
posted @ 2023-03-09 17:09  LeasonXue  阅读(72)  评论(0编辑  收藏  举报