Showing preview only (2,888K chars total). Download the full file or copy to clipboard to get everything.
Repository: seaswalker/spring-analysis
Branch: master
Commit: 4379cce848af
Files: 59
Total size: 2.7 MB
Directory structure:
gitextract_ordn1vgh/
├── .gitignore
├── README.md
├── note/
│ ├── Spring.md
│ ├── Spring.uml
│ ├── flows/
│ │ ├── guava-cache.vsdx
│ │ ├── spring-task.vsdx
│ │ └── spring_application_run.gliffy
│ ├── guava-cache.md
│ ├── guava-cache.uml
│ ├── spring-aop.md
│ ├── spring-boot.md
│ ├── spring-boot.uml
│ ├── spring-context.md
│ ├── spring-mvc.md
│ ├── spring-mvc.uml
│ ├── spring-task.md
│ ├── spring-transaction.md
│ └── spring-transaction.uml
├── pom.xml
└── src/
└── main/
├── java/
│ ├── annotation/
│ │ └── Init.java
│ ├── aop/
│ │ ├── Bootstrap.java
│ │ ├── SimpleAopBean.java
│ │ ├── SimpleChildAopBean.java
│ │ └── SimpleMethodInterceptor.java
│ ├── base/
│ │ ├── BaseStudent.java
│ │ ├── Boostrap.java
│ │ ├── SimpleBean.java
│ │ ├── SimpleBeanFactoryPostProcessor.java
│ │ ├── SimpleBeanPostProcessor.java
│ │ ├── Student.java
│ │ ├── aop/
│ │ │ ├── AopDemo.java
│ │ │ ├── AopDemoAdvice.java
│ │ │ ├── AopDemoInter.java
│ │ │ └── annotation/
│ │ │ └── AspectDemo.java
│ │ ├── scope/
│ │ │ └── OneScope.java
│ │ └── transaction/
│ │ ├── NestedBean.java
│ │ └── TransactionBean.java
│ ├── cache/
│ │ └── CacheDemo.java
│ ├── controller/
│ │ └── SimpleController.java
│ ├── java_config/
│ │ ├── Bootrap.java
│ │ ├── SimpleBeanConfig.java
│ │ └── StudentConfig.java
│ ├── local/
│ │ └── Local.java
│ ├── model/
│ │ └── SimpleModel.java
│ ├── task/
│ │ └── Task.java
│ ├── test/
│ │ ├── JavaTest.java
│ │ └── proxy/
│ │ ├── Handler.java
│ │ ├── JDKProxy.java
│ │ ├── UserService.java
│ │ └── UserServiceImpl.java
│ └── validator/
│ └── SimpleModelValidator.java
├── resources/
│ ├── config.xml
│ ├── property.properties
│ ├── resource/
│ │ ├── resource_en_US.properties
│ │ └── resource_zh_CN.properties
│ └── spring-servlet.xml
└── webapp/
├── WEB-INF/
│ ├── echo.jsp
│ └── web.xml
└── index.jsp
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
*.class
target/
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.ear
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
/.idea/
/spring.iml
================================================
FILE: README.md
================================================
# Spring
Spring相关组件阅读笔记.
# 传送门
- [spring-core](https://github.com/seaswalker/Spring/blob/master/note/Spring.md)
- [spring-aop](https://github.com/seaswalker/Spring/blob/master/note/spring-aop.md)
- [spring-context](https://github.com/seaswalker/Spring/blob/master/note/spring-context.md)
- [spring-task](https://github.com/seaswalker/Spring/blob/master/note/spring-task.md)
- [spring-transaction](https://github.com/seaswalker/Spring/blob/master/note/spring-transaction.md)
- [spring-mvc](https://github.com/seaswalker/Spring/blob/master/note/spring-mvc.md)
- [guava-cache](https://github.com/seaswalker/Spring/blob/master/note/guava-cache.md)
================================================
FILE: note/Spring.md
================================================
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*
- [基本](#%E5%9F%BA%E6%9C%AC)
- [ClassPathXmlApplicationContext](#classpathxmlapplicationcontext)
- [构造器](#%E6%9E%84%E9%80%A0%E5%99%A8)
- [设置配置文件路径](#%E8%AE%BE%E7%BD%AE%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84)
- [Environment接口](#environment%E6%8E%A5%E5%8F%A3)
- [Profile](#profile)
- [Property](#property)
- [Environment构造器](#environment%E6%9E%84%E9%80%A0%E5%99%A8)
- [PropertySources接口](#propertysources%E6%8E%A5%E5%8F%A3)
- [PropertySource接口](#propertysource%E6%8E%A5%E5%8F%A3)
- [路径Placeholder处理](#%E8%B7%AF%E5%BE%84placeholder%E5%A4%84%E7%90%86)
- [PropertyResolver接口](#propertyresolver%E6%8E%A5%E5%8F%A3)
- [解析](#%E8%A7%A3%E6%9E%90)
- [refresh](#refresh)
- [prepareRefresh](#preparerefresh)
- [属性校验](#%E5%B1%9E%E6%80%A7%E6%A0%A1%E9%AA%8C)
- [BeanFactory创建](#beanfactory%E5%88%9B%E5%BB%BA)
- [BeanFactory接口](#beanfactory%E6%8E%A5%E5%8F%A3)
- [BeanFactory定制](#beanfactory%E5%AE%9A%E5%88%B6)
- [Bean加载](#bean%E5%8A%A0%E8%BD%BD)
- [EntityResolver](#entityresolver)
- [BeanDefinitionReader](#beandefinitionreader)
- [路径解析(Ant)](#%E8%B7%AF%E5%BE%84%E8%A7%A3%E6%9E%90ant)
- [配置文件加载](#%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD)
- [Bean解析](#bean%E8%A7%A3%E6%9E%90)
- [默认命名空间解析](#%E9%BB%98%E8%AE%A4%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E8%A7%A3%E6%9E%90)
- [import](#import)
- [alias](#alias)
- [bean](#bean)
- [id & name处理](#id--name%E5%A4%84%E7%90%86)
- [beanName生成](#beanname%E7%94%9F%E6%88%90)
- [bean解析](#bean%E8%A7%A3%E6%9E%90)
- [Bean装饰](#bean%E8%A3%85%E9%A5%B0)
- [Bean注册](#bean%E6%B3%A8%E5%86%8C)
- [BeanDefiniton数据结构](#beandefiniton%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84)
- [beans](#beans)
- [其它命名空间解析](#%E5%85%B6%E5%AE%83%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E8%A7%A3%E6%9E%90)
- [NamespaceHandler继承体系](#namespacehandler%E7%BB%A7%E6%89%BF%E4%BD%93%E7%B3%BB)
- [init](#init)
- [BeanFactory数据结构](#beanfactory%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84)
- [prepareBeanFactory](#preparebeanfactory)
- [BeanExpressionResolver](#beanexpressionresolver)
- [PropertyEditorRegistrar](#propertyeditorregistrar)
- [环境注入](#%E7%8E%AF%E5%A2%83%E6%B3%A8%E5%85%A5)
- [依赖解析忽略](#%E4%BE%9D%E8%B5%96%E8%A7%A3%E6%9E%90%E5%BF%BD%E7%95%A5)
- [bean伪装](#bean%E4%BC%AA%E8%A3%85)
- [LoadTimeWeaver](#loadtimeweaver)
- [注册环境](#%E6%B3%A8%E5%86%8C%E7%8E%AF%E5%A2%83)
- [postProcessBeanFactory](#postprocessbeanfactory)
- [invokeBeanFactoryPostProcessors](#invokebeanfactorypostprocessors)
- [BeanPostProcessor注册](#beanpostprocessor%E6%B3%A8%E5%86%8C)
- [MessageSource](#messagesource)
- [事件驱动](#%E4%BA%8B%E4%BB%B6%E9%A9%B1%E5%8A%A8)
- [事件](#%E4%BA%8B%E4%BB%B6)
- [发布者](#%E5%8F%91%E5%B8%83%E8%80%85)
- [ApplicationEventPublisher](#applicationeventpublisher)
- [ApplicationEventMulticaster](#applicationeventmulticaster)
- [监听器](#%E7%9B%91%E5%90%AC%E5%99%A8)
- [初始化](#%E5%88%9D%E5%A7%8B%E5%8C%96)
- [事件发布](#%E4%BA%8B%E4%BB%B6%E5%8F%91%E5%B8%83)
- [监听器获取](#%E7%9B%91%E5%90%AC%E5%99%A8%E8%8E%B7%E5%8F%96)
- [同步/异步](#%E5%90%8C%E6%AD%A5%E5%BC%82%E6%AD%A5)
- [全局](#%E5%85%A8%E5%B1%80)
- [注解](#%E6%B3%A8%E8%A7%A3)
- [onRefresh](#onrefresh)
- [ApplicationListener注册](#applicationlistener%E6%B3%A8%E5%86%8C)
- [singleton初始化](#singleton%E5%88%9D%E5%A7%8B%E5%8C%96)
- [ConversionService](#conversionservice)
- [StringValueResolver](#stringvalueresolver)
- [LoadTimeWeaverAware](#loadtimeweaveraware)
- [初始化](#%E5%88%9D%E5%A7%8B%E5%8C%96-1)
- [getBean](#getbean)
- [beanName转化](#beanname%E8%BD%AC%E5%8C%96)
- [手动注册bean检测](#%E6%89%8B%E5%8A%A8%E6%B3%A8%E5%86%8Cbean%E6%A3%80%E6%B5%8B)
- [检查父容器](#%E6%A3%80%E6%9F%A5%E7%88%B6%E5%AE%B9%E5%99%A8)
- [依赖初始化](#%E4%BE%9D%E8%B5%96%E5%88%9D%E5%A7%8B%E5%8C%96)
- [Singleton初始化](#singleton%E5%88%9D%E5%A7%8B%E5%8C%96)
- [getSingleton方法](#getsingleton%E6%96%B9%E6%B3%95)
- [是否存在](#%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8)
- [bean创建](#bean%E5%88%9B%E5%BB%BA)
- [lookup-method检测](#lookup-method%E6%A3%80%E6%B5%8B)
- [InstantiationAwareBeanPostProcessor触发](#instantiationawarebeanpostprocessor%E8%A7%A6%E5%8F%91)
- [doCreateBean](#docreatebean)
- [创建(createBeanInstance)](#%E5%88%9B%E5%BB%BAcreatebeaninstance)
- [MergedBeanDefinitionPostProcessor](#mergedbeandefinitionpostprocessor)
- [属性解析](#%E5%B1%9E%E6%80%A7%E8%A7%A3%E6%9E%90)
- [属性设置](#%E5%B1%9E%E6%80%A7%E8%AE%BE%E7%BD%AE)
- [初始化](#%E5%88%9D%E5%A7%8B%E5%8C%96-2)
- [getObjectForBeanInstance](#getobjectforbeaninstance)
- [Prototype初始化](#prototype%E5%88%9D%E5%A7%8B%E5%8C%96)
- [beforePrototypeCreation](#beforeprototypecreation)
- [createBean](#createbean)
- [afterPrototypeCreation](#afterprototypecreation)
- [总结](#%E6%80%BB%E7%BB%93)
- [其它Scope初始化](#%E5%85%B6%E5%AE%83scope%E5%88%9D%E5%A7%8B%E5%8C%96)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
# 基本
本部分从最基本的Spring开始。配置文件:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean class="base.SimpleBean"></bean>
</beans>
```
启动代码:
```java
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
SimpleBean bean = context.getBean(SimpleBean.class);
bean.send();
context.close();
}
```
SimpleBean:
```java
public class SimpleBean {
public void send() {
System.out.println("I am send method from SimpleBean!");
}
}
```
## ClassPathXmlApplicationContext
整个继承体系如下:

ResourceLoader代表了**加载资源的一种方式,正是策略模式的实现**。
构造器源码:
```java
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) {
//null
super(parent);
setConfigLocations(configLocations);
//默认true
if (refresh) {
refresh();
}
}
```
### 构造器
首先看父类构造器,沿着继承体系一直向上调用,直到AbstractApplicationContext:
```java
public AbstractApplicationContext(ApplicationContext parent) {
this();
setParent(parent);
}
public AbstractApplicationContext() {
this.resourcePatternResolver = getResourcePatternResolver();
}
```
getResourcePatternResolver:
```java
protected ResourcePatternResolver getResourcePatternResolver() {
return new PathMatchingResourcePatternResolver(this);
}
```
PathMatchingResourcePatternResolver支持Ant风格的路径解析。
### 设置配置文件路径
即AbstractRefreshableConfigApplicationContext.setConfigLocations:
```java
public void setConfigLocations(String... locations) {
if (locations != null) {
Assert.noNullElements(locations, "Config locations must not be null");
this.configLocations = new String[locations.length];
for (int i = 0; i < locations.length; i++) {
this.configLocations[i] = resolvePath(locations[i]).trim();
}
} else {
this.configLocations = null;
}
}
```
resolvePath:
```java
protected String resolvePath(String path) {
return getEnvironment().resolveRequiredPlaceholders(path);
}
```
此方法的目的在于将占位符(placeholder)解析成实际的地址。比如可以这么写: `new ClassPathXmlApplicationContext("classpath:config.xml");`那么classpath:就是需要被解析的。
getEnvironment方法来自于ConfigurableApplicationContext接口,源码很简单,如果为空就调用createEnvironment创建一个。AbstractApplicationContext.createEnvironment:
```java
protected ConfigurableEnvironment createEnvironment() {
return new StandardEnvironment();
}
```
#### Environment接口
继承体系:

Environmen接口**代表了当前应用所处的环境。** 从此接口的方法可以看出,其主要和profile、Property相关。
##### Profile
Spring Profile特性是从3.1开始的,其主要是为了解决这样一种问题: 线上环境和测试环境使用不同的配置或是数据库或是其它。有了Profile便可以在 不同环境之间无缝切换。**Spring容器管理的所有bean都是和一个profile绑定在一起的。** 使用了Profile的配置文件示例:
```xml
<beans profile="develop">
<context:property-placeholder location="classpath*:jdbc-develop.properties"/>
</beans>
<beans profile="production">
<context:property-placeholder location="classpath*:jdbc-production.properties"/>
</beans>
<beans profile="test">
<context:property-placeholder location="classpath*:jdbc-test.properties"/>
</beans>
```
在启动代码中可以用如下代码设置活跃(当前使用的)Profile:
```java
context.getEnvironment().setActiveProfiles("dev");
```
当然使用的方式还有很多(比如注解),参考:
[spring3.1 profile 配置不同的环境](http://radiumxie.iteye.com/blog/1851919)
[Spring Profiles example](http://www.mkyong.com/spring/spring-profiles-example/)
##### Property
这里的Property指的是程序运行时的一些参数,引用注释:
> > properties files, JVM system properties, system environment variables, JNDI, servlet context parameters, ad-hoc Properties objects,Maps, and so on.
#### Environment构造器
```java
private final MutablePropertySources propertySources = new MutablePropertySources(this.logger);
public AbstractEnvironment() {
customizePropertySources(this.propertySources);
}
```
##### PropertySources接口
继承体系:

此接口实际上是PropertySource的容器,默认的MutablePropertySources实现内部含有一个CopyOnWriteArrayList作为存储载体。
StandardEnvironment.customizePropertySources:
```java
/** System environment property source name: {@value} */
public static final String SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME = "systemEnvironment";
/** JVM system properties property source name: {@value} */
public static final String SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME = "systemProperties";
@Override
protected void customizePropertySources(MutablePropertySources propertySources) {
propertySources.addLast(new MapPropertySource
(SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, getSystemProperties()));
propertySources.addLast(new SystemEnvironmentPropertySource
(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, getSystemEnvironment()));
}
```
##### PropertySource接口
PropertySource接口代表了键值对的Property来源。继承体系:

AbstractEnvironment.getSystemProperties:
```java
@Override
public Map<String, Object> getSystemProperties() {
try {
return (Map) System.getProperties();
}
catch (AccessControlException ex) {
return (Map) new ReadOnlySystemAttributesMap() {
@Override
protected String getSystemAttribute(String attributeName) {
try {
return System.getProperty(attributeName);
}
catch (AccessControlException ex) {
if (logger.isInfoEnabled()) {
logger.info(format("Caught AccessControlException when accessing system " +
"property [%s]; its value will be returned [null]. Reason: %s",
attributeName, ex.getMessage()));
}
return null;
}
}
};
}
}
```
这里的实现很有意思,如果安全管理器阻止获取全部的系统属性,那么会尝试获取单个属性的可能性,如果还不行就抛异常了。
getSystemEnvironment方法也是一个套路,不过最终调用的是System.getenv,可以获取jvm和OS的一些版本信息。
#### 路径Placeholder处理
AbstractEnvironment.resolveRequiredPlaceholders:
```java
@Override
public String resolveRequiredPlaceholders(String text) throws IllegalArgumentException {
//text即配置文件路径,比如classpath:config.xml
return this.propertyResolver.resolveRequiredPlaceholders(text);
}
```
propertyResolver是一个PropertySourcesPropertyResolver对象:
```java
private final ConfigurablePropertyResolver propertyResolver =
new PropertySourcesPropertyResolver(this.propertySources);
```
##### PropertyResolver接口
PropertyResolver继承体系(排除Environment分支):

此接口正是用来解析PropertyResource。
##### 解析
AbstractPropertyResolver.resolveRequiredPlaceholders:
```java
@Override
public String resolveRequiredPlaceholders(String text) throws IllegalArgumentException {
if (this.strictHelper == null) {
this.strictHelper = createPlaceholderHelper(false);
}
return doResolvePlaceholders(text, this.strictHelper);
}
```
```java
private PropertyPlaceholderHelper createPlaceholderHelper(boolean ignoreUnresolvablePlaceholders) {
//三个参数分别是${, }, :
return new PropertyPlaceholderHelper(this.placeholderPrefix, this.placeholderSuffix,
this.valueSeparator, ignoreUnresolvablePlaceholders);
}
```
doResolvePlaceholders:
```java
private String doResolvePlaceholders(String text, PropertyPlaceholderHelper helper) {
//PlaceholderResolver接口依然是策略模式的体现
return helper.replacePlaceholders(text, new PropertyPlaceholderHelper.PlaceholderResolver() {
@Override
public String resolvePlaceholder(String placeholderName) {
return getPropertyAsRawString(placeholderName);
}
});
}
```
其实代码执行到这里的时候还没有进行xml配置文件的解析,那么这里的解析placeHolder是什么意思呢,原因在于可以这么写:
```java
System.setProperty("spring", "classpath");
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("${spring}:config.xml");
SimpleBean bean = context.getBean(SimpleBean.class);
```
这样就可以正确解析。placeholder的替换其实就是字符串操作,这里只说一下正确的属性是怎么来的。实现的关键在于PropertySourcesPropertyResolver.getProperty:
```java
@Override
protected String getPropertyAsRawString(String key) {
return getProperty(key, String.class, false);
}
protected <T> T getProperty(String key, Class<T> targetValueType, boolean resolveNestedPlaceholders) {
if (this.propertySources != null) {
for (PropertySource<?> propertySource : this.propertySources) {
Object value = propertySource.getProperty(key);
return value;
}
}
return null;
}
```
很明显了,就是从System.getProperty和System.getenv获取,但是由于环境变量是无法自定义的,所以其实此处只能通过System.setProperty指定。
注意,classpath:XXX这种写法的classpath前缀到目前为止还没有被处理。
## refresh
Spring bean解析就在此方法,所以单独提出来。
AbstractApplicationContext.refresh:
```java
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
} catch (BeansException ex) {
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
} finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
}
}
}
```
### prepareRefresh
```java
protected void prepareRefresh() {
this.startupDate = System.currentTimeMillis();
this.closed.set(false);
this.active.set(true);
// Initialize any placeholder property sources in the context environment
//空实现
initPropertySources();
// Validate that all properties marked as required are resolvable
// see ConfigurablePropertyResolver#setRequiredProperties
getEnvironment().validateRequiredProperties();
// Allow for the collection of early ApplicationEvents,
// to be published once the multicaster is available...
this.earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>();
}
```
#### 属性校验
AbstractEnvironment.validateRequiredProperties:
```java
@Override
public void validateRequiredProperties() throws MissingRequiredPropertiesException {
this.propertyResolver.validateRequiredProperties();
}
```
AbstractPropertyResolver.validateRequiredProperties:
```java
@Override
public void validateRequiredProperties() {
MissingRequiredPropertiesException ex = new MissingRequiredPropertiesException();
for (String key : this.requiredProperties) {
if (this.getProperty(key) == null) {
ex.addMissingRequiredProperty(key);
}
}
if (!ex.getMissingRequiredProperties().isEmpty()) {
throw ex;
}
}
```
requiredProperties是通过setRequiredProperties方法设置的,保存在一个list里面,默认是空的,也就是不需要校验任何属性。
### BeanFactory创建
由obtainFreshBeanFactory调用AbstractRefreshableApplicationContext.refreshBeanFactory:
```java
@Override
protected final void refreshBeanFactory() throws BeansException {
//如果已经存在,那么销毁之前的
if (hasBeanFactory()) {
destroyBeans();
closeBeanFactory();
}
//创建了一个DefaultListableBeanFactory对象
DefaultListableBeanFactory beanFactory = createBeanFactory();
beanFactory.setSerializationId(getId());
customizeBeanFactory(beanFactory);
loadBeanDefinitions(beanFactory);
synchronized (this.beanFactoryMonitor) {
this.beanFactory = beanFactory;
}
}
```
#### BeanFactory接口
此接口实际上就是Bean容器,其继承体系:

#### BeanFactory定制
AbstractRefreshableApplicationContext.customizeBeanFactory方法用于给子类提供一个自由配置的机会,默认实现:
```java
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
if (this.allowBeanDefinitionOverriding != null) {
//默认false,不允许覆盖
beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
}
if (this.allowCircularReferences != null) {
//默认false,不允许循环引用
beanFactory.setAllowCircularReferences(this.allowCircularReferences);
}
}
```
#### Bean加载
AbstractXmlApplicationContext.loadBeanDefinitions,这个便是核心的bean加载了:
```java
@Override
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) {
// Create a new XmlBeanDefinitionReader for the given BeanFactory.
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
// Configure the bean definition reader with this context's
// resource loading environment.
beanDefinitionReader.setEnvironment(this.getEnvironment());
beanDefinitionReader.setResourceLoader(this);
beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
// Allow a subclass to provide custom initialization of the reader,
// then proceed with actually loading the bean definitions.
//默认空实现
initBeanDefinitionReader(beanDefinitionReader);
loadBeanDefinitions(beanDefinitionReader);
}
```
##### EntityResolver
此处只说明用到的部分继承体系:

EntityResolver接口在org.xml.sax中定义。DelegatingEntityResolver用于schema和dtd的解析。
##### BeanDefinitionReader
继承体系:

##### 路径解析(Ant)
```java
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) {
Resource[] configResources = getConfigResources();
if (configResources != null) {
reader.loadBeanDefinitions(configResources);
}
String[] configLocations = getConfigLocations();
//here
if (configLocations != null) {
reader.loadBeanDefinitions(configLocations);
}
}
```
AbstractBeanDefinitionReader.loadBeanDefinitions:
```java
@Override
public int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException {
Assert.notNull(locations, "Location array must not be null");
int counter = 0;
for (String location : locations) {
counter += loadBeanDefinitions(location);
}
return counter;
}
```
之后调用:
```java
//第二个参数为空
public int loadBeanDefinitions(String location, Set<Resource> actualResources) {
ResourceLoader resourceLoader = getResourceLoader();
//参见ResourceLoader类图,ClassPathXmlApplicationContext实现了此接口
if (resourceLoader instanceof ResourcePatternResolver) {
// Resource pattern matching available.
try {
Resource[] resources = ((ResourcePatternResolver) resourceLoader).getResources(location);
int loadCount = loadBeanDefinitions(resources);
if (actualResources != null) {
for (Resource resource : resources) {
actualResources.add(resource);
}
}
return loadCount;
}
catch (IOException ex) {
throw new BeanDefinitionStoreException(
"Could not resolve bean definition resource pattern [" + location + "]", ex);
}
}
else {
// Can only load single resources by absolute URL.
Resource resource = resourceLoader.getResource(location);
int loadCount = loadBeanDefinitions(resource);
if (actualResources != null) {
actualResources.add(resource);
}
return loadCount;
}
}
```
getResource的实现在AbstractApplicationContext:
```java
@Override
public Resource[] getResources(String locationPattern) throws IOException {
//构造器中初始化,PathMatchingResourcePatternResolver对象
return this.resourcePatternResolver.getResources(locationPattern);
}
```
PathMatchingResourcePatternResolver是ResourceLoader继承体系的一部分。
```java
@Override
public Resource[] getResources(String locationPattern) throws IOException {
Assert.notNull(locationPattern, "Location pattern must not be null");
//classpath:
if (locationPattern.startsWith(CLASSPATH_ALL_URL_PREFIX)) {
// a class path resource (multiple resources for same name possible)
//matcher是一个AntPathMatcher对象
if (getPathMatcher().isPattern(locationPattern
.substring(CLASSPATH_ALL_URL_PREFIX.length()))) {
// a class path resource pattern
return findPathMatchingResources(locationPattern);
} else {
// all class path resources with the given name
return findAllClassPathResources(locationPattern
.substring(CLASSPATH_ALL_URL_PREFIX.length()));
}
} else {
// Only look for a pattern after a prefix here
// (to not get fooled by a pattern symbol in a strange prefix).
int prefixEnd = locationPattern.indexOf(":") + 1;
if (getPathMatcher().isPattern(locationPattern.substring(prefixEnd))) {
// a file pattern
return findPathMatchingResources(locationPattern);
}
else {
// a single resource with the given name
return new Resource[] {getResourceLoader().getResource(locationPattern)};
}
}
}
```
isPattern:
```java
@Override
public boolean isPattern(String path) {
return (path.indexOf('*') != -1 || path.indexOf('?') != -1);
}
```
可以看出配置文件路径是支持ant风格的,也就是可以这么写:
```java
new ClassPathXmlApplicationContext("con*.xml");
```
具体怎么解析ant风格的就不写了。
##### 配置文件加载
入口方法在AbstractBeanDefinitionReader的217行:
```java
//加载
Resource[] resources = ((ResourcePatternResolver) resourceLoader).getResources(location);
//解析
int loadCount = loadBeanDefinitions(resources);
```
最终逐个调用XmlBeanDefinitionReader的loadBeanDefinitions方法:
```java
@Override
public int loadBeanDefinitions(Resource resource) {
return loadBeanDefinitions(new EncodedResource(resource));
}
```
Resource是代表一种资源的接口,其类图:

EncodedResource扮演的其实是一个装饰器的模式,为InputStreamSource添加了字符编码(虽然默认为null)。这样为我们自定义xml配置文件的编码方式提供了机会。
之后关键的源码只有两行:
```java
public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
InputStream inputStream = encodedResource.getResource().getInputStream();
InputSource inputSource = new InputSource(inputStream);
return doLoadBeanDefinitions(inputSource, encodedResource.getResource());
}
```
InputSource是org.xml.sax的类。
doLoadBeanDefinitions:
```java
protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) {
Document doc = doLoadDocument(inputSource, resource);
return registerBeanDefinitions(doc, resource);
}
```
doLoadDocument:
```java
protected Document doLoadDocument(InputSource inputSource, Resource resource) {
return this.documentLoader.loadDocument(inputSource, getEntityResolver(), this.errorHandler,
getValidationModeForResource(resource), isNamespaceAware());
}
```
documentLoader是一个DefaultDocumentLoader对象,此类是DocumentLoader接口的唯一实现。getEntityResolver方法返回ResourceEntityResolver,上面说过了。errorHandler是一个SimpleSaxErrorHandler对象。
校验模型其实就是确定xml文件使用xsd方式还是dtd方式来校验,忘了的话左转度娘。Spring会通过读取xml文件的方式判断应该采用哪种。
NamespaceAware默认false,因为默认配置了校验为true。
DefaultDocumentLoader.loadDocument:
```java
@Override
public Document loadDocument(InputSource inputSource, EntityResolver entityResolver,
ErrorHandler errorHandler, int validationMode, boolean namespaceAware) {
//这里就是老套路了,可以看出,Spring还是使用了dom的方式解析,即一次全部load到内存
DocumentBuilderFactory factory = createDocumentBuilderFactory(validationMode, namespaceAware);
DocumentBuilder builder = createDocumentBuilder(factory, entityResolver, errorHandler);
return builder.parse(inputSource);
}
```
createDocumentBuilderFactory比较有意思:
```java
protected DocumentBuilderFactory createDocumentBuilderFactory(int validationMode, boolean namespaceAware{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(namespaceAware);
if (validationMode != XmlValidationModeDetector.VALIDATION_NONE) {
//此方法设为true仅对dtd有效,xsd(schema)无效
factory.setValidating(true);
if (validationMode == XmlValidationModeDetector.VALIDATION_XSD) {
// Enforce namespace aware for XSD...
//开启xsd(schema)支持
factory.setNamespaceAware(true);
//这个也是Java支持Schema的套路,可以问度娘
factory.setAttribute(SCHEMA_LANGUAGE_ATTRIBUTE, XSD_SCHEMA_LANGUAGE);
}
}
return factory;
}
```
##### Bean解析
XmlBeanDefinitionReader.registerBeanDefinitions:
```java
public int registerBeanDefinitions(Document doc, Resource resource) {
BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
int countBefore = getRegistry().getBeanDefinitionCount();
documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
return getRegistry().getBeanDefinitionCount() - countBefore;
}
```
createBeanDefinitionDocumentReader:
```java
protected BeanDefinitionDocumentReader createBeanDefinitionDocumentReader() {
return BeanDefinitionDocumentReader.class.cast
//反射
(BeanUtils.instantiateClass(this.documentReaderClass));
}
```
documentReaderClass默认是DefaultBeanDefinitionDocumentReader,这其实也是策略模式,通过setter方法可以更换其实现。
注意cast方法,代替了强转。
createReaderContext:
```java
public XmlReaderContext createReaderContext(Resource resource) {
return new XmlReaderContext(resource, this.problemReporter, this.eventListener,
this.sourceExtractor, this, getNamespaceHandlerResolver());
}
```
problemReporter是一个FailFastProblemReporter对象。
eventListener是EmptyReaderEventListener对象,此类里的方法都是空实现。
sourceExtractor是NullSourceExtractor对象,直接返回空,也是空实现。
getNamespaceHandlerResolver默认返回DefaultNamespaceHandlerResolver对象,用来获取xsd对应的处理器。
XmlReaderContext的作用感觉就是这一堆参数的容器,糅合到一起传给DocumentReader,并美其名为Context。可以看出,Spring中到处都是策略模式,大量操作被抽象成接口。
DefaultBeanDefinitionDocumentReader.registerBeanDefinitions:
```java
@Override
public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {
this.readerContext = readerContext;
Element root = doc.getDocumentElement();
doRegisterBeanDefinitions(root);
}
```
doRegisterBeanDefinitions:
```java
protected void doRegisterBeanDefinitions(Element root) {
BeanDefinitionParserDelegate parent = this.delegate;
this.delegate = createDelegate(getReaderContext(), root, parent);
//默认的命名空间即
//http://www.springframework.org/schema/beans
if (this.delegate.isDefaultNamespace(root)) {
//检查profile属性
String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE);
if (StringUtils.hasText(profileSpec)) {
//profile属性可以以,分割
String[] specifiedProfiles = StringUtils.tokenizeToStringArray(
profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS);
if (!getReaderContext().getEnvironment().acceptsProfiles(specifiedProfiles)) {
return;
}
}
}
preProcessXml(root);
parseBeanDefinitions(root, this.delegate);
postProcessXml(root);
this.delegate = parent;
}
```
delegate的作用在于处理beans标签的嵌套,其实Spring配置文件是可以写成这样的:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean class="base.SimpleBean"></bean>
<beans>
<bean class="java.lang.Object"></bean>
</beans>
</beans>
```
xml(schema)的命名空间其实类似于java的报名,命名空间采用URL,比如Spring的是这样:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"></beans>
```
xmlns属性就是xml规范定义的用来设置命名空间的。这样设置了之后其实里面的bean元素全名就相当于http://www.springframework.org/schema/beans:bean,可以有效的防止命名冲突。命名空间可以通过规范定义的org.w3c.dom.Node.getNamespaceURI方法获得。
注意一下profile的检查, AbstractEnvironment.acceptsProfiles:
```java
@Override
public boolean acceptsProfiles(String... profiles) {
Assert.notEmpty(profiles, "Must specify at least one profile");
for (String profile : profiles) {
if (StringUtils.hasLength(profile) && profile.charAt(0) == '!') {
if (!isProfileActive(profile.substring(1))) {
return true;
}
} else if (isProfileActive(profile)) {
return true;
}
}
return false;
}
```
原理很简单,注意从源码可以看出,**profile属性支持!取反**。
preProcessXml方法是个空实现,供子类去覆盖,**目的在于给子类一个把我们自定义的标签转为Spring标准标签的机会**, 想的真周到。
DefaultBeanDefinitionDocumentReader.parseBeanDefinitions:
```java
protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
if (delegate.isDefaultNamespace(root)) {
NodeList nl = root.getChildNodes();
for (int i = 0; i < nl.getLength(); i++) {
Node node = nl.item(i);
if (node instanceof Element) {
Element ele = (Element) node;
if (delegate.isDefaultNamespace(ele)) {
parseDefaultElement(ele, delegate);
} else {
delegate.parseCustomElement(ele);
}
}
}
} else {
delegate.parseCustomElement(root);
}
}
```
可见,对于非默认命名空间的元素交由delegate处理。
#### 默认命名空间解析
即import, alias, bean, 嵌套的beans四种元素。parseDefaultElement:
```java
private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
//"import"
if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {
importBeanDefinitionResource(ele);
}
else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {
processAliasRegistration(ele);
}
else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {
processBeanDefinition(ele, delegate);
}
else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {
// recurse
doRegisterBeanDefinitions(ele);
}
}
```
##### import
写法示例:
```xml
<import resource="CTIContext.xml" />
<import resource="customerContext.xml" />
```
importBeanDefinitionResource套路和之前的配置文件加载完全一样,不过注意被import进来的文件是先于当前文件 被解析的。
##### alias
加入有一个bean名为componentA-dataSource,但是另一个组件想以componentB-dataSource的名字使用,就可以这样定义:
```xml
<alias name="componentA-dataSource" alias="componentB-dataSource"/>
```
processAliasRegistration核心源码:
```java
protected void processAliasRegistration(Element ele) {
String name = ele.getAttribute(NAME_ATTRIBUTE);
String alias = ele.getAttribute(ALIAS_ATTRIBUTE);
getReaderContext().getRegistry().registerAlias(name, alias);
getReaderContext().fireAliasRegistered(name, alias, extractSource(ele));
}
```
从前面的源码可以发现,registry其实就是DefaultListableBeanFactory,它实现了BeanDefinitionRegistry接口。registerAlias方法的实现在SimpleAliasRegistry:
```java
@Override
public void registerAlias(String name, String alias) {
Assert.hasText(name, "'name' must not be empty");
Assert.hasText(alias, "'alias' must not be empty");
//名字和别名一样
if (alias.equals(name)) {
//ConcurrentHashMap
this.aliasMap.remove(alias);
} else {
String registeredName = this.aliasMap.get(alias);
if (registeredName != null) {
if (registeredName.equals(name)) {
// An existing alias - no need to re-register
return;
}
if (!allowAliasOverriding()) {
throw new IllegalStateException
("Cannot register alias '" + alias + "' for name '" +
name + "': It is already registered for name '" + registeredName + "'.");
}
}
checkForAliasCircle(name, alias);
this.aliasMap.put(alias, name);
}
}
```
所以别名关系的保存使用Map完成,key为别名,value为本来的名字。
##### bean
bean节点是Spring最最常见的节点了。
DefaultBeanDefinitionDocumentReader.processBeanDefinition:
```java
protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
if (bdHolder != null) {
bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
try {
// Register the final decorated instance.
BeanDefinitionReaderUtils.registerBeanDefinition
(bdHolder, getReaderContext().getRegistry());
}
catch (BeanDefinitionStoreException ex) {
getReaderContext().error("Failed to register bean definition with name '" +
bdHolder.getBeanName() + "'", ele, ex);
}
// Send registration event.
getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
}
}
```
###### id & name处理
最终调用BeanDefinitionParserDelegate.parseBeanDefinitionElement(Element ele, BeanDefinition containingBean),源码较长,分部分说明。
首先获取到id和name属性,**name属性支持配置多个,以逗号分隔,如果没有指定id,那么将以第一个name属性值代替。id必须是唯一的,name属性其实是alias的角色,可以和其它的bean重复,如果name也没有配置,那么其实什么也没做**。
```java
String id = ele.getAttribute(ID_ATTRIBUTE);
String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);
List<String> aliases = new ArrayList<String>();
if (StringUtils.hasLength(nameAttr)) {
//按,分隔
String[] nameArr = StringUtils.tokenizeToStringArray
(nameAttr, MULTI_VALUE_ATTRIBUTE_DELIMITERS);
aliases.addAll(Arrays.asList(nameArr));
}
String beanName = id;
if (!StringUtils.hasText(beanName) && !aliases.isEmpty()) {
//name的第一个值作为id
beanName = aliases.remove(0);
}
//默认null
if (containingBean == null) {
//校验id是否已重复,如果重复直接抛异常
//校验是通过内部一个HashSet完成的,出现过的id都会保存进此Set
checkNameUniqueness(beanName, aliases, ele);
}
```
###### beanName生成
如果name和id属性都没有指定,那么Spring会自己生成一个, BeanDefinitionParserDelegate.parseBeanDefinitionElement:
```java
beanName = this.readerContext.generateBeanName(beanDefinition);
String beanClassName = beanDefinition.getBeanClassName();
aliases.add(beanClassName);
```
可见,Spring同时会把类名作为其别名。
最终调用的是BeanDefinitionReaderUtils.generateBeanName:
```java
public static String generateBeanName(
BeanDefinition definition, BeanDefinitionRegistry registry, boolean isInnerBean) {
String generatedBeanName = definition.getBeanClassName();
if (generatedBeanName == null) {
if (definition.getParentName() != null) {
generatedBeanName = definition.getParentName() + "$child";
//工厂方法产生的bean
} else if (definition.getFactoryBeanName() != null) {
generatedBeanName = definition.getFactoryBeanName() + "$created";
}
}
String id = generatedBeanName;
if (isInnerBean) {
// Inner bean: generate identity hashcode suffix.
id = generatedBeanName + GENERATED_BEAN_NAME_SEPARATOR +
ObjectUtils.getIdentityHexString(definition);
} else {
// Top-level bean: use plain class name.
// Increase counter until the id is unique.
int counter = -1;
//用类名#自增的数字命名
while (counter == -1 || registry.containsBeanDefinition(id)) {
counter++;
id = generatedBeanName + GENERATED_BEAN_NAME_SEPARATOR + counter;
}
}
return id;
}
```
###### bean解析
还是分部分说明(parseBeanDefinitionElement)。
首先获取到bean的class属性和parent属性,配置了parent之后,当前bean会继承父bean的属性。之后根据class和parent创建BeanDefinition对象。
```java
String className = null;
if (ele.hasAttribute(CLASS_ATTRIBUTE)) {
className = ele.getAttribute(CLASS_ATTRIBUTE).trim();
}
String parent = null;
if (ele.hasAttribute(PARENT_ATTRIBUTE)) {
parent = ele.getAttribute(PARENT_ATTRIBUTE);
}
AbstractBeanDefinition bd = createBeanDefinition(className, parent);
```
BeanDefinition的创建在BeanDefinitionReaderUtils.createBeanDefinition:
```java
public static AbstractBeanDefinition createBeanDefinition(
String parentName, String className, ClassLoader classLoader) {
GenericBeanDefinition bd = new GenericBeanDefinition();
bd.setParentName(parentName);
if (className != null) {
if (classLoader != null) {
bd.setBeanClass(ClassUtils.forName(className, classLoader));
}
else {
bd.setBeanClassName(className);
}
}
return bd;
}
```
之后是解析bean的其它属性,其实就是读取其配置,调用相应的setter方法保存在BeanDefinition中:
```java
parseBeanDefinitionAttributes(ele, beanName, containingBean, bd);
```
之后解析bean的decription子元素:
```xml
<bean id="b" name="one, two" class="base.SimpleBean">
<description>SimpleBean</description>
</bean>
```
就仅仅是个描述。
然后是meta子元素的解析,meta元素在xml配置文件里是这样的:
```xml
<bean id="b" name="one, two" class="base.SimpleBean">
<meta key="name" value="skywalker"/>
</bean>
```
注释上说,这样可以将任意的元数据附到对应的bean definition上。解析过程源码:
```java
public void parseMetaElements(Element ele, BeanMetadataAttributeAccessor attributeAccessor) {
NodeList nl = ele.getChildNodes();
for (int i = 0; i < nl.getLength(); i++) {
Node node = nl.item(i);
if (isCandidateElement(node) && nodeNameEquals(node, META_ELEMENT)) {
Element metaElement = (Element) node;
String key = metaElement.getAttribute(KEY_ATTRIBUTE);
String value = metaElement.getAttribute(VALUE_ATTRIBUTE);
//就是一个key, value的载体,无他
BeanMetadataAttribute attribute = new BeanMetadataAttribute(key, value);
//sourceExtractor默认是NullSourceExtractor,返回的是空
attribute.setSource(extractSource(metaElement));
attributeAccessor.addMetadataAttribute(attribute);
}
}
}
```
AbstractBeanDefinition继承自BeanMetadataAttributeAccessor类,底层使用了一个LinkedHashMap保存metadata。这个metadata具体是做什么暂时还不知道。
lookup-method解析:
此标签的作用在于当一个bean的某个方法被设置为lookup-method后,**每次调用此方法时,都会返回一个新的指定bean的对象**。用法示例:
```xml
<bean id="apple" class="cn.com.willchen.test.di.Apple" scope="prototype"/>
<!--水果盘-->
<bean id="fruitPlate" class="cn.com.willchen.test.di.FruitPlate">
<lookup-method name="getFruit" bean="apple"/>
</bean>
```
数据保存在Set中,对应的类是MethodOverrides。可以参考:
[Spring - lookup-method方式实现依赖注入](http://www.cnblogs.com/ViviChan/p/4981619.html)
replace-mothod解析:
此标签用于替换bean里面的特定的方法实现,替换者必须实现Spring的MethodReplacer接口,有点像aop的意思。
配置文件示例:
```xml
<bean name="replacer" class="springroad.deomo.chap4.MethodReplace" />
<bean name="testBean" class="springroad.deomo.chap4.LookupMethodBean">
<replaced-method name="test" replacer="replacer">
<arg-type match="String" />
</replaced-method>
</bean>
```
arg-type的作用是指定替换方法的参数类型,因为接口的定义参数都是Object的。参考: [SPRING.NET 1.3.2 学习20--方法注入之替换方法注入](http://blog.csdn.net/lee576/article/details/8725548)
解析之后将数据放在ReplaceOverride对象中,里面有一个LinkedList<String>专门用于保存arg-type。
构造参数(constructor-arg)解析:
作用一目了然,使用示例:
```xml
<bean class="base.SimpleBean">
<constructor-arg>
<value type="java.lang.String">Cat</value>
</constructor-arg>
</bean>
```
type一般不需要指定,除了泛型集合那种。除此之外,constructor-arg还支持name, index, ref等属性,可以具体的指定参数的位置等。构造参数解析后保存在BeanDefinition内部一个ConstructorArgumentValues对象中。如果设置了index属性,那么以Map<Integer, ValueHolder>的形式保存,反之,以List<ValueHolder>的形式保存。
property解析:
非常常用的标签,用以为bean的属性赋值,支持value和ref两种形式,示例:
```xml
<bean class="base.SimpleBean">
<property name="name" value="skywalker" />
</bean>
```
value和ref属性不能同时出现,如果是ref,那么将其值保存在不可变的RuntimeBeanReference对象中,其实现了BeanReference接口,此接口只有一个getBeanName方法。如果是value,那么将其值保存在TypedStringValue对象中。最终将对象保存在BeanDefinition内部一个MutablePropertyValues对象中(内部以ArrayList实现)。
qualifier解析:
配置示例:
```xml
<bean class="base.Student">
<property name="name" value="skywalker"></property>
<property name="age" value="12"></property>
<qualifier type="org.springframework.beans.factory.annotation.Qualifier" value="student" />
</bean>
<bean class="base.Student">
<property name="name" value="seaswalker"></property>
<property name="age" value="15"></property>
<qualifier value="student_2"></qualifier>
</bean>
<bean class="base.SimpleBean" />
```
SimpleBean部分源码:
```java
@Autowired
@Qualifier("student")
private Student student;
```
此标签和@Qualifier, @Autowired两个注解一起使用才有作用。@Autowired注解采用按类型查找的方式进行注入,如果找到多个需要类型的bean便会报错,有了@Qualifier标签就可以再按照此注解指定的名称查找。两者结合相当于实现了按类型+名称注入。type属性可以不指定,因为默认就是那个。qualifier标签可以有attribute子元素,比如:
```xml
<qualifier type="org.springframework.beans.factory.annotation.Qualifier" value="student">
<attribute key="id" value="1"/>
</qualifier>
```
貌似是用来在qualifier也区分不开的时候使用。attribute键值对保存在BeanMetadataAttribute对象中。整个qualifier保存在AutowireCandidateQualifier对象中。
###### Bean装饰
这部分是针对其它schema的属性以及子节点,比如:
```xml
<bean class="base.Student" primary="true">
<context:property-override />
</bean>
```
没见过这种用法,留个坑。
###### Bean注册
BeanDefinitionReaderUtils.registerBeanDefinition:
```java
public static void registerBeanDefinition(
BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry) {
// Register bean definition under primary name.
String beanName = definitionHolder.getBeanName();
registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());
// Register aliases for bean name, if any.
String[] aliases = definitionHolder.getAliases();
if (aliases != null) {
for (String alias : aliases) {
registry.registerAlias(beanName, alias);
}
}
}
```
registry其实就是DefaultListableBeanFactory对象,registerBeanDefinition方法主要就干了这么两件事:
```java
@Override
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) {
this.beanDefinitionMap.put(beanName, beanDefinition);
this.beanDefinitionNames.add(beanName);
}
```
一个是Map,另一个是List,一目了然。registerAlias方法的实现在其父类SimpleAliasRegistry,就是把键值对放在了一个ConcurrentHashMap里。
ComponentRegistered事件触发:
默认是个空实现,前面说过了。
###### BeanDefiniton数据结构
BeanDefiniton数据结构如下图:

##### beans
beans元素的嵌套直接递归调用DefaultBeanDefinitionDocumentReader.parseBeanDefinitions。
#### 其它命名空间解析
入口在DefaultBeanDefinitionDocumentReader.parseBeanDefinitions->BeanDefinitionParserDelegate.parseCustomElement(第二个参数为空):
```java
public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) {
String namespaceUri = getNamespaceURI(ele);
NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));
}
```
NamespaceHandlerResolver由XmlBeanDefinitionReader初始化,是一个DefaultNamespaceHandlerResolver对象,也是NamespaceHandlerResolver接口的唯一实现。
其resolve方法:
```java
@Override
public NamespaceHandler resolve(String namespaceUri) {
Map<String, Object> handlerMappings = getHandlerMappings();
Object handlerOrClassName = handlerMappings.get(namespaceUri);
if (handlerOrClassName == null) {
return null;
} else if (handlerOrClassName instanceof NamespaceHandler) {
return (NamespaceHandler) handlerOrClassName;
} else {
String className = (String) handlerOrClassName;
Class<?> handlerClass = ClassUtils.forName(className, this.classLoader);
NamespaceHandler namespaceHandler = (NamespaceHandler) BeanUtils.instantiateClass(handlerClass);
namespaceHandler.init();
handlerMappings.put(namespaceUri, namespaceHandler);
return namespaceHandler;
}
}
```
容易看出,Spring其实使用了一个Map了保存其映射关系,key就是命名空间的uri,value是**NamespaceHandler对象或是Class完整名,如果发现是类名,那么用反射的方法进行初始化,如果是NamespaceHandler对象,那么直接返回**。
NamespaceHandler映射关系来自于各个Spring jar包下的META-INF/spring.handlers文件,以spring-context包为例:
```html
http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler
http\://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler
http\://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler
http\://www.springframework.org/schema/task=org.springframework.scheduling.config.TaskNamespaceHandler
http\://www.springframework.org/schema/cache=org.springframework.cache.config.CacheNamespaceHandler
```
##### NamespaceHandler继承体系

##### init
resolve中调用了其init方法,此方法用以向NamespaceHandler对象注册BeanDefinitionParser对象。**此接口用以解析顶层(beans下)的非默认命名空间元素,比如`<context:annotation-config />`**。
所以这样逻辑就很容易理解了: **每种子标签的解析仍是策略模式的体现,init负责向父类NamespaceHandlerSupport注册不同的策略,由父类的NamespaceHandlerSupport.parse方法根据具体的子标签调用相应的策略完成解析的过程**。
此部分较为重要,所以重新开始大纲。
##### BeanFactory数据结构
BeanDefinition在BeanFactory中的主要数据结构如下图:

### prepareBeanFactory
此方法负责对BeanFactory进行一些特征的设置工作,"特征"包含这么几个方面:
#### BeanExpressionResolver
此接口只有一个实现: StandardBeanExpressionResolver。接口只含有一个方法:
```java
Object evaluate(String value, BeanExpressionContext evalContext)
```
prepareBeanFactory将一个此对象放入BeanFactory:
```java
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
```
StandardBeanExpressionResolver对象内部有一个关键的成员: SpelExpressionParser,其整个类图:

这便是Spring3.0开始出现的Spel表达式的解释器。
#### PropertyEditorRegistrar
此接口用于向Spring注册java.beans.PropertyEditor,只有一个方法:
```java
registerCustomEditors(PropertyEditorRegistry registry)
```
实现也只有一个: ResourceEditorRegistrar。
在编写xml配置时,我们设置的值都是字符串形式,所以在使用时肯定需要转为我们需要的类型,PropertyEditor接口正是定义了这么个东西。
prepareBeanFactory:
```java
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
```
BeanFactory也暴露了registerCustomEditors方法用以添加自定义的转换器,所以这个地方是组合模式的体现。
我们有两种方式可以添加自定义PropertyEditor:
- 通过`context.getBeanFactory().registerCustomEditor`
- 通过Spring配置文件:
```xml
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="base.Cat" value="base.CatEditor" />
</map>
</property>
</bean>
```
参考: [深入理解JavaBean(2):属性编辑器PropertyEditor](http://blog.csdn.net/zhoudaxia/article/details/36247883)
#### 环境注入
在Spring中我们自己的bean可以通过实现EnvironmentAware等一系列Aware接口获取到Spring内部的一些对象。prepareBeanFactory:
```java
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
```
ApplicationContextAwareProcessor核心的invokeAwareInterfaces方法:
```java
private void invokeAwareInterfaces(Object bean) {
if (bean instanceof Aware) {
if (bean instanceof EnvironmentAware) {
((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
}
if (bean instanceof EmbeddedValueResolverAware) {
((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
}
//....
}
}
```
#### 依赖解析忽略
此部分设置哪些接口在进行依赖注入的时候应该被忽略:
```java
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
```
#### bean伪装
有些对象并不在BeanFactory中,但是我们依然想让它们可以被装配,这就需要伪装一下:
```java
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
```
伪装关系保存在一个Map<Class<?>, Object>里。
#### LoadTimeWeaver
如果配置了此bean,那么:
```java
if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
// Set a temporary ClassLoader for type matching.
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
```
这个东西具体是干什么的在后面context:load-time-weaver中说明。
#### 注册环境
源码:
```java
if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
}
if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
}
if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().
getSystemEnvironment());
}
```
containsLocalBean特殊之处在于不会去父BeanFactory寻找。
### postProcessBeanFactory
此方法允许子类在所有的bean尚未初始化之前注册BeanPostProcessor。空实现且没有子类覆盖。
### invokeBeanFactoryPostProcessors
BeanFactoryPostProcessor接口允许我们在bean正是初始化之前改变其值。此接口只有一个方法:
```java
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory);
```
有两种方式可以向Spring添加此对象:
- 通过代码的方式:
```java
context.addBeanFactoryPostProcessor
```
- 通过xml配置的方式:
```xml
<bean class="base.SimpleBeanFactoryPostProcessor" />
```
注意此时尚未进行bean的初始化工作,初始化是在后面的finishBeanFactoryInitialization进行的,所以在BeanFactoryPostProcessor对象中获取bean会导致提前初始化。
此方法的关键源码:
```java
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory,
getBeanFactoryPostProcessors());
}
```
getBeanFactoryPostProcessors获取的就是AbstractApplicationContext的成员beanFactoryPostProcessors(ArrayList),但是很有意思,**只有通过context.addBeanFactoryPostProcessor这种方式添加的才会出现在这个List里,所以对于xml配置方式,此List其实没有任何元素。玄机就在PostProcessorRegistrationDelegate里**。
核心思想就是使用BeanFactory的getBeanNamesForType方法获取相应的BeanDefinition的name数组,之后逐一调用getBean方法获取到bean(初始化),getBean方法后面再说。
注意此处有一个优先级的概念,如果你的BeanFactoryPostProcessor同时实现了Ordered或者是PriorityOrdered接口,那么会被首先执行。
### BeanPostProcessor注册
此部分实质上是在BeanDefinitions中寻找BeanPostProcessor,之后调用BeanFactory.addBeanPostProcessor方法保存在一个List中,注意添加时仍然有优先级的概念,优先级高的在前面。
### MessageSource
此接口用以支持Spring国际化。继承体系如下:

AbstractApplicationContext的initMessageSource()方法就是在BeanFactory中查找MessageSource的bean,如果配置了此bean,那么调用getBean方法完成其初始化并将其保存在AbstractApplicationContext内部messageSource成员变量中,用以处理ApplicationContext的getMessage调用,因为从继承体系上来看,ApplicationContext是MessageSource的子类,此处是委托模式的体现。如果没有配置此bean,那么初始化一个DelegatingMessageSource对象,此类是一个空实现,同样用以处理getMessage调用请求。
参考: [学习Spring必学的Java基础知识(8)----国际化信息](http://stamen.iteye.com/blog/1541732)
### 事件驱动
此接口代表了Spring的事件驱动(监听器)模式。一个事件驱动包含三部分:
#### 事件
java的所有事件对象一般都是java.util.EventObject的子类,Spring的整个继承体系如下:

#### 发布者
##### ApplicationEventPublisher

一目了然。
##### ApplicationEventMulticaster
ApplicationEventPublisher实际上正是将请求委托给ApplicationEventMulticaster来实现的。其继承体系:

#### 监听器
所有的监听器是jdk EventListener的子类,这是一个mark接口。继承体系:

可以看出SmartApplicationListener和GenericApplicationListener是高度相似的,都提供了事件类型检测和顺序机制,而后者是从Spring4.2加入的,Spring官方文档推荐使用后者代替前者。
#### 初始化
前面说过ApplicationEventPublisher是通过委托给ApplicationEventMulticaster实现的,所以refresh方法中完成的是对ApplicationEventMulticaster的初始化:
```java
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
```
initApplicationEventMulticaster则首先在BeanFactory中寻找ApplicationEventMulticaster的bean,如果找到,那么调用getBean方法将其初始化,如果找不到那么使用SimpleApplicationEventMulticaster。
#### 事件发布
AbstractApplicationContext.publishEvent核心代码:
```java
protected void publishEvent(Object event, ResolvableType eventType) {
getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);
}
```
SimpleApplicationEventMulticaster.multicastEvent:
```java
@Override
public void multicastEvent(final ApplicationEvent event, ResolvableType eventType) {
ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {
Executor executor = getTaskExecutor();
if (executor != null) {
executor.execute(new Runnable() {
@Override
public void run() {
invokeListener(listener, event);
}
});
} else {
invokeListener(listener, event);
}
}
}
```
##### 监听器获取
获取当然还是通过beanFactory的getBean来完成的,值得注意的是Spring在此处使用了缓存(ConcurrentHashMap)来加速查找的过程。
##### 同步/异步
可以看出,如果executor不为空,那么监听器的执行实际上是异步的。那么如何配置同步/异步呢?
###### 全局
```xml
<task:executor id="multicasterExecutor" pool-size="3"/>
<bean class="org.springframework.context.event.SimpleApplicationEventMulticaster">
<property name="taskExecutor" ref="multicasterExecutor"></property>
</bean>
```
task schema是Spring从3.0开始加入的,使我们可以不再依赖于Quartz实现定时任务,源码在org.springframework.core.task包下,使用需要引入schema:
```xml
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd"
```
可以参考: [Spring定时任务的几种实现](http://gong1208.iteye.com/blog/1773177)
###### 注解
开启注解支持:
```xml
<!-- 开启@AspectJ AOP代理 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- 任务调度器 -->
<task:scheduler id="scheduler" pool-size="10"/>
<!-- 任务执行器 -->
<task:executor id="executor" pool-size="10"/>
<!--开启注解调度支持 @Async @Scheduled-->
<task:annotation-driven executor="executor" scheduler="scheduler" proxy-target-class="true"/>
```
在代码中使用示例:
```java
@Component
public class EmailRegisterListener implements ApplicationListener<RegisterEvent> {
@Async
@Override
public void onApplicationEvent(final RegisterEvent event) {
System.out.println("注册成功,发送确认邮件给:" + ((User)event.getSource()).getUsername());
}
}
```
参考: [详解Spring事件驱动模型](http://jinnianshilongnian.iteye.com/blog/1902886)
### onRefresh
这又是一个模版方法,允许子类在进行bean初始化之前进行一些定制操作。默认空实现。
### ApplicationListener注册
registerListeners方法干的,没什么好说的。
### singleton初始化
finishBeanFactoryInitialization:
```java
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
beanFactory.setConversionService(
beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
}
if (!beanFactory.hasEmbeddedValueResolver()) {
beanFactory.addEmbeddedValueResolver(new StringValueResolver() {
@Override
public String resolveStringValue(String strVal) {
return getEnvironment().resolvePlaceholders(strVal);
}
});
}
String[] weaverAwareNames = beanFactory.getBeanNamesForType
(LoadTimeWeaverAware.class, false, false);
for (String weaverAwareName : weaverAwareNames) {
getBean(weaverAwareName);
}
// Allow for caching all bean definition metadata, not expecting further changes.
beanFactory.freezeConfiguration();
// Instantiate all remaining (non-lazy-init) singletons.
beanFactory.preInstantiateSingletons();
}
```
分部分说明。
#### ConversionService
此接口用于类型之间的转换,在Spring里其实就是把配置文件中的String转为其它类型,从3.0开始出现,目的和jdk的PropertyEditor接口是一样的,参考ConfigurableBeanFactory.setConversionService注释:
> >Specify a Spring 3.0 ConversionService to use for converting
> > property values, as an alternative to JavaBeans PropertyEditors.
> > @since 3.0
#### StringValueResolver
用于解析注解的值。接口只定义了一个方法:
```java
String resolveStringValue(String strVal);
```
#### LoadTimeWeaverAware
实现了此接口的bean可以得到LoadTimeWeaver,此处仅仅初始化。
#### 初始化
DefaultListableBeanFactory.preInstantiateSingletons:
```java
@Override
public void preInstantiateSingletons() throws BeansException {
List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);
for (String beanName : beanNames) {
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
if (isFactoryBean(beanName)) {
final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX
+ beanName);
boolean isEagerInit;
if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
@Override
public Boolean run() {
return ((SmartFactoryBean<?>) factory).isEagerInit();
}
}, getAccessControlContext());
}
else {
isEagerInit = (factory instanceof SmartFactoryBean &&
((SmartFactoryBean<?>) factory).isEagerInit());
}
if (isEagerInit) {
getBean(beanName);
}
}
else {
getBean(beanName);
}
}
}
// Trigger post-initialization callback for all applicable beans...
for (String beanName : beanNames) {
Object singletonInstance = getSingleton(beanName);
if (singletonInstance instanceof SmartInitializingSingleton) {
final SmartInitializingSingleton smartSingleton =
(SmartInitializingSingleton) singletonInstance;
if (System.getSecurityManager() != null) {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
@Override
public Object run() {
smartSingleton.afterSingletonsInstantiated();
return null;
}
}, getAccessControlContext());
}
else {
smartSingleton.afterSingletonsInstantiated();
}
}
}
}
```
首先进行Singleton的初始化,其中如果bean是FactoryBean类型(注意,只定义了factory-method属性的普通bean并不是FactoryBean),并且还是SmartFactoryBean类型,那么需要判断是否需要eagerInit(isEagerInit是此接口定义的方法)。
# getBean
这里便是bean初始化的核心逻辑。源码比较复杂,分开说。以getBean(String name)为例。AbstractBeanFactory.getBean:
```java
@Override
public Object getBean(String name) throws BeansException {
return doGetBean(name, null, null, false);
}
```
第二个参数表示bean的Class类型,第三个表示创建bean需要的参数,最后一个表示不需要进行类型检查。
## beanName转化
```java
final String beanName = transformedBeanName(name);
```
这里是将FactoryBean的前缀去掉以及将别名转为真实的名字。
## 手动注册bean检测
前面注册环境一节说过,Spring其实手动注册了一些单例bean。这一步就是检测是不是这些bean。如果是,那么再检测是不是工厂bean,如果是返回其工厂方法返回的实例,如果不是返回bean本身。
```java
Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null && args == null) {
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
}
```
## 检查父容器
如果父容器存在并且存在此bean定义,那么交由其父容器初始化:
```java
BeanFactory parentBeanFactory = getParentBeanFactory();
if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
// Not found -> check parent.
//此方法其实是做了前面beanName转化的逆操作,因为父容器同样会进行转化操作
String nameToLookup = originalBeanName(name);
if (args != null) {
// Delegation to parent with explicit args.
return (T) parentBeanFactory.getBean(nameToLookup, args);
} else {
// No args -> delegate to standard getBean method.
return parentBeanFactory.getBean(nameToLookup, requiredType);
}
}
```
## 依赖初始化
bean可以由depends-on属性配置依赖的bean。Spring会首先初始化依赖的bean。
```java
String[] dependsOn = mbd.getDependsOn();
if (dependsOn != null) {
for (String dependsOnBean : dependsOn) {
//检测是否存在循环依赖
if (isDependent(beanName, dependsOnBean)) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Circular depends-on relationship between '" + beanName + "' and '" + dependsOnBean + "'");
}
registerDependentBean(dependsOnBean, beanName);
getBean(dependsOnBean);
}
}
```
registerDependentBean进行了依赖关系的注册,这么做的原因是Spring在即进行bean销毁的时候会首先销毁被依赖的bean。依赖关系的保存是通过一个ConcurrentHashMap<String, Set<String>>完成的,key是bean的真实名字。
## Singleton初始化
虽然这里大纲是Singleton初始化,但是getBean方法本身是包括所有scope的初始化,在这里一次说明了。
```java
if (mbd.isSingleton()) {
sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
@Override
public Object getObject() throws BeansException {
return createBean(beanName, mbd, args);
}
});
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}
```
### getSingleton方法
#### 是否存在
首先会检测是否已经存在,如果存在,直接返回:
```java
synchronized (this.singletonObjects) {
Object singletonObject = this.singletonObjects.get(beanName);
}
```
所有的单例bean都保存在这样的数据结构中: `ConcurrentHashMap<String, Object>`。
#### bean创建
源码位于AbstractAutowireCapableBeanFactory.createBean,主要分为几个部分:
##### lookup-method检测
此部分用于检测lookup-method标签配置的方法是否存在:
```java
RootBeanDefinition mbdToUse = mbd;
mbdToUse.prepareMethodOverrides();
```
prepareMethodOverrides:
```java
public void prepareMethodOverrides() throws BeanDefinitionValidationException {
// Check that lookup methods exists.
MethodOverrides methodOverrides = getMethodOverrides();
if (!methodOverrides.isEmpty()) {
Set<MethodOverride> overrides = methodOverrides.getOverrides();
synchronized (overrides) {
for (MethodOverride mo : overrides) {
prepareMethodOverride(mo);
}
}
}
}
```
prepareMethodOverride:
```java
protected void prepareMethodOverride(MethodOverride mo) {
int count = ClassUtils.getMethodCountForName(getBeanClass(), mo.getMethodName());
if (count == 0) {
throw new BeanDefinitionValidationException(
"Invalid method override: no method with name '" + mo.getMethodName() +
"' on class [" + getBeanClassName() + "]");
} else if (count == 1) {
// Mark override as not overloaded, to avoid the overhead of arg type checking.
mo.setOverloaded(false);
}
}
```
##### InstantiationAwareBeanPostProcessor触发
在这里触发的是其postProcessBeforeInitialization和postProcessAfterInstantiation方法。
```java
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
return beanInstance;
```
继续:
```java
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
// Make sure bean class is actually resolved at this point.
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
Class<?> targetType = determineTargetType(beanName, mbd);
if (targetType != null) {
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
}
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
```
从这里可以看出,**如果InstantiationAwareBeanPostProcessor返回的不是空,那么将不会继续执行剩下的Spring初始化流程,此接口用于初始化自定义的bean,主要是在Spring内部使用**。
##### doCreateBean
同样分为几部分。
###### 创建(createBeanInstance)
关键代码:
```java
BeanWrapper instanceWrapper = null;
if (instanceWrapper == null) {
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
```
createBeanInstance的创建过程又分为以下几种情况:
- 工厂bean:
调用instantiateUsingFactoryMethod方法:
```java
protected BeanWrapper instantiateUsingFactoryMethod(
String beanName, RootBeanDefinition mbd, Object[] explicitArgs) {
return new ConstructorResolver(this).instantiateUsingFactoryMethod(beanName, mbd, explicitArgs);
}
```
注意,此处的工厂bean指的是配置了factory-bean/factory-method属性的bean,不是实现了FacrotyBean接口的bean。如果没有配置factory-bean属性,那么factory-method指向的方法必须是静态的。此方法主要做了这么几件事:
- 初始化一个BeanWrapperImpl对象。
- 根据设置的参数列表使用反射的方法寻找相应的方法对象。
- InstantiationStrategy:
bean的初始化在此处又抽成了策略模式,类图:

instantiateUsingFactoryMethod部分源码:
```java
beanInstance = this.beanFactory.getInstantiationStrategy().instantiate(
mbd, beanName, this.beanFactory, factoryBean, factoryMethodToUse, argsToUse);
```
getInstantiationStrategy返回的是CglibSubclassingInstantiationStrategy对象。此处instantiate实现也很简单,就是调用工厂方法的Method对象反射调用其invoke即可得到对象,SimpleInstantiationStrategy.
instantiate核心源码:
```java
@Override
public Object instantiate(RootBeanDefinition bd, String beanName, BeanFactory owner,
Object factoryBean, final Method factoryMethod, Object... args) {
return factoryMethod.invoke(factoryBean, args);
}
```
- 构造器自动装配
createBeanInstance部分源码:
```java
// Need to determine the constructor...
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
if (ctors != null ||
mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||
//配置了<constructor-arg>子元素
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
return autowireConstructor(beanName, mbd, ctors, args);
}
```
determineConstructorsFromBeanPostProcessors源码:
```java
protected Constructor<?>[] determineConstructorsFromBeanPostProcessors(Class<?> beanClass, String beanName) {
if (beanClass != null && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
SmartInstantiationAwareBeanPostProcessor ibp =
(SmartInstantiationAwareBeanPostProcessor) bp;
Constructor<?>[] ctors = ibp.determineCandidateConstructors(beanClass, beanName);
if (ctors != null) {
return ctors;
}
}
}
}
return null;
}
```
可见是由SmartInstantiationAwareBeanPostProcessor决定的,默认是没有配置这种东西的。
之后就是判断bean的自动装配模式,可以通过如下方式配置:
```xml
<bean id="student" class="base.Student" primary="true" autowire="default" />
```
autowire共有以下几种选项:
- no: 默认的,不进行自动装配。在这种情况下,只能通过ref方式引用其它bean。
- byName: 根据bean里面属性的名字在BeanFactory中进行查找并装配。
- byType: 按类型。
- constructor: 以byType的方式查找bean的构造参数列表。
- default: 由父bean决定。
参考: [Spring - bean的autowire属性(自动装配)](http://www.cnblogs.com/ViviChan/p/4981539.html)
autowireConstructor调用的是ConstructorResolver.autowireConstructor,此方法主要做了两件事:
- 得到合适的构造器对象。
- 根据构造器参数的类型去BeanFactory查找相应的bean:
入口方法在ConstructorResolver.resolveAutowiredArgument:
```java
protected Object resolveAutowiredArgument(
MethodParameter param, String beanName, Set<String> autowiredBeanNames,
TypeConverter typeConverter) {
return this.beanFactory.resolveDependency(
new DependencyDescriptor(param, true), beanName,
autowiredBeanNames, typeConverter);
}
```
最终调用的还是CglibSubclassingInstantiationStrategy.instantiate方法,关键源码:
```java
@Override
public Object instantiate(RootBeanDefinition bd, String beanName, BeanFactory owner,
final Constructor<?> ctor, Object... args) {
if (bd.getMethodOverrides().isEmpty()) {
//反射调用
return BeanUtils.instantiateClass(ctor, args);
} else {
return instantiateWithMethodInjection(bd, beanName, owner, ctor, args);
}
}
```
可以看出,如果配置了lookup-method标签,**得到的实际上是用Cglib生成的目标类的代理子类**。
CglibSubclassingInstantiationStrategy.instantiateWithMethodInjection:
```java
@Override
protected Object instantiateWithMethodInjection(RootBeanDefinition bd, String beanName, BeanFactory owner,Constructor<?> ctor, Object... args) {
// Must generate CGLIB subclass...
return new CglibSubclassCreator(bd, owner).instantiate(ctor, args);
}
```
- 默认构造器
一行代码,很简单:
```java
// No special handling: simply use no-arg constructor.
return instantiateBean(beanName, mbd);
```
###### MergedBeanDefinitionPostProcessor
触发源码:
```java
synchronized (mbd.postProcessingLock) {
if (!mbd.postProcessed) {
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
mbd.postProcessed = true;
}
}
```
此接口也是Spring内部使用的,不管它了。
###### 属性解析
入口方法: AbstractAutowireCapableBeanFactory.populateBean,它的作用是: 根据autowire类型进行autowire by name,by type 或者是直接进行设置,简略后的源码:
```java
protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
//所有<property>的值
PropertyValues pvs = mbd.getPropertyValues();
if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||
mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
// Add property values based on autowire by name if applicable.
if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
autowireByName(beanName, mbd, bw, newPvs);
}
// Add property values based on autowire by type if applicable.
if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
autowireByType(beanName, mbd, bw, newPvs);
}
pvs = newPvs;
}
//设值
applyPropertyValues(beanName, mbd, bw, pvs);
}
```
autowireByName源码:
```java
protected void autowireByName(
String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {
//返回所有引用(ref="XXX")的bean名称
String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
for (String propertyName : propertyNames) {
if (containsBean(propertyName)) {
//从BeanFactory获取
Object bean = getBean(propertyName);
pvs.add(propertyName, bean);
registerDependentBean(propertyName, beanName);
}
}
}
```
autowireByType也是同样的套路,所以可以得出结论: **autowireByName和autowireByType方法只是先获取到引用的bean,真正的设值是在applyPropertyValues中进行的。**
###### 属性设置
Spring判断一个属性可不可以被设置(存不存在)是通过java bean的内省操作来完成的,也就是说,属性可以被设置的条件是**此属性拥有public的setter方法,并且注入时的属性名应该是setter的名字**。
###### 初始化
此处的初始化指的是bean已经构造完成,执行诸如调用其init方法的操作。相关源码:
```java
// Initialize the bean instance.
Object exposedObject = bean;
try {
populateBean(beanName, mbd, instanceWrapper);
if (exposedObject != null) {
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
}
```
initializeBean:
```java
protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
@Override
public Object run() {
invokeAwareMethods(beanName, bean);
return null;
}
}, getAccessControlContext());
}
else {
invokeAwareMethods(beanName, bean);
}
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
invokeInitMethods(beanName, wrappedBean, mbd);
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
}
```
主要的操作步骤一目了然。
- Aware方法触发:
我们的bean有可能实现了一些XXXAware接口,此处就是负责调用它们:
```java
private void invokeAwareMethods(final String beanName, final Object bean) {
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware) {
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
}
}
```
- BeanPostProcessor触发,没什么好说的
- 调用init方法:
在XML配置中,bean可以有一个init-method属性来指定初始化时调用的方法。从原理来说,其实就是一个反射调用。不过注意这里有一个InitializingBean的概念。
此接口只有一个方法:
```java
void afterPropertiesSet() throws Exception;
```
如果我们的bean实现了此接口,那么此方法会首先被调用。此接口的意义在于: 当此bean的所有属性都被设置(注入)后,给bean一个利用现有属性重新组织或是检查属性的机会。感觉和init方法有些冲突,不过此接口在Spring被广泛使用。
### getObjectForBeanInstance
位于AbstractBeanFactory,此方法的目的在于如果bean是FactoryBean,那么返回其工厂方法创建的bean,而不是自身。
## Prototype初始化
AbstractBeanFactory.doGetBean相关源码:
```java
else if (mbd.isPrototype()) {
// It's a prototype -> create a new instance.
Object prototypeInstance = null;
try {
beforePrototypeCreation(beanName);
prototypeInstance = createBean(beanName, mbd, args);
}
finally {
afterPrototypeCreation(beanName);
}
bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
}
```
### beforePrototypeCreation
此方法用于确保在同一时刻只能有一个此bean在初始化。
### createBean
和单例的是一样的,不在赘述。
### afterPrototypeCreation
和beforePrototypeCreation对应的,你懂的。
### 总结
可以看出,初始化其实和单例是一样的,只不过单例多了一个是否已经存在的检查。
## 其它Scope初始化
其它就指的是request、session。此部分源码:
```java
else {
String scopeName = mbd.getScope();
final Scope scope = this.scopes.get(scopeName);
if (scope == null) {
throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
}
Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() {
@Override
public Object getObject() throws BeansException {
beforePrototypeCreation(beanName);
try {
return createBean(beanName, mbd, args);
}
finally {
afterPrototypeCreation(beanName);
}
}
});
bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
}
```
scopes是一个LinkedHashMap<String, Scope>,可以调用 ConfigurableBeanFactory定义的registerScope方法注册其值。
Scope接口继承体系:

根据socpe.get的注释,此方法如果找到了叫做beanName的bean,那么返回,如果没有,将调用ObjectFactory创建之。Scope的实现参考类图。
================================================
FILE: note/Spring.uml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<XPD:PROJECT xmlns:XPD="http://www.staruml.com" version="1">
<XPD:HEADER>
<XPD:SUBUNITS>
</XPD:SUBUNITS>
<XPD:PROFILES>
<XPD:PROFILE>UMLStandard</XPD:PROFILE>
</XPD:PROFILES>
</XPD:HEADER>
<XPD:BODY>
<XPD:OBJ name="DocumentElement" type="UMLProject" guid="OB1ywkeJUU2zhj8yqaXuowAA">
<XPD:ATTR name="Title" type="string">Spring</XPD:ATTR>
<XPD:ATTR name="#OwnedElements" type="integer">6</XPD:ATTR>
<XPD:OBJ name="OwnedElements[0]" type="UMLModel" guid="6eooFiJdkE+izOOxrEuNTgAA">
<XPD:ATTR name="Name" type="string">类图</XPD:ATTR>
<XPD:REF name="Namespace">OB1ywkeJUU2zhj8yqaXuowAA</XPD:REF>
<XPD:ATTR name="#OwnedDiagrams" type="integer">5</XPD:ATTR>
<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="KdPdnCgUbU66BkwUdFjouwAA">
<XPD:ATTR name="Name" type="string">ResourceLoader</XPD:ATTR>
<XPD:REF name="DiagramOwner">6eooFiJdkE+izOOxrEuNTgAA</XPD:REF>
<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="HmwgsGgZmkqYevJMJOxXWgAA">
<XPD:REF name="Diagram">KdPdnCgUbU66BkwUdFjouwAA</XPD:REF>
<XPD:ATTR name="#OwnedViews" type="integer">32</XPD:ATTR>
<XPD:OBJ name="OwnedViews[0]" type="UMLInterfaceView" guid="NU3XTWc/BEu77lxkyrdlLwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">440</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">52</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">155</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">72</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">hDybVb95ZkCtdnWORm8lxwAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="0qhSEymnuUeDoXAU1POcfQAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="JSf5zYLEokyINJ/KcRPO6QAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">ResourceLoader</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="04KV3XeVgUCj41lHRMvlJQAA">
<XPD:ATTR name="Text" type="string"><<interface>></XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="MTCwGnVplk2PDTNBBzPlKgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="iizMiKT2mEOUmYSU19SkagAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">hDybVb95ZkCtdnWORm8lxwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="UAZn/2ZCWUu53K3OmosgQAAA">
<XPD:REF name="Model">hDybVb95ZkCtdnWORm8lxwAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="Miusv09i10CpLvE8QbQD2wAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">184</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">176</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">217</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">69</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">/FtEC3pKi0WdIB5Q0P3zyQAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="AU4jLnNc/UWYDeImXGvQdQAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="4VMM+h828kWeQjXItRaeKAAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">DefaultResourceLoader</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="Ce6OlsY420CHw+kbvd5p1AAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="FIj8nWfVjk25OY8jRxusxAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="xiuadWPwIE2Z6a7JXs64ugAA">
<XPD:REF name="Model">/FtEC3pKi0WdIB5Q0P3zyQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="4iyubBOGdkOplmqtA4B1zwAA">
<XPD:REF name="Model">/FtEC3pKi0WdIB5Q0P3zyQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="OVnkWVqzbUS6LoYhBPmXBQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">/FtEC3pKi0WdIB5Q0P3zyQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[2]" type="UMLClassView" guid="JrlmBEhPlEy1CKdWqJaRJAAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">24</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">275</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">174</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">WeI5VK83yEuXDwmBYTNJRQAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="DD8ODZ6i2ki1y9rER/pU/wAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="c3jfJkBGBEq0OuOZ3hoHGgAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">FileSystemResourceLoader</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="WKAHZ7cE0U+QKi3rJcdlvgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="o9jeB09VQUukyjmiit8UaQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="XUjFXUQjj0CLoeByA4DTlgAA">
<XPD:REF name="Model">WeI5VK83yEuXDwmBYTNJRQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="jniLkap2b0ioQ2zFMwONCAAA">
<XPD:REF name="Model">WeI5VK83yEuXDwmBYTNJRQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="ikYESStJb0KKa1wT2TMnkAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">WeI5VK83yEuXDwmBYTNJRQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[3]" type="UMLRealizationView" guid="DNK7uBPsD0CHt736PvG2ggAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">354,176;451,123</XPD:ATTR>
<XPD:REF name="Model">gPF2N18LgEO4cq70twKRmwAA</XPD:REF>
<XPD:REF name="Head">NU3XTWc/BEu77lxkyrdlLwAA</XPD:REF>
<XPD:REF name="Tail">Miusv09i10CpLvE8QbQD2wAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Yb9eSPGk6E+Yqf7qoJ1ShAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">gPF2N18LgEO4cq70twKRmwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="mZA8A3ikp0u6Iiq/Vh69kgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">gPF2N18LgEO4cq70twKRmwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="giz68CKiD0KOwLU9+mCvaQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">gPF2N18LgEO4cq70twKRmwAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[4]" type="UMLGeneralizationView" guid="GhzXXbm7AE+stM9UE35qUwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">163,275;225,244</XPD:ATTR>
<XPD:REF name="Model">D4dTQtLfTkKFelspkdsldAAA</XPD:REF>
<XPD:REF name="Head">Miusv09i10CpLvE8QbQD2wAA</XPD:REF>
<XPD:REF name="Tail">JrlmBEhPlEy1CKdWqJaRJAAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="K9Siz5i07U+1UkR8ROFGdgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">D4dTQtLfTkKFelspkdsldAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="ZEgNbEPiXEO7yMKUDefW2wAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">D4dTQtLfTkKFelspkdsldAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="O9x6VBXPwEioHIUfjm49HwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">D4dTQtLfTkKFelspkdsldAAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[5]" type="UMLClassView" guid="QPH2knF09EWWbLHyyUeU9gAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">220</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">275</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">178</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">GoAJj7SK9EuEnw6bpQhwnQAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="nGbYYWJfpEG8hJpHkEqYXQAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="j6XT1QGESk+282/RpavDTgAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">ClassRelativeResourceLoader</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="xLbGmP1n1EOXr0c84OKaXQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="tx42FSsNl0uIaPrZnEMQ7wAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="4erONPgKKEWGlC760UteagAA">
<XPD:REF name="Model">GoAJj7SK9EuEnw6bpQhwnQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="GyIZdbBhGUmD9Oc6+Yh+BgAA">
<XPD:REF name="Model">GoAJj7SK9EuEnw6bpQhwnQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="WxFDHKGzvkeXmsn9VlYotQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">GoAJj7SK9EuEnw6bpQhwnQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[6]" type="UMLGeneralizationView" guid="UZcT8CpMHU+R9ssdBb/QHQAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">303,275;298,244</XPD:ATTR>
<XPD:REF name="Model">GCKbtbV5MkmzeewK94/nuwAA</XPD:REF>
<XPD:REF name="Head">Miusv09i10CpLvE8QbQD2wAA</XPD:REF>
<XPD:REF name="Tail">QPH2knF09EWWbLHyyUeU9gAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="oBIwCk+YRUa/zLSmhQXH+QAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">GCKbtbV5MkmzeewK94/nuwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="55EvqEbgrUyPe+oplr4KwAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">GCKbtbV5MkmzeewK94/nuwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="33XbPBI1zkGLwNEH+3vciAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">GCKbtbV5MkmzeewK94/nuwAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[7]" type="UMLClassView" guid="vVX4w/Fjo0SpqY8HH1IZOAAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">375</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">480</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">167</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">50/oHuZbCEm40+kSv4xkOQAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="PQj34vqZuE6BM+L2aP/XNQAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="gbvP7S1/4keyFgwqo94tagAA">
<XPD:ATTR name="FontStyle" type="integer">3</XPD:ATTR>
<XPD:ATTR name="Text" type="string">AbstractApplicationContext</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="ajGFAQVMXEy3lN44aMD70AAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="tujYpLbzaUGZWWk+ZWioOAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="D2gJuBadPUiwhRwq9MF6bAAA">
<XPD:REF name="Model">50/oHuZbCEm40+kSv4xkOQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="0k0oL3/bP0+nJOY0MeblCAAA">
<XPD:REF name="Model">50/oHuZbCEm40+kSv4xkOQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="7yY4eFOjxUmqs5UvRHpcqAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">50/oHuZbCEm40+kSv4xkOQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[8]" type="UMLGeneralizationView" guid="DXonoKm/FUiZGtbOpUvS1AAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">457,480;452,280;370,244</XPD:ATTR>
<XPD:REF name="Model">yu6pp0C6xE2Y8WsqgglhKgAA</XPD:REF>
<XPD:REF name="Head">Miusv09i10CpLvE8QbQD2wAA</XPD:REF>
<XPD:REF name="Tail">vVX4w/Fjo0SpqY8HH1IZOAAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="x01yz5EBOEulMqGMiWYNUQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">yu6pp0C6xE2Y8WsqgglhKgAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="TXIPGNs/LEmKLGSuD/zLxQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">yu6pp0C6xE2Y8WsqgglhKgAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="p4mqW7F5vEum+Jns+UVsXwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">yu6pp0C6xE2Y8WsqgglhKgAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[9]" type="UMLInterfaceView" guid="Ww6zG/aIKk6r4yv1aP6JogAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">552</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">368</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">189</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">BGLK54QHuEi9JrXkIwvt9QAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="97vyE7g+ekq/yuQzGYTWsQAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="CwuNZYQMa0icQSLQEV68EgAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">ConfigurableApplicationContext</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="kfTkwpUknUK6g1+ZDHp/JQAA">
<XPD:ATTR name="Text" type="string"><<interface>></XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="VxWApgLh6Em+vnbInoNwbwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="+507JUSG/EWnw7Qja7AAEAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">BGLK54QHuEi9JrXkIwvt9QAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="rTtcWuZcUEKaGLdDgImobQAA">
<XPD:REF name="Model">BGLK54QHuEi9JrXkIwvt9QAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[10]" type="UMLRealizationView" guid="72pM5IOZfk6BlF350Y7ZEgAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">494,480;607,413</XPD:ATTR>
<XPD:REF name="Model">rKkkrs0UVkm/xfWq70MjPQAA</XPD:REF>
<XPD:REF name="Head">Ww6zG/aIKk6r4yv1aP6JogAA</XPD:REF>
<XPD:REF name="Tail">vVX4w/Fjo0SpqY8HH1IZOAAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="ZhTsV0SWvk6Iuo8fehtK0AAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">rKkkrs0UVkm/xfWq70MjPQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="K5hCy9NmEU2rV9f2GHyllAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">rKkkrs0UVkm/xfWq70MjPQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="YuHb3uhJUU+/0Fm+MV4PBAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">rKkkrs0UVkm/xfWq70MjPQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[11]" type="UMLInterfaceView" guid="RhNuxONOtE6ErnVtlW+P5AAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">587</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">280</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">118</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">lFir+W8oe02JBSON90x/ygAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="JGnGFcow5k2D7A44rSy/nwAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="TLNuXrQTs06cwqQiHUqbCAAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">ApplicationContext</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="y3Fz29R6PUq+9ztZ49gWmAAA">
<XPD:ATTR name="Text" type="string"><<interface>></XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="c/Kic3udnU29ph+aOhj/vQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="+DEMC6a22U27P0HADXeXpAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">lFir+W8oe02JBSON90x/ygAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="+30fG/b3ZUGry0LAX4+3UQAA">
<XPD:REF name="Model">lFir+W8oe02JBSON90x/ygAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[12]" type="UMLGeneralizationView" guid="HX/qU9TkPkaB2ZqONGxBzgAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">646,368;645,325</XPD:ATTR>
<XPD:REF name="Model">+5OzMhzHH0y2c8LzLGRCQQAA</XPD:REF>
<XPD:REF name="Head">RhNuxONOtE6ErnVtlW+P5AAA</XPD:REF>
<XPD:REF name="Tail">Ww6zG/aIKk6r4yv1aP6JogAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="IUmT3UtZhEiG5ipTTvUniQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">+5OzMhzHH0y2c8LzLGRCQQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="b+gcm6Xup0O7UqT5pwZk3gAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">+5OzMhzHH0y2c8LzLGRCQQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="oidyArL9oUq+6TY1drkmZwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">+5OzMhzHH0y2c8LzLGRCQQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[13]" type="UMLInterfaceView" guid="eHyv/+usbEuCBKnkT049WgAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">720</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">280</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">ee8KCeaKVEOoYTEhFF+74wAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="vMUCrEoWOkOYyn0AjtZYWwAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="k/YAK9Us5Uajtwl3fN1bLAAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">Lifecycle</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="XDOIipJUCUCcDZ1cbIcUMwAA">
<XPD:ATTR name="Text" type="string"><<interface>></XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="qG2E6XJwUESkV3KP8KCuHwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="FDnp7GWQBESTRCnFnDzVNwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">ee8KCeaKVEOoYTEhFF+74wAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="Bv0+xPtIs0Wtwjhje08wqgAA">
<XPD:REF name="Model">ee8KCeaKVEOoYTEhFF+74wAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[14]" type="UMLGeneralizationView" guid="G6zRJPFsakuKLgRSi7KTygAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">675,368;732,325</XPD:ATTR>
<XPD:REF name="Model">8rsbo5lEd0ejOg+/y1BADgAA</XPD:REF>
<XPD:REF name="Head">eHyv/+usbEuCBKnkT049WgAA</XPD:REF>
<XPD:REF name="Tail">Ww6zG/aIKk6r4yv1aP6JogAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="AjsAdbVXPUmZMMTjqWWuYAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">8rsbo5lEd0ejOg+/y1BADgAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="Yi6U7ac40kmLEOs6aRxI4QAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">8rsbo5lEd0ejOg+/y1BADgAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="DgwL2w84LkK4Efl48v9i4QAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">8rsbo5lEd0ejOg+/y1BADgAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[15]" type="UMLInterfaceView" guid="b4ReA2jJ+E+mJ/4xDNAorgAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">476</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">280</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">91</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">+hjyiKZOS0WGUUiuCb09JAAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="cpMIYZNGpEKcB9L0nlfr4wAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="7S0rvmXdzU+ylc7BXXBEDgAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">Closeable</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="LyBmqLufeEqIGeKLBZBuAQAA">
<XPD:ATTR name="Text" type="string"><<interface>></XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="rudSVhTTVEKT/+L4SETyPQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="5S3uRerwhEG4dmvZf3HtgwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">+hjyiKZOS0WGUUiuCb09JAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="F0oelcqLaEqeD9eYXUWq3wAA">
<XPD:REF name="Model">+hjyiKZOS0WGUUiuCb09JAAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[16]" type="UMLGeneralizationView" guid="MeEsUQMlBkyvpOXDUbdPIgAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">615,368;554,325</XPD:ATTR>
<XPD:REF name="Model">SlZZI2U2Wkyp62yqqBsJtQAA</XPD:REF>
<XPD:REF name="Head">b4ReA2jJ+E+mJ/4xDNAorgAA</XPD:REF>
<XPD:REF name="Tail">Ww6zG/aIKk6r4yv1aP6JogAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="5QvDhanFB0e+Skzs5+6YKAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">SlZZI2U2Wkyp62yqqBsJtQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="FFb5hgZdL06Ju1BrlNFNjgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">SlZZI2U2Wkyp62yqqBsJtQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="YJDY2O2eF02K/F/7SJcGbQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">SlZZI2U2Wkyp62yqqBsJtQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[17]" type="UMLClassView" guid="b1M21K3P20euCCbnUcl8IAAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">341</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">568</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">235</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">BEvxRapz30mKUXLDLkOXdQAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="WxoDsHXvdkWGJUkAFILLXgAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="8jgU/POxkEufGXN3Xd6DoAAA">
<XPD:ATTR name="FontStyle" type="integer">3</XPD:ATTR>
<XPD:ATTR name="Text" type="string">AbstractRefreshableApplicationContext</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="1d7vVK8nWESWU7X8OyGWlgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="7K+d0XJqKUW4HcwCCDd3BwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="AkySV+pJf0qj60axpdrbVwAA">
<XPD:REF name="Model">BEvxRapz30mKUXLDLkOXdQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="uU4iSkGgoESr6bxv8i/GeAAA">
<XPD:REF name="Model">BEvxRapz30mKUXLDLkOXdQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="4S2zc2MTtEqHFiOmjfJS7gAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">BEvxRapz30mKUXLDLkOXdQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[18]" type="UMLClassView" guid="za3NtrH5a0CG2UABkWyksAAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">323</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">644</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">270</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">vG4azfyb30Sm0o/6aGjWEQAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="Ru0hjb1KO0S9OuSuAJ5LbQAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="U2YwhrL3OEGMCYeCooCZawAA">
<XPD:ATTR name="FontStyle" type="integer">3</XPD:ATTR>
<XPD:ATTR name="Text" type="string">AbstractRefreshableConfigApplicationContext</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="xpNTignidEaY77Kc70AF9wAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="wcm7OoHa3kCAj0BjzktHOAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="lE4PyxcLY0ev21JpmeKbAAAA">
<XPD:REF name="Model">vG4azfyb30Sm0o/6aGjWEQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="UNr/QT8OCEWM+P6JWHS43AAA">
<XPD:REF name="Model">vG4azfyb30Sm0o/6aGjWEQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="ofgtYgevFEWkeA572rla9AAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">vG4azfyb30Sm0o/6aGjWEQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[19]" type="UMLGeneralizationView" guid="2oVPETvEjEqS5h3g160YUwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">458,568;458,522</XPD:ATTR>
<XPD:REF name="Model">N/1YApMrHk6T4MkcjuYIzgAA</XPD:REF>
<XPD:REF name="Head">vVX4w/Fjo0SpqY8HH1IZOAAA</XPD:REF>
<XPD:REF name="Tail">b1M21K3P20euCCbnUcl8IAAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="oiorDGlEG02P9h2NDeuGrAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">N/1YApMrHk6T4MkcjuYIzgAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="YhLT81SoP0S3Xw5FFwJLGgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">N/1YApMrHk6T4MkcjuYIzgAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="Uk2z6ftst0Si57bwONhDQAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">N/1YApMrHk6T4MkcjuYIzgAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[20]" type="UMLGeneralizationView" guid="bVaQjnyraES2hZtkEHp2xAAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">457,644;458,610</XPD:ATTR>
<XPD:REF name="Model">ydmglSpfoE6ccV5cTOnl1AAA</XPD:REF>
<XPD:REF name="Head">b1M21K3P20euCCbnUcl8IAAA</XPD:REF>
<XPD:REF name="Tail">za3NtrH5a0CG2UABkWyksAAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="N9d81uxS+EOdZaFcIUhOYAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">ydmglSpfoE6ccV5cTOnl1AAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="IBRQvyEqxE2Pz+/+2gSAywAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">ydmglSpfoE6ccV5cTOnl1AAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="s0AblGRrn0qs7cAvVx36OgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">ydmglSpfoE6ccV5cTOnl1AAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[21]" type="UMLClassView" guid="cEy5f8mLmk29ue2Cpu634wAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">364</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">732</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">188</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">7f8epg+O+k+uKbOI0O1HiQAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="Zd+zD2zdVUKkYkRWdeoG2wAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="yEQtEQXkikK9RWVj8Q7z8gAA">
<XPD:ATTR name="FontStyle" type="integer">3</XPD:ATTR>
<XPD:ATTR name="Text" type="string">AbstractXmlApplicationContext</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="mJTeXQGLckGfUWzY9IYD1QAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="UYetb9KVs0SDwqIzyxIXvQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="zTctQQEHHUmvtj7tDlgpQQAA">
<XPD:REF name="Model">7f8epg+O+k+uKbOI0O1HiQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="tvY/+yYNbUm/+6BSx+pSFwAA">
<XPD:REF name="Model">7f8epg+O+k+uKbOI0O1HiQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="aOanu9CkX06PXBEcvz0l1QAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">7f8epg+O+k+uKbOI0O1HiQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[22]" type="UMLGeneralizationView" guid="xDJmhl529kGhC5qs9Sg3nwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">457,732;457,686</XPD:ATTR>
<XPD:REF name="Model">bdADOSzxu0mwrZJqUENBhQAA</XPD:REF>
<XPD:REF name="Head">za3NtrH5a0CG2UABkWyksAAA</XPD:REF>
<XPD:REF name="Tail">cEy5f8mLmk29ue2Cpu634wAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="5ZH7SProOUSKDW6xHbPyvgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">bdADOSzxu0mwrZJqUENBhQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="M0jFfvxkO0GzlToVzBItOAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">bdADOSzxu0mwrZJqUENBhQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="4GpMRtnJi0axctTTAroVYgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">bdADOSzxu0mwrZJqUENBhQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[23]" type="UMLClassView" guid="RO2/uQZxp0CgJC07rDqETAAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">184</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">824</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">194</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">bwDhV6aKRUCQaDjn/WyE7QAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="xgrTH/wBuUKIaUNCYNlV4AAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="dIjbYiTE3UuE1AhqEewfZAAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">ClassPathXmlApplicationContext</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="CxjUuQn2Wk2nGJ79SaIGMQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="4pfm8B0lxUyV6Ks/PSR49gAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="IADXKAmMVk6AIDMNJuQvEAAA">
<XPD:REF name="Model">bwDhV6aKRUCQaDjn/WyE7QAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="TP7ftFaSCk6V7nT28ZNRjQAA">
<XPD:REF name="Model">bwDhV6aKRUCQaDjn/WyE7QAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="U8wfIlo5sUKsJu8ahW+jOgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">bwDhV6aKRUCQaDjn/WyE7QAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[24]" type="UMLGeneralizationView" guid="nXwvx56H7EW9dUZlPvl1KwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">320,824;416,774</XPD:ATTR>
<XPD:REF name="Model">kY7rdRF4kkinvt0VxJ7uIgAA</XPD:REF>
<XPD:REF name="Head">cEy5f8mLmk29ue2Cpu634wAA</XPD:REF>
<XPD:REF name="Tail">RO2/uQZxp0CgJC07rDqETAAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="myld8Zoq60anZt+bcg9+yQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">kY7rdRF4kkinvt0VxJ7uIgAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="mZLDcxGfw022A7RIHq7s3AAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">kY7rdRF4kkinvt0VxJ7uIgAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="1g4Ec87WxkKQPoxEAEseCgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">kY7rdRF4kkinvt0VxJ7uIgAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[25]" type="UMLClassView" guid="E31vXkuFTU2cGOlESZ4+MwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">540</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">824</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">201</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">RKe4WUWHGkyRUnbG2YLMOAAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="KN4MFz1F60OO+WoUx7eZJwAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="M8kxpgBbOEWTXnJK1A0o9wAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">FileSystemXmlApplicationContext</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="F/cEmYezFEGTN+XhdAFMIQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="revEaQMzrkeEWLaph4BVRgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="TNcuxzxyMEyHJEB0u0jeHgAA">
<XPD:REF name="Model">RKe4WUWHGkyRUnbG2YLMOAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="XMB62mEURkyePP+mxe3yHgAA">
<XPD:REF name="Model">RKe4WUWHGkyRUnbG2YLMOAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="7XqcQ04oIE6+hrG7PePkdAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">RKe4WUWHGkyRUnbG2YLMOAAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[26]" type="UMLGeneralizationView" guid="acfRmF+nq0S4IdD6qbcfRAAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">598,824;499,774</XPD:ATTR>
<XPD:REF name="Model">8nrl4fwzgkON2nfuT1s/0AAA</XPD:REF>
<XPD:REF name="Head">cEy5f8mLmk29ue2Cpu634wAA</XPD:REF>
<XPD:REF name="Tail">E31vXkuFTU2cGOlESZ4+MwAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="TGp5wTtxfEmaVRgw1jf2jwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">8nrl4fwzgkON2nfuT1s/0AAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="BuwNeNP8P0qTQpb5SaQ2vgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">8nrl4fwzgkON2nfuT1s/0AAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="3PaOh6cwpU+rHbtTPcY1TwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">8nrl4fwzgkON2nfuT1s/0AAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[27]" type="UMLInterfaceView" guid="HszryEnpakOIzpKytGidmgAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">476</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">176</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">156</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">x+tOUV3JJ0eR8grB2+LwEQAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="BoDzy8P/xE2WlTFzC1oUdgAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="Wbj1nk/OmESz7cX1huv5CAAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">ResourcePatternResolver</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="YaaCSmpyJEKRNRXiEeCk+gAA">
<XPD:ATTR name="Text" type="string"><<interface>></XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="mtPp4fANNUGOV8bSb9xavwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="qBaNOyvfP0u86c9Y2/HX/QAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">x+tOUV3JJ0eR8grB2+LwEQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="36FOkcQF902plEto6qmACwAA">
<XPD:REF name="Model">x+tOUV3JJ0eR8grB2+LwEQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[28]" type="UMLGeneralizationView" guid="2Zemx6dyQ0GAmMZYD+iQ0QAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">546,176;529,123</XPD:ATTR>
<XPD:REF name="Model">InhEbs8I+0CMZAwDfz2vBwAA</XPD:REF>
<XPD:REF name="Head">NU3XTWc/BEu77lxkyrdlLwAA</XPD:REF>
<XPD:REF name="Tail">HszryEnpakOIzpKytGidmgAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="OWsyhBRYw0qkdpAv//z3vgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">InhEbs8I+0CMZAwDfz2vBwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="xBe7hQJjnU+jT9rFp6dBbAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">InhEbs8I+0CMZAwDfz2vBwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="b8+sgOnYfE+US48fBn8QFQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">InhEbs8I+0CMZAwDfz2vBwAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[29]" type="UMLGeneralizationView" guid="7wMx8sx+P0OLoilsMNiMqgAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">626,280;573,221</XPD:ATTR>
<XPD:REF name="Model">/Kjepn435U63gwWJNiOjDwAA</XPD:REF>
<XPD:REF name="Head">HszryEnpakOIzpKytGidmgAA</XPD:REF>
<XPD:REF name="Tail">RhNuxONOtE6ErnVtlW+P5AAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="/qdkx776ckuyx7cy23TuhQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">/Kjepn435U63gwWJNiOjDwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="e/fb9MpwakKAE4fWt9HDLgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">/Kjepn435U63gwWJNiOjDwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="SuU9EPUwykihZc5gpKpiOQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">/Kjepn435U63gwWJNiOjDwAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[30]" type="UMLClassView" guid="V6FF4cCSyUacM01kBh2auQAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">728</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">176</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">234</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">oEcpdaUjcE+VohLe8ZGszwAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="rNh5m4DEuE2xpdRXEhevRgAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="oAcXxFY+kE6J7uRGUgf82gAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">PathMatchingResourcePatternResolver</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="8Ixo0+EsG0uYuxwqPxQNxgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="P79gMTHCFEi8epOeTh/wOAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="12CktCN2fEaJvFPQefVHiwAA">
<XPD:REF name="Model">oEcpdaUjcE+VohLe8ZGszwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="YhSv30xE6U6BZSg1MqViSgAA">
<XPD:REF name="Model">oEcpdaUjcE+VohLe8ZGszwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="R90bOEppikuHmNZOpeG55AAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">oEcpdaUjcE+VohLe8ZGszwAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[31]" type="UMLRealizationView" guid="7f/GZ/2SoUaYo7IEcV1UEgAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">728,197;631,198</XPD:ATTR>
<XPD:REF name="Model">TMcQc6cj+0elJ1lhIi9bMwAA</XPD:REF>
<XPD:REF name="Head">HszryEnpakOIzpKytGidmgAA</XPD:REF>
<XPD:REF name="Tail">V6FF4cCSyUacM01kBh2auQAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="TVuAgls1hUy9MssBxkGwygAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">TMcQc6cj+0elJ1lhIi9bMwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="MJMWR5IS9Eewt0PGBnh/owAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">TMcQc6cj+0elJ1lhIi9bMwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="DWtFiZGjokOkKsgS30uDiAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">TMcQc6cj+0elJ1lhIi9bMwAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedDiagrams[1]" type="UMLClassDiagram" guid="Oiyf7EtOLkanokZOfyZDDQAA">
<XPD:ATTR name="Name" type="string">ConfigurableEnvironment</XPD:ATTR>
<XPD:REF name="DiagramOwner">6eooFiJdkE+izOOxrEuNTgAA</XPD:REF>
<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="21u0LsCORE2ZZqfi5U/9wQAA">
<XPD:REF name="Diagram">Oiyf7EtOLkanokZOfyZDDQAA</XPD:REF>
<XPD:ATTR name="#OwnedViews" type="integer">12</XPD:ATTR>
<XPD:OBJ name="OwnedViews[0]" type="UMLInterfaceView" guid="B9nUanQiZ0+dR7vyBeQd3AAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">355</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">356</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">212</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">137</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">6fDpx4Z0oE+lqShTNgTq4gAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="tMxVPP0x0U27cG4x5WMpiAAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="sCUf1AAdI0KA9irgrBV5KQAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">ConfigurableEnvironment</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="/2sSxq/Q+kaOctH0zTjvQgAA">
<XPD:ATTR name="Text" type="string"><<interface>></XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="Sk1FFpJmY0qX1CgARHMKuAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="62GJZWNb3kGW8lvbdXrF/wAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">6fDpx4Z0oE+lqShTNgTq4gAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="9c/uTjSL4kqcYF9spgBAGAAA">
<XPD:REF name="Model">6fDpx4Z0oE+lqShTNgTq4gAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[1]" type="UMLInterfaceView" guid="JU4rd2CXeUq5O1oSynLO+gAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">232</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">176</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">176</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">85</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">zNpfuAeTv0CHYXvyiPz6qAAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="mH34K7Ru4EGQ26Wy+o92BAAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="hC4atTdmkk6bxp3ag9TYeAAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">Environment</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="IYu1apgWlUis/P3c9o/wowAA">
<XPD:ATTR name="Text" type="string"><<interface>></XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="4xqwgha3+0CZDmed3h5lbgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="uwXj0gY4IUOaOeL7eDnmEAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">zNpfuAeTv0CHYXvyiPz6qAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="8FJypH974EixzEALUc+qDQAA">
<XPD:REF name="Model">zNpfuAeTv0CHYXvyiPz6qAAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[2]" type="UMLInterfaceView" guid="5EhYNoGMh0yhz7RELV8J9QAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">556</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">176</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">229</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">150</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">7o7slMxw8U6wYjL/SpggfQAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="qVqDUN5AJES6NS5hhe2VIAAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="uVKY7FnfsUuMbHZKYEvxwwAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">ConfigurablePropertyResolver</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="mIY3x5I1xk2ZNxsfRAdjrwAA">
<XPD:ATTR name="Text" type="string"><<interface>></XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="6Nl7Yh1ZgUir7SkHhNFDDAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="kc5YNI6cOUSXTSmwtX7URQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">7o7slMxw8U6wYjL/SpggfQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="k0GirobD2kmbl1VqlhjajQAA">
<XPD:REF name="Model">7o7slMxw8U6wYjL/SpggfQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[3]" type="UMLInterfaceView" guid="a5b8rUTFSU6eNyJViR3kmQAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">360</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">28</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">215</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">111</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">o+9xVF4/XEOG2aXyxsD6IgAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="URfdztrxw0KLPGPifznnCwAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="Tvcu8Zzr80mGKlAzy8PUlQAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">PropertyResolver</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="1YAl+BQu/Umsf8gIyrOT8AAA">
<XPD:ATTR name="Text" type="string"><<interface>></XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="YJ6S1ZPfkkC188MfNv8ewAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="FX+NsuhvDEqwSo/rwtJgIgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">o+9xVF4/XEOG2aXyxsD6IgAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="MVQ7AxYUf0OzelP5Xcbd2gAA">
<XPD:REF name="Model">o+9xVF4/XEOG2aXyxsD6IgAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[4]" type="UMLGeneralizationView" guid="8V+7RV1RG02QylvWfG2gsQAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">365,176;407,138</XPD:ATTR>
<XPD:REF name="Model">HF+GEY83GkCZ6Yqs9FfMawAA</XPD:REF>
<XPD:REF name="Head">a5b8rUTFSU6eNyJViR3kmQAA</XPD:REF>
<XPD:REF name="Tail">JU4rd2CXeUq5O1oSynLO+gAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="K9eYKhjUW0KyvyRDNVS1JQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">HF+GEY83GkCZ6Yqs9FfMawAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="s3/YDZPv/EWCNz1AscUJZAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">HF+GEY83GkCZ6Yqs9FfMawAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="X1dAQLj1AEui/ZjW+KaTtwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">HF+GEY83GkCZ6Yqs9FfMawAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[5]" type="UMLGeneralizationView" guid="qbWP/Hd+aEmynryUQDJ9oAAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">580,176;534,138</XPD:ATTR>
<XPD:REF name="Model">BYgb8uTd4EqLQdcqgzTcBgAA</XPD:REF>
<XPD:REF name="Head">a5b8rUTFSU6eNyJViR3kmQAA</XPD:REF>
<XPD:REF name="Tail">5EhYNoGMh0yhz7RELV8J9QAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="O7xjQSbbRU2oHjG8SwzzlgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">BYgb8uTd4EqLQdcqgzTcBgAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="1efICpQeuUCWnPuQZxs8JgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">BYgb8uTd4EqLQdcqgzTcBgAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="SkPMhMjojUSENvYHZpx+mgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">BYgb8uTd4EqLQdcqgzTcBgAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[6]" type="UMLGeneralizationView" guid="YqYtRmHFQEy5cM2DB4XizQAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">413,356;348,260</XPD:ATTR>
<XPD:REF name="Model">+Qm8UlzpdUyxCU0bLIKOAQAA</XPD:REF>
<XPD:REF name="Head">JU4rd2CXeUq5O1oSynLO+gAA</XPD:REF>
<XPD:REF name="Tail">B9nUanQiZ0+dR7vyBeQd3AAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="3K6HhLVnNEyvG61GNdvXaQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">+Qm8UlzpdUyxCU0bLIKOAQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="cga3BCDQD0G0btfJm+lWPQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">+Qm8UlzpdUyxCU0bLIKOAQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="F5PCqs5V902uUaxnGg3PxwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">+Qm8UlzpdUyxCU0bLIKOAQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[7]" type="UMLGeneralizationView" guid="V+PQ8kMzKEy9haj2IH73MQAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">542,356;579,325</XPD:ATTR>
<XPD:REF name="Model">TzUjz9Nka0C8+kIktnFFHwAA</XPD:REF>
<XPD:REF name="Head">5EhYNoGMh0yhz7RELV8J9QAA</XPD:REF>
<XPD:REF name="Tail">B9nUanQiZ0+dR7vyBeQd3AAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="/myp5+UDTEiHdcsgF+by1gAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">TzUjz9Nka0C8+kIktnFFHwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="NW3g58N8bEmYltMPfsCmkAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">TzUjz9Nka0C8+kIktnFFHwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="iJ65vh9oqECCdKvL20T0AAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">TzUjz9Nka0C8+kIktnFFHwAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[8]" type="UMLClassView" guid="2m8MXGGfjEaAGMZtFvak+wAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">396</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">528</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">131</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">U2qPzJOpRkCvX1DbVs6SrQAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="KoUJ3Jit3kOPC4PDb88KogAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="+Wg44xQ5OE2KbnLLn4d3wQAA">
<XPD:ATTR name="FontStyle" type="integer">3</XPD:ATTR>
<XPD:ATTR name="Text" type="string">AbstractEnvironment</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="BZgBJTP+DU+PBooWX7GpFgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="pQ2PbnKsekmhQ2Kn9bP34wAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="URTO3sKW4Ey7Ma+qR2WXvgAA">
<XPD:REF name="Model">U2qPzJOpRkCvX1DbVs6SrQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="SqO4ecggqEqXBm1nahtm9QAA">
<XPD:REF name="Model">U2qPzJOpRkCvX1DbVs6SrQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="GAAjZ/o540aC20zRal62xQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">U2qPzJOpRkCvX1DbVs6SrQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[9]" type="UMLRealizationView" guid="oUrY8Oed7UKiv1JCyIj1xgAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">461,528;461,492</XPD:ATTR>
<XPD:REF name="Model">KLt4j+zlZEC/zyo8wIwIsAAA</XPD:REF>
<XPD:REF name="Head">B9nUanQiZ0+dR7vyBeQd3AAA</XPD:REF>
<XPD:REF name="Tail">2m8MXGGfjEaAGMZtFvak+wAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="kfnFdRktFUOGpDMcd30g/QAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">KLt4j+zlZEC/zyo8wIwIsAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="y0VMP42d/ka0f/BEuTieXQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">KLt4j+zlZEC/zyo8wIwIsAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="xeLYDzN3L0WEVyFi24whfgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">KLt4j+zlZEC/zyo8wIwIsAAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[10]" type="UMLClassView" guid="9sMhYAElmE+RHevd0NuZVwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">394</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">604</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">134</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">IYFxpkg1GUW6ltuJ1xoblgAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="P04LoDZYvEO931aWo/RyYQAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="PehXP+vIiEqO3+0g/CX4tgAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">StandardEnvironment</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="G2dl+L+fl0mG9TxHYZOlCQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="ONXJUlRIdkyFXKFQi1ba2QAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="5OSUeD2iWECAe0qcdlHMcgAA">
<XPD:REF name="Model">IYFxpkg1GUW6ltuJ1xoblgAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="nHaW/LQW7EykODBh6rgIKQAA">
<XPD:REF name="Model">IYFxpkg1GUW6ltuJ1xoblgAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="P9jQWcJ3ukacagpz2oefxwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">IYFxpkg1GUW6ltuJ1xoblgAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[11]" type="UMLGeneralizationView" guid="Oq2YiRhHkUGsbeAiozo09AAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">460,604;461,570</XPD:ATTR>
<XPD:REF name="Model">xDyK7cccMUOOT5OFqWOh0QAA</XPD:REF>
<XPD:REF name="Head">2m8MXGGfjEaAGMZtFvak+wAA</XPD:REF>
<XPD:REF name="Tail">9sMhYAElmE+RHevd0NuZVwAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Q5P05BaxHkKU/tmRhDmptwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">xDyK7cccMUOOT5OFqWOh0QAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="y2dyvOw3hE+dIrrAEOdMqgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">xDyK7cccMUOOT5OFqWOh0QAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="jnk4NZn0i0WkFAGAwdTvmgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">xDyK7cccMUOOT5OFqWOh0QAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedDiagrams[2]" type="UMLClassDiagram" guid="4SHqd0e/YEqjYJnOAop2EwAA">
<XPD:ATTR name="Name" type="string">PropertyResolver</XPD:ATTR>
<XPD:REF name="DiagramOwner">6eooFiJdkE+izOOxrEuNTgAA</XPD:REF>
<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="bdUrE7yPgEq3wZPpvizAAAAA">
<XPD:REF name="Diagram">4SHqd0e/YEqjYJnOAop2EwAA</XPD:REF>
<XPD:ATTR name="#OwnedViews" type="integer">7</XPD:ATTR>
<XPD:OBJ name="OwnedViews[0]" type="UMLInterfaceView" guid="HZq7QedB50yN7+dKMGewygAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">335</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">32</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">215</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">111</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">o+9xVF4/XEOG2aXyxsD6IgAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="Dg44da6240SXYq5nT2IFnQAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="BRHbSBfvJEuepgKlXvLplQAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">PropertyResolver</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="crUr2IY7mkymlY4pP3dkNwAA">
<XPD:ATTR name="Text" type="string"><<interface>></XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="1BYyiK5TsEq4Xbp0+5l9BQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="C9q+WPXsCEmSKDOmeMekYQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">o+9xVF4/XEOG2aXyxsD6IgAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="JfPvvDnZdEG9FMu8OGEQagAA">
<XPD:REF name="Model">o+9xVF4/XEOG2aXyxsD6IgAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[1]" type="UMLInterfaceView" guid="G6EgxRu3iESOftCYzr7hKwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">328</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">181</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">229</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">150</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">7o7slMxw8U6wYjL/SpggfQAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="R43Is3oRyUKhdNh/3IXX+QAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="mM0WLgYCbkygUjxO3JPdngAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">ConfigurablePropertyResolver</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="uJx1jFct/kS+2MLx6OrpFgAA">
<XPD:ATTR name="Text" type="string"><<interface>></XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="WJoxUm0oXE6TkYJTktJodwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="x6lUigIx1E2atFbor/XfMgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">7o7slMxw8U6wYjL/SpggfQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="sMnPA/LmhUeHiXlHVLJYxQAA">
<XPD:REF name="Model">7o7slMxw8U6wYjL/SpggfQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[2]" type="UMLGeneralizationView" guid="nysR+PGMk0CHldObg0W/jAAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">442,181;442,142</XPD:ATTR>
<XPD:REF name="Model">wnSe2lju2ke2O4aFMiYoogAA</XPD:REF>
<XPD:REF name="Head">HZq7QedB50yN7+dKMGewygAA</XPD:REF>
<XPD:REF name="Tail">G6EgxRu3iESOftCYzr7hKwAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="oHSxl7rIAEeyjzQs5e1nfgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">wnSe2lju2ke2O4aFMiYoogAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="j3gOjRCjl0KH/riZg/BCMQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">wnSe2lju2ke2O4aFMiYoogAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="N/XeFs/CXEiYAbPOVhk0tAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">wnSe2lju2ke2O4aFMiYoogAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="tor9R18wUUKqgvrlGMSeUQAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">363</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">369</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">159</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">RLzPzaZKbkqBCDJxNtoqHwAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="16/TYe9EqE+h3u2lGcPqmAAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="FUmjNpniRUayvBizNXKoeQAA">
<XPD:ATTR name="FontStyle" type="integer">3</XPD:ATTR>
<XPD:ATTR name="Text" type="string">AbstractPropertyResolver</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="E9xXNqSGB0iejqL8uiugzwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="1rAuwjSWGU6KTG4RvGzRhgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="XS0kPOtqtUqxA3DiMW5hhgAA">
<XPD:REF name="Model">RLzPzaZKbkqBCDJxNtoqHwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="Esda/eLXGE2QGjT1qYUwewAA">
<XPD:REF name="Model">RLzPzaZKbkqBCDJxNtoqHwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="2jHxJsqFLEKQImtSTXnZnwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">RLzPzaZKbkqBCDJxNtoqHwAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[4]" type="UMLClassView" guid="a/YjgFWCQUmrY/yWS0BVPwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">340</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">450</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">205</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">QamtjQLIykeMrM86VPsKvwAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="p+r76AzAkUeQdf1znUK+WAAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="VU+wzC/TrE2bTw96UahDFAAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">PropertySourcesPropertyResolver</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="JNeTEPO5NUCw8ZKJRnLmogAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="QHflcdXUm0KvXyCTkUPkxQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="kO4HEgmcnku8waShhB54DgAA">
<XPD:REF name="Model">QamtjQLIykeMrM86VPsKvwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="UnghAp8Lkku2yWjWPKQVsQAA">
<XPD:REF name="Model">QamtjQLIykeMrM86VPsKvwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="IV7T+QDrqkyzCesgJAzCvQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">QamtjQLIykeMrM86VPsKvwAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[5]" type="UMLRealizationView" guid="q/VR2TibYkeBdmmBAcje1QAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">442,369;442,330</XPD:ATTR>
<XPD:REF name="Model">A5urUBuY3kOveBe9Y7cMowAA</XPD:REF>
<XPD:REF name="Head">G6EgxRu3iESOftCYzr7hKwAA</XPD:REF>
<XPD:REF name="Tail">tor9R18wUUKqgvrlGMSeUQAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="OcF1PXdnAkuYOc4FlzMPkAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">A5urUBuY3kOveBe9Y7cMowAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="9YjNZV7eW0St2PIVx18migAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">A5urUBuY3kOveBe9Y7cMowAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="wxBjtfWvTkqNgUDvE2H5tgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">A5urUBuY3kOveBe9Y7cMowAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[6]" type="UMLGeneralizationView" guid="skZxQQ4qTUCw3czPvjd+HwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">442,450;442,411</XPD:ATTR>
<XPD:REF name="Model">8eLpR7FB506iTAVPSArCWAAA</XPD:REF>
<XPD:REF name="Head">tor9R18wUUKqgvrlGMSeUQAA</XPD:REF>
<XPD:REF name="Tail">a/YjgFWCQUmrY/yWS0BVPwAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="a8dAAn7MX0GCDWSeLyTLDQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">8eLpR7FB506iTAVPSArCWAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="2x1oQHsuL0mWbEqf73sSzAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">8eLpR7FB506iTAVPSArCWAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="MbKz6Aao+02syQk5w56aPAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">8eLpR7FB506iTAVPSArCWAAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedDiagrams[3]" type="UMLClassDiagram" guid="4NEXeJMwYUKjiUnNNLxcDwAA">
<XPD:ATTR name="Name" type="string">PropertySources</XPD:ATTR>
<XPD:REF name="DiagramOwner">6eooFiJdkE+izOOxrEuNTgAA</XPD:REF>
<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="DXb0R3zHA0SaJiXlfRRKbwAA">
<XPD:REF name="Diagram">4NEXeJMwYUKjiUnNNLxcDwAA</XPD:REF>
<XPD:ATTR name="#OwnedViews" type="integer">3</XPD:ATTR>
<XPD:OBJ name="OwnedViews[0]" type="UMLInterfaceView" guid="CHlyWQxxa0SP1SOKFaZzbwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">334</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">72</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">123</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">72</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">lvuOCBQu4UKGWuwv3KJ6XAAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="xl+UWhvY4Eq74UEaj6jSMgAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="97UZ8SU5iUmfmAyJ3NC5ZgAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">PropertySources</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="5FAS6x4jt0CaU8/HI+E61wAA">
<XPD:ATTR name="Text" type="string"><<interface>></XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="DqYDJXCkcEiNJJaPp7KuUwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="XoEKXzBcw0iZlNfg1UKDJgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">lvuOCBQu4UKGWuwv3KJ6XAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="5VkQ+PmZIE+jo1QXw82mcwAA">
<XPD:REF name="Model">lvuOCBQu4UKGWuwv3KJ6XAAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="ChdJsqHB7kesOs7b1GoIkAAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">320</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">208</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">151</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">0OUP6eP1AUC4WGSMr6C8wAAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="tJwhW7DgOU+RKpXrW2DxlgAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="AVUkGHgJS0i9Xovfigq9JQAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">MutablePropertySources</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="8wyIjd8bHUCHwGf1Dn4JUAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="4wHQDMYVMk6bc9xFcaVsfAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="ugkLh5W6mUmKBEMxAQJn1QAA">
<XPD:REF name="Model">0OUP6eP1AUC4WGSMr6C8wAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="TFv6W8VM9kWN3Y6jCrMw1AAA">
<XPD:REF name="Model">0OUP6eP1AUC4WGSMr6C8wAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="Ctnzcp2ENUu1Ku9gJFMA0AAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">0OUP6eP1AUC4WGSMr6C8wAAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[2]" type="UMLRealizationView" guid="LUewY+AzQk+cp7n8tzJz8gAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">395,208;395,143</XPD:ATTR>
<XPD:REF name="Model">aCAB2g8V7E6cGUsFmYii9AAA</XPD:REF>
<XPD:REF name="Head">CHlyWQxxa0SP1SOKFaZzbwAA</XPD:REF>
<XPD:REF name="Tail">ChdJsqHB7kesOs7b1GoIkAAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="puAKyVxptEmd7tAkCToCEQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">aCAB2g8V7E6cGUsFmYii9AAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="WQmR8iJcSkWL0ZB3tQUjgAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">aCAB2g8V7E6cGUsFmYii9AAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="/QzJxdKtlk6ZTOsugOG5rQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">aCAB2g8V7E6cGUsFmYii9AAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedDiagrams[4]" type="UMLClassDiagram" guid="LHYk1r9FqUi3cSmKzM65rAAA">
<XPD:ATTR name="Name" type="string">PropertySource</XPD:ATTR>
<XPD:REF name="DiagramOwner">6eooFiJdkE+izOOxrEuNTgAA</XPD:REF>
<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="wSaA/LEQtEi9U03wEXftHwAA">
<XPD:REF name="Diagram">LHYk1r9FqUi3cSmKzM65rAAA</XPD:REF>
<XPD:ATTR name="#OwnedViews" type="integer">21</XPD:ATTR>
<XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="8csK9TqyK0iTF2cDno0EjwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">296</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">36</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">166</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">95</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">uKLIVLILH0iIM0N6VBXa5gAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="YQEp7w9ZdE6h99W8hQll3AAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="0YUjCRGzm0eqqJUY2miaGwAA">
<XPD:ATTR name="FontStyle" type="integer">3</XPD:ATTR>
<XPD:ATTR name="Text" type="string">PropertySource</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="p4+oYsPcuUS2nGGOaadEHwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="zddMERy/EECwfyKS+USWNQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="VHxmwMJvv0mrW/FHOEQWEQAA">
<XPD:REF name="Model">uKLIVLILH0iIM0N6VBXa5gAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="kw3o4Fhwik+HGDnqRceqiwAA">
<XPD:REF name="Model">uKLIVLILH0iIM0N6VBXa5gAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="iRzdrHOYZU2Q/hUtALmhEAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">uKLIVLILH0iIM0N6VBXa5gAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="XoDV+uDukUS0zm6Fpkp2vgAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">436</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">180</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">166</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">69</XPD:ATTR>
<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkNone</XPD:ATTR>
<XPD:REF name="Model">BKNWKXJ33U2ch95k1yoQKAAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="EM+7kqevv0KCDCCYvMzkiwAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="F3Lt+xG+60Kx+I20Cn3SzAAA">
<XPD:ATTR name="FontStyle" type="integer">3</XPD:ATTR>
<XPD:ATTR name="Text" type="string">EnumerablePropertySource</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="NUzTyjmrMkaPjx3g3LysTwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="twdNsf5pHkCxOL0Qcnjk9QAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="sDFUtpe/vkK29lRZMCz+1QAA">
<XPD:REF name="Model">BKNWKXJ33U2ch95k1yoQKAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="cKSiOsse3E68KFPHam3wsQAA">
<XPD:REF name="Model">BKNWKXJ33U2ch95k1yoQKAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="899EhNlGOEK583ghHbi4rgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">BKNWKXJ33U2ch95k1yoQKAAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[2]" type="UMLGeneralizationView" guid="SjvkVHopK0SljbrBb4k3cwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">482,180;428,130</XPD:ATTR>
<XPD:REF name="Model">InTQiC10q0Kt6ksLH2t5iAAA</XPD:REF>
<XPD:REF name="Head">8csK9TqyK0iTF2cDno0EjwAA</XPD:REF>
<XPD:REF name="Tail">XoDV+uDukUS0zm6Fpkp2vgAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="ekMYdhOqrU6LDfaLJU40bgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">InTQiC10q0Kt6ksLH2t5iAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="BRqxY//QzUe48/zQmnmRkQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">InTQiC10q0Kt6ksLH2t5iAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="AHnUm4rhkku5yKI+CXE2VQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">InTQiC10q0Kt6ksLH2t5iAAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="KCLoNKRN7ES3CAM4YfQiuQAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">212</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">300</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">179</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">69</XPD:ATTR>
<XPD:REF name="Model">xs3Z2C3rzEqitr//pReeSgAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="zGK6fly2K0+rO/EFCSUYogAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="aLNrdTmw4EqrGS61U6wc5QAA">
<XPD:ATTR name="FontStyle" type="integer">3</XPD:ATTR>
<XPD:ATTR name="Text" type="string">CommandLinePropertySource</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="3RjOx7XomkS4yY3gi7P5swAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="RJpDOma7vUaTx8Vs+oAKVgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="8zfUC5weoUCANCZJkFa7dAAA">
<XPD:REF name="Model">xs3Z2C3rzEqitr//pReeSgAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="30c1Aj2FOUeZhfzdAZBWmwAA">
<XPD:REF name="Model">xs3Z2C3rzEqitr//pReeSgAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="rdLEORBaXEW77wH20drq7QAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">xs3Z2C3rzEqitr//pReeSgAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[4]" type="UMLClassView" guid="phIXYmv+EU6496bxNEHSRwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">76</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">416</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">205</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
<XPD:REF name="Model">TsG4o5o8NkG74GpCuneMcAAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="eN/WkLwWKECd95wTXosfUAAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="BUdP49+8xk+1uswRxPGYTQAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">JOptCommandLinePropertySource</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="H3m4y7m0MU2xhpWvNaPEYgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="6P1/LGnIRkmQsYhlp1YLDgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="QYAbfjC6M0eKMDWYzA8hhgAA">
<XPD:REF name="Model">TsG4o5o8NkG74GpCuneMcAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="9mT6uAtkq0uRJAqtkRVZuQAA">
<XPD:REF name="Model">TsG4o5o8NkG74GpCuneMcAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="iH81cL9R5UuzavmmFwIxHwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">TsG4o5o8NkG74GpCuneMcAAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[5]" type="UMLClassView" guid="Wv9xhASwc0i9XRzl95H4mwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">312</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">416</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">217</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
<XPD:REF name="Model">edMcCT5eYUuD0KsIHKT+owAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="eph7VaS2ikiGZUk7UKmeHQAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="IbOxOL6/0EiLwgMPaBAyQQAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">SimpleCommandLinePropertySource</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="0PWmcqCNV0WZhemfZ3JqkwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="bzIbQRSxVkiig4pFBKZ3RwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="1ON9RnG0OE6lIAHJlvLF+QAA">
<XPD:REF name="Model">edMcCT5eYUuD0KsIHKT+owAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="uucD8wu+rk+UrmyALNffjwAA">
<XPD:REF name="Model">edMcCT5eYUuD0KsIHKT+owAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="EXd13Ao3UkecKrDp5K5ohwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">edMcCT5eYUuD0KsIHKT+owAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[6]" type="UMLGeneralizationView" guid="mGSkuKC/Z0SUcrFHcE4hAwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">362,300;456,248</XPD:ATTR>
<XPD:REF name="Model">oRAMqatnvkW7ae2M0Bu9GwAA</XPD:REF>
<XPD:REF name="Head">XoDV+uDukUS0zm6Fpkp2vgAA</XPD:REF>
<XPD:REF name="Tail">KCLoNKRN7ES3CAM4YfQiuQAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="arjnphh+PEWoAD15oEJKcAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">oRAMqatnvkW7ae2M0Bu9GwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="jgMuGfVbekeUnUdEGptScAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">oRAMqatnvkW7ae2M0Bu9GwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="FK+m/E5NgkuhZDQP+ay97wAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">oRAMqatnvkW7ae2M0Bu9GwAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[7]" type="UMLGeneralizationView" guid="GBmM70zFnkqjK7rDpZvVFgAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">203,416;260,368</XPD:ATTR>
<XPD:REF name="Model">rb4CKSf44k25SENMlHVQlAAA</XPD:REF>
<XPD:REF name="Head">KCLoNKRN7ES3CAM4YfQiuQAA</XPD:REF>
<XPD:REF name="Tail">phIXYmv+EU6496bxNEHSRwAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="5apRid3dsUmLd+Ntk3THGAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">rb4CKSf44k25SENMlHVQlAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="/c0iEwxiG0iba2ZLHMkdsgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">rb4CKSf44k25SENMlHVQlAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="PURLptucOUyJRPR8rZSg8wAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">rb4CKSf44k25SENMlHVQlAAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[8]" type="UMLGeneralizationView" guid="ee/pu6SR70OkNLdeHLyzXwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">396,416;340,368</XPD:ATTR>
<XPD:REF name="Model">xef0ENo/NEiq/PTeYl2dOQAA</XPD:REF>
<XPD:REF name="Head">KCLoNKRN7ES3CAM4YfQiuQAA</XPD:REF>
<XPD:REF name="Tail">Wv9xhASwc0i9XRzl95H4mwAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="avs+tEXfcEigkiLovGReUgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">xef0ENo/NEiq/PTeYl2dOQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="kptRCYagGkOYxshBU6PQlQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">xef0ENo/NEiq/PTeYl2dOQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="AanXpTAb9EidWR8ktkcIgQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">xef0ENo/NEiq/PTeYl2dOQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[9]" type="UMLClassView" guid="33AoohI68US7useFrK+d6gAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">421</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">300</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">165</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">82</XPD:ATTR>
<XPD:REF name="Model">riXQVdXIZ02zm0NuVBhf2wAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="iqc19Gqvt0yz8enAQ4Ue2wAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="IuaA2K91fE2GmOfd3cI5sgAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">CompositePropertySource</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="2ac2Kg32KUG/Eq5Bz7UEMwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="WXyEkcPMIEOdGOp9fjlIrwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="+4N51swY+kqFaugLZe0wowAA">
<XPD:REF name="Model">riXQVdXIZ02zm0NuVBhf2wAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="TuN9xzCK+ECiBpsA5Rc8rwAA">
<XPD:REF name="Model">riXQVdXIZ02zm0NuVBhf2wAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="9h7tpcBGckmfATQxlj9yrQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">riXQVdXIZ02zm0NuVBhf2wAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[10]" type="UMLGeneralizationView" guid="Vi2BAjljNUexRKhBXEIXTgAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">508,300;514,248</XPD:ATTR>
<XPD:REF name="Model">7M2c3nbLw02QGVZD1J86tAAA</XPD:REF>
<XPD:REF name="Head">XoDV+uDukUS0zm6Fpkp2vgAA</XPD:REF>
<XPD:REF name="Tail">33AoohI68US7useFrK+d6gAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="wNo1IEUshEufpgLEwlYfOgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">7M2c3nbLw02QGVZD1J86tAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="i6pF7a4kx0a+LMe6J+BEzgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">7M2c3nbLw02QGVZD1J86tAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="bwEaL1swyEykfyxP8o/6AQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">7M2c3nbLw02QGVZD1J86tAAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[11]" type="UMLClassView" guid="ofVZ47URd0q//8gDOJ1aYQAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">616</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">300</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">165</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">82</XPD:ATTR>
<XPD:REF name="Model">0G95rtMbMkGOVGNGUylrTwAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="4yF0ssNJBU+rwDVt89tWyQAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="1CY81SdA50y2PjL40cXsrwAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">MapPropertySource</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="HY9Hrf4IA0a/6ggXcQCHKAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="QR94cEZrBkiZR534qIb8NAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="xg34VHJ+fEyzj7CBiwRDPAAA">
<XPD:REF name="Model">0G95rtMbMkGOVGNGUylrTwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="Q2G0OFPdX0WvGNLjqraOhQAA">
<XPD:REF name="Model">0G95rtMbMkGOVGNGUylrTwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="hN8Iz1t2uEGqMaJbfuBCygAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">0G95rtMbMkGOVGNGUylrTwAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[12]" type="UMLGeneralizationView" guid="zX9P9cOnqEyWbhXgvyvywgAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">641,300;567,248</XPD:ATTR>
<XPD:REF name="Model">nmHxsfPUH0uMgV7NLgoPQAAA</XPD:REF>
<XPD:REF name="Head">XoDV+uDukUS0zm6Fpkp2vgAA</XPD:REF>
<XPD:REF name="Tail">ofVZ47URd0q//8gDOJ1aYQAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="KMO4VpnocUSCij/V83vvUgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">nmHxsfPUH0uMgV7NLgoPQAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="Wpo5wXGWQ0yPemxCm418XQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">nmHxsfPUH0uMgV7NLgoPQAAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="eeiAA6jWEEKpczjpn+GYoQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">nmHxsfPUH0uMgV7NLgoPQAAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[13]" type="UMLClassView" guid="fz4ooYRQQUKQC0x7WctXHAAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">132</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">180</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">141</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
<XPD:REF name="Model">nv96eSShbEO1tnb3nAtytQAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="DyVodVd+ykSYPaAIwKCgiwAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="y2qiNfwrm0aniHT3Z2wxjAAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">JndiPropertySource</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="adE8aUS/TUiWfgJ6AtcQ0AAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="GcwZwmMKkEaoRb3sj+s44AAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="m5vdCSJjaUqlp4lcuEchswAA">
<XPD:REF name="Model">nv96eSShbEO1tnb3nAtytQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="xw0ej2Y+UUeaA65irBJiaAAA">
<XPD:REF name="Model">nv96eSShbEO1tnb3nAtytQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="yGbYuvxSfEeQO/yX68WY7wAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">nv96eSShbEO1tnb3nAtytQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[14]" type="UMLGeneralizationView" guid="cc/GZPyTG0OHyTjwDkboLwAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">240,180;311,130</XPD:ATTR>
<XPD:REF name="Model">9dc0xBoytkGjG5XqAMYu1wAA</XPD:REF>
<XPD:REF name="Head">8csK9TqyK0iTF2cDno0EjwAA</XPD:REF>
<XPD:REF name="Tail">fz4ooYRQQUKQC0x7WctXHAAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="pzWCZrIsCU66Vimkd/OaTgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">9dc0xBoytkGjG5XqAMYu1wAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="Ea4og1CVhECO4dioOiztHQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">9dc0xBoytkGjG5XqAMYu1wAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="jL4/z3mZvkWwHhd4rb7n/QAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">9dc0xBoytkGjG5XqAMYu1wAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[15]" type="UMLClassView" guid="wSTCYN8ovESWUhnKxWxqwQAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">804</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">416</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">214</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">69</XPD:ATTR>
<XPD:REF name="Model">ivhMphxwukqsfoGz7lapfwAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="Vtr91eyhU0+/4hhXpP09EAAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="7XTbj+62E0eqQXYEXgxlHwAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">SystemEnvironmentPropertySource</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="DpWhojGPH0i/wtz2Fcq+HAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="zaC/BML1JkOr4ZdxOZAUcgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="HHLin3FNRESgFQRQqaOSnwAA">
<XPD:REF name="Model">ivhMphxwukqsfoGz7lapfwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="XUkrJ1ubBEmq+Q7xl+wrOwAA">
<XPD:REF name="Model">ivhMphxwukqsfoGz7lapfwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="T+hbm20xG029tPoTD2XY0wAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">ivhMphxwukqsfoGz7lapfwAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[16]" type="UMLClassView" guid="ZOn3N4yC30eZ0KrCvKIfaQAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">587</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">416</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">158</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
<XPD:REF name="Model">B6FADWablEW17McE5tzbgQAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="B8rm9AXhrEqxsm6w0Qwc7QAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="ivi4OkTwiku9Eqry3YWs6gAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">PropertiesPropertySource</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="oosyGoOHg02y7Ouf7XDPEgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="mzIOCoTi9UesrC8w/FYnCQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="CJmM98xiXkOO52chzlq5agAA">
<XPD:REF name="Model">B6FADWablEW17McE5tzbgQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="LSPQWRGASUaQeQusGBtG7AAA">
<XPD:REF name="Model">B6FADWablEW17McE5tzbgQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="CHXx9zm8nEe1+IOMw8euqgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">B6FADWablEW17McE5tzbgQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[17]" type="UMLClassView" guid="6RVdgqhCy0+iMo+R9/xplQAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Left" type="integer">590</XPD:ATTR>
<XPD:ATTR name="Top" type="integer">508</XPD:ATTR>
<XPD:ATTR name="Width" type="integer">152</XPD:ATTR>
<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
<XPD:REF name="Model">XIx80iKLUEKrRmQb2g/QlwAA</XPD:REF>
<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="Ym/XgOEZcE2beOyw5KzqQgAA">
<XPD:OBJ name="NameLabel" type="LabelView" guid="hX4InMgCfEOHt5NeApp3SwAA">
<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
<XPD:ATTR name="Text" type="string">ResourcePropertySource</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="8mZprOLUWkioFuknQmBN7AAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="LabelView" guid="S6zYupEDH0+6eDVX+a2s1AAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="R6Z8gj6VWky9KE1zT8PdqwAA">
<XPD:REF name="Model">XIx80iKLUEKrRmQb2g/QlwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="RW8ikxodg06e4nxGbUrFfgAA">
<XPD:REF name="Model">XIx80iKLUEKrRmQb2g/QlwAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="f+sqyxx7wE2mMGESMyFR8AAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:REF name="Model">XIx80iKLUEKrRmQb2g/QlwAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[18]" type="UMLGeneralizationView" guid="HHHU0OqiC0iGi3c9EDsWWQAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">672,416;684,381</XPD:ATTR>
<XPD:REF name="Model">KWE3w89dYU2y8vUO6VPD/AAA</XPD:REF>
<XPD:REF name="Head">ofVZ47URd0q//8gDOJ1aYQAA</XPD:REF>
<XPD:REF name="Tail">ZOn3N4yC30eZ0KrCvKIfaQAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="a0vY1/xY1UmSbtG+YyRJpwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">KWE3w89dYU2y8vUO6VPD/AAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="XFRy7cL8tEuedrQg3OawuwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">KWE3w89dYU2y8vUO6VPD/AAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="YXcH+dGu2UOhdXjytbWHrwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">KWE3w89dYU2y8vUO6VPD/AAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[19]" type="UMLGeneralizationView" guid="X/jpYZNZr06jF8Rk6jkuUAAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">844,416;777,381</XPD:ATTR>
<XPD:REF name="Model">CiJHZkIANkKwAlfb7JEpaQAA</XPD:REF>
<XPD:REF name="Head">ofVZ47URd0q//8gDOJ1aYQAA</XPD:REF>
<XPD:REF name="Tail">wSTCYN8ovESWUhnKxWxqwQAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="/d8DY2k0QUum5Afe9iaKHwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">CiJHZkIANkKwAlfb7JEpaQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="McYyW5GC2EalLkOTnN8nIQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">CiJHZkIANkKwAlfb7JEpaQAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="9QwQUr2610qd1BjhI5lhCQAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">CiJHZkIANkKwAlfb7JEpaQAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="OwnedViews[20]" type="UMLGeneralizationView" guid="Z01S2AcyEkmL7OJqPqpDYAAA">
<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
<XPD:ATTR name="Points" type="Points">665,508;665,458</XPD:ATTR>
<XPD:REF name="Model">5Okg+yP8K0qo5g6wa7yS1wAA</XPD:REF>
<XPD:REF name="Head">ZOn3N4yC30eZ0KrCvKIfaQAA</XPD:REF>
<XPD:REF name="Tail">6RVdgqhCy0+iMo+R9/xplQAA</XPD:REF>
<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="r+sN3/VA/0i3BKenrRmHKwAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">5Okg+yP8K0qo5g6wa7yS1wAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="9smHI2dRUE6dvsQ601VpVAAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
<XPD:REF name="Model">5Okg+yP8K0qo5g6wa7yS1wAA</XPD:REF>
</XPD:OBJ>
<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="b+26uot92kWHSbDocOZJBgAA">
<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
<XPD:REF name="Model">5Okg+yP8K0qo5g6wa7yS1wAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
</XPD:OBJ>
</XPD:OBJ>
<XPD:ATTR name="#OwnedElements" type="integer">91</XPD:ATTR>
<XPD:OBJ name="OwnedElements[0]" type="UMLInterface" guid="hDybVb95ZkCtdnWORm8lxwAA">
<XPD:ATTR name="Name" type="string">ResourceLoader</XPD:ATTR>
<XPD:REF name="Namespace">6eooFiJdkE+izOOxrEuNTgAA</XPD:REF>
<XPD:ATTR name="#Views" type="integer">3</XPD:ATTR>
<XPD:REF name="Views[0]">NU3XTWc/BEu77lxkyrdlLwAA</XPD:REF>
<XPD:REF name="Views[1]">iizMiKT2mEOUmYSU19SkagAA</XPD:REF>
<XPD:REF name="Views[2]">UAZn/2ZCWUu53K3OmosgQAAA</XPD:REF>
<XPD:ATTR name="#SupplierDependencies" type="integer">1</XPD:ATTR>
<XPD:REF name="SupplierDependencies[0]">gPF2N18LgEO4cq70twKRmwAA</XPD:REF>
<XPD:ATTR name="#Specializations" type="integer">2</XPD:ATTR>
<XPD:REF name="Specializations[0]">InhEbs8I+0CMZAwDfz2vBwAA</XPD:REF>
<XPD:REF name="Specializations[1]">2qfOA/SRL0qSrBMZPvnIYwAA</XPD:REF>
<XPD:ATTR name="#Operations" type="integer">2</XPD:ATTR>
<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="992sZmQgAE+7rAX6XqlDUgAA">
<XPD:ATTR name="Name" type="string">getResource</XPD:ATTR>
<XPD:REF name="Owner">hDybVb95ZkCtdnWORm8lxwAA</XPD:REF>
<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="lxFt6WN810Cex4AsMSebfAAA">
<XPD:ATTR name="Name" type="string">String location</XPD:ATTR>
<XPD:REF name="BehavioralFeature">992sZmQgAE+7rAX6XqlDUgAA</XPD:REF>
</XPD:OBJ>
</XPD:OBJ>
<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="G0ip28JIYE+58yKpSqJC4wAA">
<XPD:ATTR name="Name" type="string">getClassLoader</XPD:ATTR>
<XPD:REF name="Owner">hDybVb95ZkCtdnWORm8lxwAA</XPD:REF>
</XPD:OBJ>
<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="bXX3p2Ub2UCvke+sMWgFHwAA">
<XPD:ATTR name="Name" type="string">CLASSPATH_URL_PREFIX</XPD:ATTR>
<X
gitextract_ordn1vgh/
├── .gitignore
├── README.md
├── note/
│ ├── Spring.md
│ ├── Spring.uml
│ ├── flows/
│ │ ├── guava-cache.vsdx
│ │ ├── spring-task.vsdx
│ │ └── spring_application_run.gliffy
│ ├── guava-cache.md
│ ├── guava-cache.uml
│ ├── spring-aop.md
│ ├── spring-boot.md
│ ├── spring-boot.uml
│ ├── spring-context.md
│ ├── spring-mvc.md
│ ├── spring-mvc.uml
│ ├── spring-task.md
│ ├── spring-transaction.md
│ └── spring-transaction.uml
├── pom.xml
└── src/
└── main/
├── java/
│ ├── annotation/
│ │ └── Init.java
│ ├── aop/
│ │ ├── Bootstrap.java
│ │ ├── SimpleAopBean.java
│ │ ├── SimpleChildAopBean.java
│ │ └── SimpleMethodInterceptor.java
│ ├── base/
│ │ ├── BaseStudent.java
│ │ ├── Boostrap.java
│ │ ├── SimpleBean.java
│ │ ├── SimpleBeanFactoryPostProcessor.java
│ │ ├── SimpleBeanPostProcessor.java
│ │ ├── Student.java
│ │ ├── aop/
│ │ │ ├── AopDemo.java
│ │ │ ├── AopDemoAdvice.java
│ │ │ ├── AopDemoInter.java
│ │ │ └── annotation/
│ │ │ └── AspectDemo.java
│ │ ├── scope/
│ │ │ └── OneScope.java
│ │ └── transaction/
│ │ ├── NestedBean.java
│ │ └── TransactionBean.java
│ ├── cache/
│ │ └── CacheDemo.java
│ ├── controller/
│ │ └── SimpleController.java
│ ├── java_config/
│ │ ├── Bootrap.java
│ │ ├── SimpleBeanConfig.java
│ │ └── StudentConfig.java
│ ├── local/
│ │ └── Local.java
│ ├── model/
│ │ └── SimpleModel.java
│ ├── task/
│ │ └── Task.java
│ ├── test/
│ │ ├── JavaTest.java
│ │ └── proxy/
│ │ ├── Handler.java
│ │ ├── JDKProxy.java
│ │ ├── UserService.java
│ │ └── UserServiceImpl.java
│ └── validator/
│ └── SimpleModelValidator.java
├── resources/
│ ├── config.xml
│ ├── property.properties
│ ├── resource/
│ │ ├── resource_en_US.properties
│ │ └── resource_zh_CN.properties
│ └── spring-servlet.xml
└── webapp/
├── WEB-INF/
│ ├── echo.jsp
│ └── web.xml
└── index.jsp
SYMBOL INDEX (110 symbols across 31 files)
FILE: src/main/java/aop/Bootstrap.java
class Bootstrap (line 10) | public class Bootstrap {
method main (line 12) | public static void main(String[] args) {
FILE: src/main/java/aop/SimpleAopBean.java
class SimpleAopBean (line 8) | public class SimpleAopBean {
method boo (line 10) | public void boo() {
method testB (line 15) | public void testB() {
method testC (line 20) | public void testC() {
FILE: src/main/java/aop/SimpleChildAopBean.java
class SimpleChildAopBean (line 6) | public class SimpleChildAopBean extends SimpleAopBean {
method testC (line 8) | @Override
FILE: src/main/java/aop/SimpleMethodInterceptor.java
class SimpleMethodInterceptor (line 9) | public class SimpleMethodInterceptor implements MethodInterceptor {
method invoke (line 11) | @Override
FILE: src/main/java/base/BaseStudent.java
class BaseStudent (line 6) | public abstract class BaseStudent {
method getId (line 10) | public String getId() {
method setId (line 14) | public void setId(String id) {
FILE: src/main/java/base/Boostrap.java
class Boostrap (line 7) | public class Boostrap {
method main (line 9) | public static void main(String[] args) {
FILE: src/main/java/base/SimpleBean.java
class SimpleBean (line 11) | public class SimpleBean {
method SimpleBean (line 15) | public SimpleBean() {}
method SimpleBean (line 17) | public SimpleBean(Student student) {
method getStudent (line 21) | public Student getStudent() {
method setStudent (line 25) | public void setStudent(Student student) {
method send (line 29) | public void send() {
method init (line 33) | @Init
FILE: src/main/java/base/SimpleBeanFactoryPostProcessor.java
class SimpleBeanFactoryPostProcessor (line 8) | @Configurable
method postProcessBeanFactory (line 11) | @Override
FILE: src/main/java/base/SimpleBeanPostProcessor.java
class SimpleBeanPostProcessor (line 9) | public class SimpleBeanPostProcessor implements BeanPostProcessor {
method postProcessBeforeInitialization (line 10) | @Override
method postProcessAfterInitialization (line 15) | @Override
FILE: src/main/java/base/Student.java
class Student (line 3) | public class Student extends BaseStudent {
method getName (line 8) | public String getName() {
method setName (line 11) | public void setName(String name) {
method getAge (line 14) | public int getAge() {
method setAge (line 17) | public void setAge(int age) {
method Student (line 21) | public Student(String name, int age) {
method Student (line 26) | public Student() {
method toString (line 29) | @Override
FILE: src/main/java/base/aop/AopDemo.java
class AopDemo (line 6) | public class AopDemo implements AopDemoInter {
method send (line 8) | public void send() {
method receive (line 12) | public void receive() {
method inter (line 16) | @Override
FILE: src/main/java/base/aop/AopDemoAdvice.java
class AopDemoAdvice (line 9) | public class AopDemoAdvice implements MethodInterceptor {
method beforeSend (line 11) | public void beforeSend() {
method afterSend (line 15) | public void afterSend() {
method beforeReceive (line 19) | public void beforeReceive() {
method afterReceive (line 23) | public void afterReceive() {
method invoke (line 27) | @Override
FILE: src/main/java/base/aop/AopDemoInter.java
type AopDemoInter (line 6) | public interface AopDemoInter {
method inter (line 8) | void inter();
FILE: src/main/java/base/aop/annotation/AspectDemo.java
class AspectDemo (line 10) | @Aspect
method beforeSend (line 13) | @Pointcut("execution(void base.aop.AopDemo.send(..))")
method before (line 16) | @Before("beforeSend()")
FILE: src/main/java/base/scope/OneScope.java
class OneScope (line 13) | public class OneScope implements Scope {
method get (line 17) | @Override
method remove (line 23) | @Override
method registerDestructionCallback (line 28) | @Override
method resolveContextualObject (line 33) | @Override
method getConversationId (line 38) | @Override
FILE: src/main/java/base/transaction/NestedBean.java
class NestedBean (line 12) | @Component
method nest (line 15) | @Transactional(propagation = Propagation.NESTED)
FILE: src/main/java/base/transaction/TransactionBean.java
class TransactionBean (line 12) | @Component
method getNestedBean (line 15) | public NestedBean getNestedBean() {
method setNestedBean (line 19) | public void setNestedBean(NestedBean nestedBean) {
method process (line 25) | @Transactional(propagation = Propagation.REQUIRED)
FILE: src/main/java/cache/CacheDemo.java
class CacheDemo (line 15) | public class CacheDemo {
method cacheLoader (line 17) | @Test
FILE: src/main/java/controller/SimpleController.java
class SimpleController (line 24) | @Controller
method initBinder (line 29) | @InitBinder
method initValidator (line 35) | @PostConstruct
method echo (line 41) | @RequestMapping("/echo")
method echo (line 47) | @RequestMapping(value = "/echoAgain", method = RequestMethod.POST)
FILE: src/main/java/java_config/Bootrap.java
class Bootrap (line 11) | public class Bootrap {
method main (line 13) | public static void main(String[] args) {
FILE: src/main/java/java_config/SimpleBeanConfig.java
class SimpleBeanConfig (line 14) | @Configuration
method simpleBean (line 21) | @Bean
FILE: src/main/java/java_config/StudentConfig.java
class StudentConfig (line 15) | @Configuration
method student (line 18) | @Bean
method setImportMetadata (line 27) | @Override
FILE: src/main/java/local/Local.java
class Local (line 14) | public class Local {
method resourceBoundle (line 16) | @Test
FILE: src/main/java/model/SimpleModel.java
class SimpleModel (line 13) | public class SimpleModel {
method getName (line 21) | public String getName() {
method setName (line 25) | public void setName(String name) {
method getAge (line 29) | public Integer getAge() {
method setAge (line 33) | public void setAge(Integer age) {
method getDate (line 37) | public Date getDate() {
method setDate (line 41) | public void setDate(Date date) {
method toString (line 45) | @Override
FILE: src/main/java/task/Task.java
class Task (line 10) | public class Task {
method print (line 12) | @Async("executor")
FILE: src/main/java/test/JavaTest.java
class JavaTest (line 20) | public class JavaTest {
class MyList (line 22) | private class MyList extends ArrayList {
method get (line 24) | @Override
method main (line 30) | public static void main(String[] args) {
method classpath (line 36) | @Test
method findClass (line 41) | @Test
method intro (line 49) | @Test
method split (line 58) | @Test
FILE: src/main/java/test/proxy/Handler.java
class Handler (line 11) | public class Handler implements InvocationHandler {
method Handler (line 15) | public Handler(Object target) {
method invoke (line 19) | @Override
FILE: src/main/java/test/proxy/JDKProxy.java
class JDKProxy (line 10) | public class JDKProxy {
method main (line 12) | public static void main(String[] args) {
FILE: src/main/java/test/proxy/UserService.java
type UserService (line 8) | public interface UserService {
method printName (line 10) | void printName();
method printAge (line 12) | void printAge();
FILE: src/main/java/test/proxy/UserServiceImpl.java
class UserServiceImpl (line 8) | public class UserServiceImpl implements UserService {
method printName (line 10) | @Override
method printAge (line 16) | @Override
FILE: src/main/java/validator/SimpleModelValidator.java
class SimpleModelValidator (line 12) | public class SimpleModelValidator implements Validator {
method supports (line 14) | @Override
method validate (line 19) | @Override
Condensed preview — 59 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,080K chars).
[
{
"path": ".gitignore",
"chars": 217,
"preview": "*.class\ntarget/\n\n# Mobile Tools for Java (J2ME)\n.mtj.tmp/\n\n# Package Files #\n*.jar\n*.war\n*.ear\n\n# virtual machine crash "
},
{
"path": "README.md",
"chars": 647,
"preview": "# Spring\nSpring相关组件阅读笔记.\n\n# 传送门\n\n- [spring-core](https://github.com/seaswalker/Spring/blob/master/note/Spring.md)\n- [spr"
},
{
"path": "note/Spring.md",
"chars": 76114,
"preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
},
{
"path": "note/Spring.uml",
"chars": 1793937,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<XPD:PROJECT xmlns:XPD=\"http://www.staruml.com\" version=\"1\">\n<XPD:HEADER>\n<XPD:SU"
},
{
"path": "note/flows/spring_application_run.gliffy",
"chars": 24578,
"preview": "{\"contentType\":\"application/gliffy+json\",\"version\":\"1.1\",\"metadata\":{\"title\":\"untitled\",\"revision\":0,\"exportBorder\":fals"
},
{
"path": "note/guava-cache.md",
"chars": 19072,
"preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
},
{
"path": "note/guava-cache.uml",
"chars": 85889,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<XPD:PROJECT xmlns:XPD=\"http://www.staruml.com\" version=\"1\">\n<XPD:HEADER>\n<XPD:SU"
},
{
"path": "note/spring-aop.md",
"chars": 37304,
"preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
},
{
"path": "note/spring-boot.md",
"chars": 5858,
"preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
},
{
"path": "note/spring-boot.uml",
"chars": 29137,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<XPD:PROJECT xmlns:XPD=\"http://www.staruml.com\" version=\"1\">\n<XPD:HEADER>\n<XPD:SU"
},
{
"path": "note/spring-context.md",
"chars": 81685,
"preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
},
{
"path": "note/spring-mvc.md",
"chars": 48713,
"preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
},
{
"path": "note/spring-mvc.uml",
"chars": 440691,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<XPD:PROJECT xmlns:XPD=\"http://www.staruml.com\" version=\"1\">\n<XPD:HEADER>\n<XPD:SU"
},
{
"path": "note/spring-task.md",
"chars": 9134,
"preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
},
{
"path": "note/spring-transaction.md",
"chars": 26034,
"preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
},
{
"path": "note/spring-transaction.uml",
"chars": 169781,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<XPD:PROJECT xmlns:XPD=\"http://www.staruml.com\" version=\"1\">\n<XPD:HEADER>\n<XPD:SU"
},
{
"path": "pom.xml",
"chars": 5027,
"preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:sc"
},
{
"path": "src/main/java/annotation/Init.java",
"chars": 387,
"preview": "package annotation;\n\nimport org.springframework.beans.factory.annotation.Configurable;\n\nimport java.lang.annotation.Elem"
},
{
"path": "src/main/java/aop/Bootstrap.java",
"chars": 464,
"preview": "package aop;\n\nimport org.springframework.context.support.ClassPathXmlApplicationContext;\n\n/**\n * AOP测试启动类.\n *\n * @author"
},
{
"path": "src/main/java/aop/SimpleAopBean.java",
"chars": 421,
"preview": "package aop;\n\nimport org.springframework.aop.framework.AopContext;\n\n/**\n * @author skywalker\n */\npublic class SimpleAopB"
},
{
"path": "src/main/java/aop/SimpleChildAopBean.java",
"chars": 191,
"preview": "package aop;\n\n/**\n * @author skywalker\n */\npublic class SimpleChildAopBean extends SimpleAopBean {\n\n @Override\n pu"
},
{
"path": "src/main/java/aop/SimpleMethodInterceptor.java",
"chars": 444,
"preview": "package aop;\n\nimport org.aopalliance.intercept.MethodInterceptor;\nimport org.aopalliance.intercept.MethodInvocation;\n\n/*"
},
{
"path": "src/main/java/base/BaseStudent.java",
"chars": 224,
"preview": "package base;\n\n/**\n * @author skywalker\n */\npublic abstract class BaseStudent {\n\n private String id;\n\n public Stri"
},
{
"path": "src/main/java/base/Boostrap.java",
"chars": 422,
"preview": "package base;\n\nimport base.aop.AopDemo;\nimport base.transaction.TransactionBean;\nimport org.springframework.context.supp"
},
{
"path": "src/main/java/base/SimpleBean.java",
"chars": 534,
"preview": "package base;\n\nimport annotation.Init;\n\n/**\n * SimpleBean\n * \n * @author skywalker\n *\n */\npublic class SimpleBean {\n\n\tpr"
},
{
"path": "src/main/java/base/SimpleBeanFactoryPostProcessor.java",
"chars": 605,
"preview": "package base;\n\nimport org.springframework.beans.BeansException;\nimport org.springframework.beans.factory.annotation.Conf"
},
{
"path": "src/main/java/base/SimpleBeanPostProcessor.java",
"chars": 521,
"preview": "package base;\n\nimport org.springframework.beans.BeansException;\nimport org.springframework.beans.factory.config.BeanPost"
},
{
"path": "src/main/java/base/Student.java",
"chars": 534,
"preview": "package base;\n\npublic class Student extends BaseStudent {\n\n\tprivate String name;\n\tprivate int age;\n\t\n\tpublic String getN"
},
{
"path": "src/main/java/base/aop/AopDemo.java",
"chars": 349,
"preview": "package base.aop;\n\n/**\n * @author skywalker\n */\npublic class AopDemo implements AopDemoInter {\n\n public void send() {"
},
{
"path": "src/main/java/base/aop/AopDemoAdvice.java",
"chars": 659,
"preview": "package base.aop;\n\nimport org.aopalliance.intercept.MethodInterceptor;\nimport org.aopalliance.intercept.MethodInvocation"
},
{
"path": "src/main/java/base/aop/AopDemoInter.java",
"chars": 102,
"preview": "package base.aop;\n\n/**\n * @author skywalker\n */\npublic interface AopDemoInter {\n\n void inter();\n\n}\n"
},
{
"path": "src/main/java/base/aop/annotation/AspectDemo.java",
"chars": 420,
"preview": "package base.aop.annotation;\n\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Before;\nimpo"
},
{
"path": "src/main/java/base/scope/OneScope.java",
"chars": 891,
"preview": "package base.scope;\n\nimport base.Student;\nimport org.springframework.beans.factory.ObjectFactory;\nimport org.springframe"
},
{
"path": "src/main/java/base/transaction/NestedBean.java",
"chars": 409,
"preview": "package base.transaction;\n\nimport org.springframework.stereotype.Component;\nimport org.springframework.transaction.annot"
},
{
"path": "src/main/java/base/transaction/TransactionBean.java",
"chars": 654,
"preview": "package base.transaction;\n\nimport org.springframework.stereotype.Component;\nimport org.springframework.transaction.annot"
},
{
"path": "src/main/java/cache/CacheDemo.java",
"chars": 874,
"preview": "package cache;\n\nimport com.google.common.cache.CacheBuilder;\nimport com.google.common.cache.CacheLoader;\nimport com.goog"
},
{
"path": "src/main/java/controller/SimpleController.java",
"chars": 2157,
"preview": "package controller;\n\nimport model.SimpleModel;\nimport org.springframework.stereotype.Controller;\nimport org.springframew"
},
{
"path": "src/main/java/java_config/Bootrap.java",
"chars": 588,
"preview": "package java_config;\n\nimport base.SimpleBean;\nimport org.springframework.context.annotation.AnnotationConfigApplicationC"
},
{
"path": "src/main/java/java_config/SimpleBeanConfig.java",
"chars": 628,
"preview": "package java_config;\n\nimport base.SimpleBean;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org."
},
{
"path": "src/main/java/java_config/StudentConfig.java",
"chars": 791,
"preview": "package java_config;\n\nimport base.Student;\nimport org.springframework.context.annotation.Bean;\nimport org.springframewor"
},
{
"path": "src/main/java/local/Local.java",
"chars": 534,
"preview": "package local;\n\nimport java.util.Locale;\nimport java.util.ResourceBundle;\n\nimport org.junit.Test;\n\n/**\n * 测试java本地化相关\n *"
},
{
"path": "src/main/java/model/SimpleModel.java",
"chars": 993,
"preview": "package model;\n\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport javax.validation.constraints.Max;\ni"
},
{
"path": "src/main/java/task/Task.java",
"chars": 240,
"preview": "package task;\n\nimport org.springframework.scheduling.annotation.Async;\n\n/**\n * 测试Spring Task.\n *\n * @author skywalker\n *"
},
{
"path": "src/main/java/test/JavaTest.java",
"chars": 1815,
"preview": "package test;\n\nimport base.Student;\nimport org.junit.Test;\n\nimport java.beans.BeanInfo;\nimport java.beans.IntrospectionE"
},
{
"path": "src/main/java/test/proxy/Handler.java",
"chars": 600,
"preview": "package test.proxy;\n\nimport java.lang.reflect.InvocationHandler;\nimport java.lang.reflect.Method;\n\n/**\n * {@link java.la"
},
{
"path": "src/main/java/test/proxy/JDKProxy.java",
"chars": 444,
"preview": "package test.proxy;\n\nimport java.lang.reflect.Proxy;\n\n/**\n * 测试JDK动态代理.\n *\n * @author skywalker\n */\npublic class JDKProx"
},
{
"path": "src/main/java/test/proxy/UserService.java",
"chars": 143,
"preview": "package test.proxy;\n\n/**\n * 动态代理接口.\n *\n * @author skywalker\n */\npublic interface UserService {\n\n void printName();\n\n "
},
{
"path": "src/main/java/test/proxy/UserServiceImpl.java",
"chars": 342,
"preview": "package test.proxy;\n\n/**\n * {@link UserService}实现.\n *\n * @author skywalker\n */\npublic class UserServiceImpl implements U"
},
{
"path": "src/main/java/validator/SimpleModelValidator.java",
"chars": 645,
"preview": "package validator;\n\nimport model.SimpleModel;\nimport org.springframework.validation.Errors;\nimport org.springframework.v"
},
{
"path": "src/main/resources/config.xml",
"chars": 1486,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n xmlns:xsi=\"http"
},
{
"path": "src/main/resources/property.properties",
"chars": 56,
"preview": "student.name= skywalker\nstudent.age=20\nstudent.id= id"
},
{
"path": "src/main/resources/resource/resource_en_US.properties",
"chars": 101,
"preview": "greeting.common=How are you! \ngreeting.morning = Good morning! \ngreeting.afternoon = Good Afternoon! "
},
{
"path": "src/main/resources/resource/resource_zh_CN.properties",
"chars": 122,
"preview": "greeting.common=\\u60a8\\u597d\\uff01 \ngreeting.morning=\\u65e9\\u4e0a\\u597d\\uff01 \ngreeting.afternoon=\\u4e0b\\u5348\\u597d\\uff"
},
{
"path": "src/main/resources/spring-servlet.xml",
"chars": 1246,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n xmlns:mvc=\"http"
},
{
"path": "src/main/webapp/WEB-INF/echo.jsp",
"chars": 150,
"preview": "<%@ page language=\"java\" contentType=\"text/html; charset=UTF-8\" pageEncoding=\"UTF-8\"%>\n<html>\n <body>\n <h1>${e"
},
{
"path": "src/main/webapp/WEB-INF/web.xml",
"chars": 1524,
"preview": "<web-app xmlns=\"http://xmlns.jcp.org/xml/ns/javaee\"\n xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n "
},
{
"path": "src/main/webapp/index.jsp",
"chars": 52,
"preview": "<html>\n<body>\n<h2>Hello World!</h2>\n</body>\n</html>\n"
}
]
// ... and 2 more files (download for full content)
About this extraction
This page contains the full source code of the seaswalker/spring-analysis GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 59 files (2.7 MB), approximately 722.3k tokens, and a symbol index with 110 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.