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 ================================================ **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) # 基本 本部分从最基本的Spring开始。配置文件: ```xml ``` 启动代码: ```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继承体系](images/ResourceLoader.jpg) 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接口 继承体系: ![Environment继承体系](images/Environment.jpg) Environmen接口**代表了当前应用所处的环境。** 从此接口的方法可以看出,其主要和profile、Property相关。 ##### Profile Spring Profile特性是从3.1开始的,其主要是为了解决这样一种问题: 线上环境和测试环境使用不同的配置或是数据库或是其它。有了Profile便可以在 不同环境之间无缝切换。**Spring容器管理的所有bean都是和一个profile绑定在一起的。** 使用了Profile的配置文件示例: ```xml ``` 在启动代码中可以用如下代码设置活跃(当前使用的)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接口 继承体系: ![PropertySources继承体系](images/PropertySources.jpg) 此接口实际上是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来源。继承体系: ![PropertySource继承体系](images/PropertySource.jpg) AbstractEnvironment.getSystemProperties: ```java @Override public Map 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分支): ![PropertyResolver继承体系](images/PropertyResolver.jpg) 此接口正是用来解析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 getProperty(String key, Class 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(); } ``` #### 属性校验 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继承体系](images/BeanFactory.jpg) #### 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继承体系](images/EntityResolver.jpg) EntityResolver接口在org.xml.sax中定义。DelegatingEntityResolver用于schema和dtd的解析。 ##### BeanDefinitionReader 继承体系: ![BeanDefinitionReader继承体系](images/BeanDefinitionReader.jpg) ##### 路径解析(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 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是代表一种资源的接口,其类图: ![Resource类图](images/Resource.jpg) 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(schema)的命名空间其实类似于java的报名,命名空间采用URL,比如Spring的是这样: ```xml ``` 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 ``` importBeanDefinitionResource套路和之前的配置文件加载完全一样,不过注意被import进来的文件是先于当前文件 被解析的。 ##### alias 加入有一个bean名为componentA-dataSource,但是另一个组件想以componentB-dataSource的名字使用,就可以这样定义: ```xml ``` 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 aliases = new ArrayList(); 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 SimpleBean ``` 就仅仅是个描述。 然后是meta子元素的解析,meta元素在xml配置文件里是这样的: ```xml ``` 注释上说,这样可以将任意的元数据附到对应的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 ``` 数据保存在Set中,对应的类是MethodOverrides。可以参考: [Spring - lookup-method方式实现依赖注入](http://www.cnblogs.com/ViviChan/p/4981619.html) replace-mothod解析: 此标签用于替换bean里面的特定的方法实现,替换者必须实现Spring的MethodReplacer接口,有点像aop的意思。 配置文件示例: ```xml ``` arg-type的作用是指定替换方法的参数类型,因为接口的定义参数都是Object的。参考: [SPRING.NET 1.3.2 学习20--方法注入之替换方法注入](http://blog.csdn.net/lee576/article/details/8725548) 解析之后将数据放在ReplaceOverride对象中,里面有一个LinkedList专门用于保存arg-type。 构造参数(constructor-arg)解析: 作用一目了然,使用示例: ```xml Cat ``` type一般不需要指定,除了泛型集合那种。除此之外,constructor-arg还支持name, index, ref等属性,可以具体的指定参数的位置等。构造参数解析后保存在BeanDefinition内部一个ConstructorArgumentValues对象中。如果设置了index属性,那么以Map的形式保存,反之,以List的形式保存。 property解析: 非常常用的标签,用以为bean的属性赋值,支持value和ref两种形式,示例: ```xml ``` value和ref属性不能同时出现,如果是ref,那么将其值保存在不可变的RuntimeBeanReference对象中,其实现了BeanReference接口,此接口只有一个getBeanName方法。如果是value,那么将其值保存在TypedStringValue对象中。最终将对象保存在BeanDefinition内部一个MutablePropertyValues对象中(内部以ArrayList实现)。 qualifier解析: 配置示例: ```xml ``` SimpleBean部分源码: ```java @Autowired @Qualifier("student") private Student student; ``` 此标签和@Qualifier, @Autowired两个注解一起使用才有作用。@Autowired注解采用按类型查找的方式进行注入,如果找到多个需要类型的bean便会报错,有了@Qualifier标签就可以再按照此注解指定的名称查找。两者结合相当于实现了按类型+名称注入。type属性可以不指定,因为默认就是那个。qualifier标签可以有attribute子元素,比如: ```xml ``` 貌似是用来在qualifier也区分不开的时候使用。attribute键值对保存在BeanMetadataAttribute对象中。整个qualifier保存在AutowireCandidateQualifier对象中。 ###### Bean装饰 这部分是针对其它schema的属性以及子节点,比如: ```xml ``` 没见过这种用法,留个坑。 ###### 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数据结构如下图: ![BeanDefinition数据结构](images/BeanDefinition.jpg) ##### 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 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继承体系 ![NamespaceHandler继承体系](images/NamespaceHandler.jpg) ##### init resolve中调用了其init方法,此方法用以向NamespaceHandler对象注册BeanDefinitionParser对象。**此接口用以解析顶层(beans下)的非默认命名空间元素,比如``**。 所以这样逻辑就很容易理解了: **每种子标签的解析仍是策略模式的体现,init负责向父类NamespaceHandlerSupport注册不同的策略,由父类的NamespaceHandlerSupport.parse方法根据具体的子标签调用相应的策略完成解析的过程**。 此部分较为重要,所以重新开始大纲。 ##### BeanFactory数据结构 BeanDefinition在BeanFactory中的主要数据结构如下图: ![Beanfactory数据结构](images/Beanfactory_structure.jpg) ### prepareBeanFactory 此方法负责对BeanFactory进行一些特征的设置工作,"特征"包含这么几个方面: #### BeanExpressionResolver 此接口只有一个实现: StandardBeanExpressionResolver。接口只含有一个方法: ```java Object evaluate(String value, BeanExpressionContext evalContext) ``` prepareBeanFactory将一个此对象放入BeanFactory: ```java beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader())); ``` StandardBeanExpressionResolver对象内部有一个关键的成员: SpelExpressionParser,其整个类图: ![ExpressionParser继承体系](images/ExpressionParser.jpg) 这便是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 ``` 参考: [深入理解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, 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的初始化工作,初始化是在后面的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国际化。继承体系如下: ![MessageSource继承体系](images/MessageSource.jpg) 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的整个继承体系如下: ![EventObject继承体系](images/EventObject.jpg) #### 发布者 ##### ApplicationEventPublisher ![ApplicationEventPublisher继承体系](images/ApplicationEventPublisher.jpg) 一目了然。 ##### ApplicationEventMulticaster ApplicationEventPublisher实际上正是将请求委托给ApplicationEventMulticaster来实现的。其继承体系: ![ApplicationEventMulticaster继承体系](images/ApplicationEventMulticaster.jpg) #### 监听器 所有的监听器是jdk EventListener的子类,这是一个mark接口。继承体系: ![EventListener继承体系](images/EventListener.jpg) 可以看出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 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 ``` 在代码中使用示例: ```java @Component public class EmailRegisterListener implements ApplicationListener { @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 beanNames = new ArrayList(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() { @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() { @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>完成的,key是bean的真实名字。 ## Singleton初始化 虽然这里大纲是Singleton初始化,但是getBean方法本身是包括所有scope的初始化,在这里一次说明了。 ```java if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, new ObjectFactory() { @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`。 #### 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 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的初始化在此处又抽成了策略模式,类图: ![InstantiationStrategy类图](images/InstantiationStrategy.jpg) 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 || //配置了子元素 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 ``` 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 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) { //所有的值 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() { @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() { @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,可以调用 ConfigurableBeanFactory定义的registerScope方法注册其值。 Scope接口继承体系: ![Scope继承体系](images/Scope.jpg) 根据socpe.get的注释,此方法如果找到了叫做beanName的bean,那么返回,如果没有,将调用ObjectFactory创建之。Scope的实现参考类图。 ================================================ FILE: note/Spring.uml ================================================ UMLStandard Spring 6 类图 OB1ywkeJUU2zhj8yqaXuowAA 5 ResourceLoader 6eooFiJdkE+izOOxrEuNTgAA KdPdnCgUbU66BkwUdFjouwAA 32 clMaroon $00B9FFFF 440 52 155 72 sdkNone hDybVb95ZkCtdnWORm8lxwAA 1 ResourceLoader <<interface>> False False hDybVb95ZkCtdnWORm8lxwAA hDybVb95ZkCtdnWORm8lxwAA clMaroon $00B9FFFF 184 176 217 69 sdkNone /FtEC3pKi0WdIB5Q0P3zyQAA 1 DefaultResourceLoader False False /FtEC3pKi0WdIB5Q0P3zyQAA /FtEC3pKi0WdIB5Q0P3zyQAA False /FtEC3pKi0WdIB5Q0P3zyQAA clMaroon $00B9FFFF 24 275 174 56 sdkNone WeI5VK83yEuXDwmBYTNJRQAA 1 FileSystemResourceLoader False False WeI5VK83yEuXDwmBYTNJRQAA WeI5VK83yEuXDwmBYTNJRQAA False WeI5VK83yEuXDwmBYTNJRQAA clMaroon $00B9FFFF 354,176;451,123 gPF2N18LgEO4cq70twKRmwAA NU3XTWc/BEu77lxkyrdlLwAA Miusv09i10CpLvE8QbQD2wAA False 1.5707963267949 15 gPF2N18LgEO4cq70twKRmwAA False 1.5707963267949 30 gPF2N18LgEO4cq70twKRmwAA False -1.5707963267949 15 gPF2N18LgEO4cq70twKRmwAA clMaroon $00B9FFFF 163,275;225,244 D4dTQtLfTkKFelspkdsldAAA Miusv09i10CpLvE8QbQD2wAA JrlmBEhPlEy1CKdWqJaRJAAA False 1.5707963267949 15 D4dTQtLfTkKFelspkdsldAAA False 1.5707963267949 30 D4dTQtLfTkKFelspkdsldAAA False -1.5707963267949 15 D4dTQtLfTkKFelspkdsldAAA clMaroon $00B9FFFF 220 275 178 56 sdkNone GoAJj7SK9EuEnw6bpQhwnQAA 1 ClassRelativeResourceLoader False False GoAJj7SK9EuEnw6bpQhwnQAA GoAJj7SK9EuEnw6bpQhwnQAA False GoAJj7SK9EuEnw6bpQhwnQAA clMaroon $00B9FFFF 303,275;298,244 GCKbtbV5MkmzeewK94/nuwAA Miusv09i10CpLvE8QbQD2wAA QPH2knF09EWWbLHyyUeU9gAA False 1.5707963267949 15 GCKbtbV5MkmzeewK94/nuwAA False 1.5707963267949 30 GCKbtbV5MkmzeewK94/nuwAA False -1.5707963267949 15 GCKbtbV5MkmzeewK94/nuwAA clMaroon $00B9FFFF 375 480 167 43 sdkNone 50/oHuZbCEm40+kSv4xkOQAA 3 AbstractApplicationContext False False 50/oHuZbCEm40+kSv4xkOQAA 50/oHuZbCEm40+kSv4xkOQAA False 50/oHuZbCEm40+kSv4xkOQAA clMaroon $00B9FFFF 457,480;452,280;370,244 yu6pp0C6xE2Y8WsqgglhKgAA Miusv09i10CpLvE8QbQD2wAA vVX4w/Fjo0SpqY8HH1IZOAAA False 1.5707963267949 15 yu6pp0C6xE2Y8WsqgglhKgAA False 1.5707963267949 30 yu6pp0C6xE2Y8WsqgglhKgAA False -1.5707963267949 15 yu6pp0C6xE2Y8WsqgglhKgAA clMaroon $00B9FFFF 552 368 189 46 sdkNone BGLK54QHuEi9JrXkIwvt9QAA 1 ConfigurableApplicationContext <<interface>> False False BGLK54QHuEi9JrXkIwvt9QAA BGLK54QHuEi9JrXkIwvt9QAA clMaroon $00B9FFFF 494,480;607,413 rKkkrs0UVkm/xfWq70MjPQAA Ww6zG/aIKk6r4yv1aP6JogAA vVX4w/Fjo0SpqY8HH1IZOAAA False 1.5707963267949 15 rKkkrs0UVkm/xfWq70MjPQAA False 1.5707963267949 30 rKkkrs0UVkm/xfWq70MjPQAA False -1.5707963267949 15 rKkkrs0UVkm/xfWq70MjPQAA clMaroon $00B9FFFF 587 280 118 46 sdkNone lFir+W8oe02JBSON90x/ygAA 1 ApplicationContext <<interface>> False False lFir+W8oe02JBSON90x/ygAA lFir+W8oe02JBSON90x/ygAA clMaroon $00B9FFFF 646,368;645,325 +5OzMhzHH0y2c8LzLGRCQQAA RhNuxONOtE6ErnVtlW+P5AAA Ww6zG/aIKk6r4yv1aP6JogAA False 1.5707963267949 15 +5OzMhzHH0y2c8LzLGRCQQAA False 1.5707963267949 30 +5OzMhzHH0y2c8LzLGRCQQAA False -1.5707963267949 15 +5OzMhzHH0y2c8LzLGRCQQAA clMaroon $00B9FFFF 720 280 86 46 sdkNone ee8KCeaKVEOoYTEhFF+74wAA 1 Lifecycle <<interface>> False False ee8KCeaKVEOoYTEhFF+74wAA ee8KCeaKVEOoYTEhFF+74wAA clMaroon $00B9FFFF 675,368;732,325 8rsbo5lEd0ejOg+/y1BADgAA eHyv/+usbEuCBKnkT049WgAA Ww6zG/aIKk6r4yv1aP6JogAA False 1.5707963267949 15 8rsbo5lEd0ejOg+/y1BADgAA False 1.5707963267949 30 8rsbo5lEd0ejOg+/y1BADgAA False -1.5707963267949 15 8rsbo5lEd0ejOg+/y1BADgAA clMaroon $00B9FFFF 476 280 91 46 sdkNone +hjyiKZOS0WGUUiuCb09JAAA 1 Closeable <<interface>> False False +hjyiKZOS0WGUUiuCb09JAAA +hjyiKZOS0WGUUiuCb09JAAA clMaroon $00B9FFFF 615,368;554,325 SlZZI2U2Wkyp62yqqBsJtQAA b4ReA2jJ+E+mJ/4xDNAorgAA Ww6zG/aIKk6r4yv1aP6JogAA False 1.5707963267949 15 SlZZI2U2Wkyp62yqqBsJtQAA False 1.5707963267949 30 SlZZI2U2Wkyp62yqqBsJtQAA False -1.5707963267949 15 SlZZI2U2Wkyp62yqqBsJtQAA clMaroon $00B9FFFF 341 568 235 43 sdkNone BEvxRapz30mKUXLDLkOXdQAA 3 AbstractRefreshableApplicationContext False False BEvxRapz30mKUXLDLkOXdQAA BEvxRapz30mKUXLDLkOXdQAA False BEvxRapz30mKUXLDLkOXdQAA clMaroon $00B9FFFF 323 644 270 43 sdkNone vG4azfyb30Sm0o/6aGjWEQAA 3 AbstractRefreshableConfigApplicationContext False False vG4azfyb30Sm0o/6aGjWEQAA vG4azfyb30Sm0o/6aGjWEQAA False vG4azfyb30Sm0o/6aGjWEQAA clMaroon $00B9FFFF 458,568;458,522 N/1YApMrHk6T4MkcjuYIzgAA vVX4w/Fjo0SpqY8HH1IZOAAA b1M21K3P20euCCbnUcl8IAAA False 1.5707963267949 15 N/1YApMrHk6T4MkcjuYIzgAA False 1.5707963267949 30 N/1YApMrHk6T4MkcjuYIzgAA False -1.5707963267949 15 N/1YApMrHk6T4MkcjuYIzgAA clMaroon $00B9FFFF 457,644;458,610 ydmglSpfoE6ccV5cTOnl1AAA b1M21K3P20euCCbnUcl8IAAA za3NtrH5a0CG2UABkWyksAAA False 1.5707963267949 15 ydmglSpfoE6ccV5cTOnl1AAA False 1.5707963267949 30 ydmglSpfoE6ccV5cTOnl1AAA False -1.5707963267949 15 ydmglSpfoE6ccV5cTOnl1AAA clMaroon $00B9FFFF 364 732 188 43 sdkNone 7f8epg+O+k+uKbOI0O1HiQAA 3 AbstractXmlApplicationContext False False 7f8epg+O+k+uKbOI0O1HiQAA 7f8epg+O+k+uKbOI0O1HiQAA False 7f8epg+O+k+uKbOI0O1HiQAA clMaroon $00B9FFFF 457,732;457,686 bdADOSzxu0mwrZJqUENBhQAA za3NtrH5a0CG2UABkWyksAAA cEy5f8mLmk29ue2Cpu634wAA False 1.5707963267949 15 bdADOSzxu0mwrZJqUENBhQAA False 1.5707963267949 30 bdADOSzxu0mwrZJqUENBhQAA False -1.5707963267949 15 bdADOSzxu0mwrZJqUENBhQAA clMaroon $00B9FFFF 184 824 194 43 sdkNone bwDhV6aKRUCQaDjn/WyE7QAA 1 ClassPathXmlApplicationContext False False bwDhV6aKRUCQaDjn/WyE7QAA bwDhV6aKRUCQaDjn/WyE7QAA False bwDhV6aKRUCQaDjn/WyE7QAA clMaroon $00B9FFFF 320,824;416,774 kY7rdRF4kkinvt0VxJ7uIgAA cEy5f8mLmk29ue2Cpu634wAA RO2/uQZxp0CgJC07rDqETAAA False 1.5707963267949 15 kY7rdRF4kkinvt0VxJ7uIgAA False 1.5707963267949 30 kY7rdRF4kkinvt0VxJ7uIgAA False -1.5707963267949 15 kY7rdRF4kkinvt0VxJ7uIgAA clMaroon $00B9FFFF 540 824 201 43 sdkNone RKe4WUWHGkyRUnbG2YLMOAAA 1 FileSystemXmlApplicationContext False False RKe4WUWHGkyRUnbG2YLMOAAA RKe4WUWHGkyRUnbG2YLMOAAA False RKe4WUWHGkyRUnbG2YLMOAAA clMaroon $00B9FFFF 598,824;499,774 8nrl4fwzgkON2nfuT1s/0AAA cEy5f8mLmk29ue2Cpu634wAA E31vXkuFTU2cGOlESZ4+MwAA False 1.5707963267949 15 8nrl4fwzgkON2nfuT1s/0AAA False 1.5707963267949 30 8nrl4fwzgkON2nfuT1s/0AAA False -1.5707963267949 15 8nrl4fwzgkON2nfuT1s/0AAA clMaroon $00B9FFFF 476 176 156 46 sdkNone x+tOUV3JJ0eR8grB2+LwEQAA 1 ResourcePatternResolver <<interface>> False False x+tOUV3JJ0eR8grB2+LwEQAA x+tOUV3JJ0eR8grB2+LwEQAA clMaroon $00B9FFFF 546,176;529,123 InhEbs8I+0CMZAwDfz2vBwAA NU3XTWc/BEu77lxkyrdlLwAA HszryEnpakOIzpKytGidmgAA False 1.5707963267949 15 InhEbs8I+0CMZAwDfz2vBwAA False 1.5707963267949 30 InhEbs8I+0CMZAwDfz2vBwAA False -1.5707963267949 15 InhEbs8I+0CMZAwDfz2vBwAA clMaroon $00B9FFFF 626,280;573,221 /Kjepn435U63gwWJNiOjDwAA HszryEnpakOIzpKytGidmgAA RhNuxONOtE6ErnVtlW+P5AAA False 1.5707963267949 15 /Kjepn435U63gwWJNiOjDwAA False 1.5707963267949 30 /Kjepn435U63gwWJNiOjDwAA False -1.5707963267949 15 /Kjepn435U63gwWJNiOjDwAA clMaroon $00B9FFFF 728 176 234 43 sdkNone oEcpdaUjcE+VohLe8ZGszwAA 1 PathMatchingResourcePatternResolver False False oEcpdaUjcE+VohLe8ZGszwAA oEcpdaUjcE+VohLe8ZGszwAA False oEcpdaUjcE+VohLe8ZGszwAA clMaroon $00B9FFFF 728,197;631,198 TMcQc6cj+0elJ1lhIi9bMwAA HszryEnpakOIzpKytGidmgAA V6FF4cCSyUacM01kBh2auQAA False 1.5707963267949 15 TMcQc6cj+0elJ1lhIi9bMwAA False 1.5707963267949 30 TMcQc6cj+0elJ1lhIi9bMwAA False -1.5707963267949 15 TMcQc6cj+0elJ1lhIi9bMwAA ConfigurableEnvironment 6eooFiJdkE+izOOxrEuNTgAA Oiyf7EtOLkanokZOfyZDDQAA 12 clMaroon $00B9FFFF 355 356 212 137 sdkNone 6fDpx4Z0oE+lqShTNgTq4gAA 1 ConfigurableEnvironment <<interface>> False False 6fDpx4Z0oE+lqShTNgTq4gAA 6fDpx4Z0oE+lqShTNgTq4gAA clMaroon $00B9FFFF 232 176 176 85 sdkNone zNpfuAeTv0CHYXvyiPz6qAAA 1 Environment <<interface>> False False zNpfuAeTv0CHYXvyiPz6qAAA zNpfuAeTv0CHYXvyiPz6qAAA clMaroon $00B9FFFF 556 176 229 150 sdkNone 7o7slMxw8U6wYjL/SpggfQAA 1 ConfigurablePropertyResolver <<interface>> False False 7o7slMxw8U6wYjL/SpggfQAA 7o7slMxw8U6wYjL/SpggfQAA clMaroon $00B9FFFF 360 28 215 111 sdkNone o+9xVF4/XEOG2aXyxsD6IgAA 1 PropertyResolver <<interface>> False False o+9xVF4/XEOG2aXyxsD6IgAA o+9xVF4/XEOG2aXyxsD6IgAA clMaroon $00B9FFFF 365,176;407,138 HF+GEY83GkCZ6Yqs9FfMawAA a5b8rUTFSU6eNyJViR3kmQAA JU4rd2CXeUq5O1oSynLO+gAA False 1.5707963267949 15 HF+GEY83GkCZ6Yqs9FfMawAA False 1.5707963267949 30 HF+GEY83GkCZ6Yqs9FfMawAA False -1.5707963267949 15 HF+GEY83GkCZ6Yqs9FfMawAA clMaroon $00B9FFFF 580,176;534,138 BYgb8uTd4EqLQdcqgzTcBgAA a5b8rUTFSU6eNyJViR3kmQAA 5EhYNoGMh0yhz7RELV8J9QAA False 1.5707963267949 15 BYgb8uTd4EqLQdcqgzTcBgAA False 1.5707963267949 30 BYgb8uTd4EqLQdcqgzTcBgAA False -1.5707963267949 15 BYgb8uTd4EqLQdcqgzTcBgAA clMaroon $00B9FFFF 413,356;348,260 +Qm8UlzpdUyxCU0bLIKOAQAA JU4rd2CXeUq5O1oSynLO+gAA B9nUanQiZ0+dR7vyBeQd3AAA False 1.5707963267949 15 +Qm8UlzpdUyxCU0bLIKOAQAA False 1.5707963267949 30 +Qm8UlzpdUyxCU0bLIKOAQAA False -1.5707963267949 15 +Qm8UlzpdUyxCU0bLIKOAQAA clMaroon $00B9FFFF 542,356;579,325 TzUjz9Nka0C8+kIktnFFHwAA 5EhYNoGMh0yhz7RELV8J9QAA B9nUanQiZ0+dR7vyBeQd3AAA False 1.5707963267949 15 TzUjz9Nka0C8+kIktnFFHwAA False 1.5707963267949 30 TzUjz9Nka0C8+kIktnFFHwAA False -1.5707963267949 15 TzUjz9Nka0C8+kIktnFFHwAA clMaroon $00B9FFFF 396 528 131 43 sdkNone U2qPzJOpRkCvX1DbVs6SrQAA 3 AbstractEnvironment False False U2qPzJOpRkCvX1DbVs6SrQAA U2qPzJOpRkCvX1DbVs6SrQAA False U2qPzJOpRkCvX1DbVs6SrQAA clMaroon $00B9FFFF 461,528;461,492 KLt4j+zlZEC/zyo8wIwIsAAA B9nUanQiZ0+dR7vyBeQd3AAA 2m8MXGGfjEaAGMZtFvak+wAA False 1.5707963267949 15 KLt4j+zlZEC/zyo8wIwIsAAA False 1.5707963267949 30 KLt4j+zlZEC/zyo8wIwIsAAA False -1.5707963267949 15 KLt4j+zlZEC/zyo8wIwIsAAA clMaroon $00B9FFFF 394 604 134 43 sdkNone IYFxpkg1GUW6ltuJ1xoblgAA 1 StandardEnvironment False False IYFxpkg1GUW6ltuJ1xoblgAA IYFxpkg1GUW6ltuJ1xoblgAA False IYFxpkg1GUW6ltuJ1xoblgAA clMaroon $00B9FFFF 460,604;461,570 xDyK7cccMUOOT5OFqWOh0QAA 2m8MXGGfjEaAGMZtFvak+wAA 9sMhYAElmE+RHevd0NuZVwAA False 1.5707963267949 15 xDyK7cccMUOOT5OFqWOh0QAA False 1.5707963267949 30 xDyK7cccMUOOT5OFqWOh0QAA False -1.5707963267949 15 xDyK7cccMUOOT5OFqWOh0QAA PropertyResolver 6eooFiJdkE+izOOxrEuNTgAA 4SHqd0e/YEqjYJnOAop2EwAA 7 clMaroon $00B9FFFF 335 32 215 111 sdkNone o+9xVF4/XEOG2aXyxsD6IgAA 1 PropertyResolver <<interface>> False False o+9xVF4/XEOG2aXyxsD6IgAA o+9xVF4/XEOG2aXyxsD6IgAA clMaroon $00B9FFFF 328 181 229 150 sdkNone 7o7slMxw8U6wYjL/SpggfQAA 1 ConfigurablePropertyResolver <<interface>> False False 7o7slMxw8U6wYjL/SpggfQAA 7o7slMxw8U6wYjL/SpggfQAA clMaroon $00B9FFFF 442,181;442,142 wnSe2lju2ke2O4aFMiYoogAA HZq7QedB50yN7+dKMGewygAA G6EgxRu3iESOftCYzr7hKwAA False 1.5707963267949 15 wnSe2lju2ke2O4aFMiYoogAA False 1.5707963267949 30 wnSe2lju2ke2O4aFMiYoogAA False -1.5707963267949 15 wnSe2lju2ke2O4aFMiYoogAA clMaroon $00B9FFFF 363 369 159 43 sdkNone RLzPzaZKbkqBCDJxNtoqHwAA 3 AbstractPropertyResolver False False RLzPzaZKbkqBCDJxNtoqHwAA RLzPzaZKbkqBCDJxNtoqHwAA False RLzPzaZKbkqBCDJxNtoqHwAA clMaroon $00B9FFFF 340 450 205 43 sdkNone QamtjQLIykeMrM86VPsKvwAA 1 PropertySourcesPropertyResolver False False QamtjQLIykeMrM86VPsKvwAA QamtjQLIykeMrM86VPsKvwAA False QamtjQLIykeMrM86VPsKvwAA clMaroon $00B9FFFF 442,369;442,330 A5urUBuY3kOveBe9Y7cMowAA G6EgxRu3iESOftCYzr7hKwAA tor9R18wUUKqgvrlGMSeUQAA False 1.5707963267949 15 A5urUBuY3kOveBe9Y7cMowAA False 1.5707963267949 30 A5urUBuY3kOveBe9Y7cMowAA False -1.5707963267949 15 A5urUBuY3kOveBe9Y7cMowAA clMaroon $00B9FFFF 442,450;442,411 8eLpR7FB506iTAVPSArCWAAA tor9R18wUUKqgvrlGMSeUQAA a/YjgFWCQUmrY/yWS0BVPwAA False 1.5707963267949 15 8eLpR7FB506iTAVPSArCWAAA False 1.5707963267949 30 8eLpR7FB506iTAVPSArCWAAA False -1.5707963267949 15 8eLpR7FB506iTAVPSArCWAAA PropertySources 6eooFiJdkE+izOOxrEuNTgAA 4NEXeJMwYUKjiUnNNLxcDwAA 3 clMaroon $00B9FFFF 334 72 123 72 sdkNone lvuOCBQu4UKGWuwv3KJ6XAAA 1 PropertySources <<interface>> False False lvuOCBQu4UKGWuwv3KJ6XAAA lvuOCBQu4UKGWuwv3KJ6XAAA clMaroon $00B9FFFF 320 208 151 43 sdkNone 0OUP6eP1AUC4WGSMr6C8wAAA 1 MutablePropertySources False False 0OUP6eP1AUC4WGSMr6C8wAAA 0OUP6eP1AUC4WGSMr6C8wAAA False 0OUP6eP1AUC4WGSMr6C8wAAA clMaroon $00B9FFFF 395,208;395,143 aCAB2g8V7E6cGUsFmYii9AAA CHlyWQxxa0SP1SOKFaZzbwAA ChdJsqHB7kesOs7b1GoIkAAA False 1.5707963267949 15 aCAB2g8V7E6cGUsFmYii9AAA False 1.5707963267949 30 aCAB2g8V7E6cGUsFmYii9AAA False -1.5707963267949 15 aCAB2g8V7E6cGUsFmYii9AAA PropertySource 6eooFiJdkE+izOOxrEuNTgAA LHYk1r9FqUi3cSmKzM65rAAA 21 clMaroon $00B9FFFF 296 36 166 95 sdkNone uKLIVLILH0iIM0N6VBXa5gAA 3 PropertySource False False uKLIVLILH0iIM0N6VBXa5gAA uKLIVLILH0iIM0N6VBXa5gAA False uKLIVLILH0iIM0N6VBXa5gAA clMaroon $00B9FFFF 436 180 166 69 sdkNone BKNWKXJ33U2ch95k1yoQKAAA 3 EnumerablePropertySource False False BKNWKXJ33U2ch95k1yoQKAAA BKNWKXJ33U2ch95k1yoQKAAA False BKNWKXJ33U2ch95k1yoQKAAA clMaroon $00B9FFFF 482,180;428,130 InTQiC10q0Kt6ksLH2t5iAAA 8csK9TqyK0iTF2cDno0EjwAA XoDV+uDukUS0zm6Fpkp2vgAA False 1.5707963267949 15 InTQiC10q0Kt6ksLH2t5iAAA False 1.5707963267949 30 InTQiC10q0Kt6ksLH2t5iAAA False -1.5707963267949 15 InTQiC10q0Kt6ksLH2t5iAAA clMaroon $00B9FFFF 212 300 179 69 xs3Z2C3rzEqitr//pReeSgAA 3 CommandLinePropertySource False False xs3Z2C3rzEqitr//pReeSgAA xs3Z2C3rzEqitr//pReeSgAA False xs3Z2C3rzEqitr//pReeSgAA clMaroon $00B9FFFF 76 416 205 43 TsG4o5o8NkG74GpCuneMcAAA 1 JOptCommandLinePropertySource False False TsG4o5o8NkG74GpCuneMcAAA TsG4o5o8NkG74GpCuneMcAAA False TsG4o5o8NkG74GpCuneMcAAA clMaroon $00B9FFFF 312 416 217 43 edMcCT5eYUuD0KsIHKT+owAA 1 SimpleCommandLinePropertySource False False edMcCT5eYUuD0KsIHKT+owAA edMcCT5eYUuD0KsIHKT+owAA False edMcCT5eYUuD0KsIHKT+owAA clMaroon $00B9FFFF 362,300;456,248 oRAMqatnvkW7ae2M0Bu9GwAA XoDV+uDukUS0zm6Fpkp2vgAA KCLoNKRN7ES3CAM4YfQiuQAA False 1.5707963267949 15 oRAMqatnvkW7ae2M0Bu9GwAA False 1.5707963267949 30 oRAMqatnvkW7ae2M0Bu9GwAA False -1.5707963267949 15 oRAMqatnvkW7ae2M0Bu9GwAA clMaroon $00B9FFFF 203,416;260,368 rb4CKSf44k25SENMlHVQlAAA KCLoNKRN7ES3CAM4YfQiuQAA phIXYmv+EU6496bxNEHSRwAA False 1.5707963267949 15 rb4CKSf44k25SENMlHVQlAAA False 1.5707963267949 30 rb4CKSf44k25SENMlHVQlAAA False -1.5707963267949 15 rb4CKSf44k25SENMlHVQlAAA clMaroon $00B9FFFF 396,416;340,368 xef0ENo/NEiq/PTeYl2dOQAA KCLoNKRN7ES3CAM4YfQiuQAA Wv9xhASwc0i9XRzl95H4mwAA False 1.5707963267949 15 xef0ENo/NEiq/PTeYl2dOQAA False 1.5707963267949 30 xef0ENo/NEiq/PTeYl2dOQAA False -1.5707963267949 15 xef0ENo/NEiq/PTeYl2dOQAA clMaroon $00B9FFFF 421 300 165 82 riXQVdXIZ02zm0NuVBhf2wAA 1 CompositePropertySource False False riXQVdXIZ02zm0NuVBhf2wAA riXQVdXIZ02zm0NuVBhf2wAA False riXQVdXIZ02zm0NuVBhf2wAA clMaroon $00B9FFFF 508,300;514,248 7M2c3nbLw02QGVZD1J86tAAA XoDV+uDukUS0zm6Fpkp2vgAA 33AoohI68US7useFrK+d6gAA False 1.5707963267949 15 7M2c3nbLw02QGVZD1J86tAAA False 1.5707963267949 30 7M2c3nbLw02QGVZD1J86tAAA False -1.5707963267949 15 7M2c3nbLw02QGVZD1J86tAAA clMaroon $00B9FFFF 616 300 165 82 0G95rtMbMkGOVGNGUylrTwAA 1 MapPropertySource False False 0G95rtMbMkGOVGNGUylrTwAA 0G95rtMbMkGOVGNGUylrTwAA False 0G95rtMbMkGOVGNGUylrTwAA clMaroon $00B9FFFF 641,300;567,248 nmHxsfPUH0uMgV7NLgoPQAAA XoDV+uDukUS0zm6Fpkp2vgAA ofVZ47URd0q//8gDOJ1aYQAA False 1.5707963267949 15 nmHxsfPUH0uMgV7NLgoPQAAA False 1.5707963267949 30 nmHxsfPUH0uMgV7NLgoPQAAA False -1.5707963267949 15 nmHxsfPUH0uMgV7NLgoPQAAA clMaroon $00B9FFFF 132 180 141 56 nv96eSShbEO1tnb3nAtytQAA 1 JndiPropertySource False False nv96eSShbEO1tnb3nAtytQAA nv96eSShbEO1tnb3nAtytQAA False nv96eSShbEO1tnb3nAtytQAA clMaroon $00B9FFFF 240,180;311,130 9dc0xBoytkGjG5XqAMYu1wAA 8csK9TqyK0iTF2cDno0EjwAA fz4ooYRQQUKQC0x7WctXHAAA False 1.5707963267949 15 9dc0xBoytkGjG5XqAMYu1wAA False 1.5707963267949 30 9dc0xBoytkGjG5XqAMYu1wAA False -1.5707963267949 15 9dc0xBoytkGjG5XqAMYu1wAA clMaroon $00B9FFFF 804 416 214 69 ivhMphxwukqsfoGz7lapfwAA 1 SystemEnvironmentPropertySource False False ivhMphxwukqsfoGz7lapfwAA ivhMphxwukqsfoGz7lapfwAA False ivhMphxwukqsfoGz7lapfwAA clMaroon $00B9FFFF 587 416 158 43 B6FADWablEW17McE5tzbgQAA 1 PropertiesPropertySource False False B6FADWablEW17McE5tzbgQAA B6FADWablEW17McE5tzbgQAA False B6FADWablEW17McE5tzbgQAA clMaroon $00B9FFFF 590 508 152 43 XIx80iKLUEKrRmQb2g/QlwAA 1 ResourcePropertySource False False XIx80iKLUEKrRmQb2g/QlwAA XIx80iKLUEKrRmQb2g/QlwAA False XIx80iKLUEKrRmQb2g/QlwAA clMaroon $00B9FFFF 672,416;684,381 KWE3w89dYU2y8vUO6VPD/AAA ofVZ47URd0q//8gDOJ1aYQAA ZOn3N4yC30eZ0KrCvKIfaQAA False 1.5707963267949 15 KWE3w89dYU2y8vUO6VPD/AAA False 1.5707963267949 30 KWE3w89dYU2y8vUO6VPD/AAA False -1.5707963267949 15 KWE3w89dYU2y8vUO6VPD/AAA clMaroon $00B9FFFF 844,416;777,381 CiJHZkIANkKwAlfb7JEpaQAA ofVZ47URd0q//8gDOJ1aYQAA wSTCYN8ovESWUhnKxWxqwQAA False 1.5707963267949 15 CiJHZkIANkKwAlfb7JEpaQAA False 1.5707963267949 30 CiJHZkIANkKwAlfb7JEpaQAA False -1.5707963267949 15 CiJHZkIANkKwAlfb7JEpaQAA clMaroon $00B9FFFF 665,508;665,458 5Okg+yP8K0qo5g6wa7yS1wAA ZOn3N4yC30eZ0KrCvKIfaQAA 6RVdgqhCy0+iMo+R9/xplQAA False 1.5707963267949 15 5Okg+yP8K0qo5g6wa7yS1wAA False 1.5707963267949 30 5Okg+yP8K0qo5g6wa7yS1wAA False -1.5707963267949 15 5Okg+yP8K0qo5g6wa7yS1wAA 91 ResourceLoader 6eooFiJdkE+izOOxrEuNTgAA 3 NU3XTWc/BEu77lxkyrdlLwAA iizMiKT2mEOUmYSU19SkagAA UAZn/2ZCWUu53K3OmosgQAAA 1 gPF2N18LgEO4cq70twKRmwAA 2 InhEbs8I+0CMZAwDfz2vBwAA 2qfOA/SRL0qSrBMZPvnIYwAA 2 getResource hDybVb95ZkCtdnWORm8lxwAA 1 String location 992sZmQgAE+7rAX6XqlDUgAA getClassLoader hDybVb95ZkCtdnWORm8lxwAA 1 CLASSPATH_URL_PREFIX hDybVb95ZkCtdnWORm8lxwAA DefaultResourceLoader 6eooFiJdkE+izOOxrEuNTgAA 4 Miusv09i10CpLvE8QbQD2wAA xiuadWPwIE2Z6a7JXs64ugAA 4iyubBOGdkOplmqtA4B1zwAA OVnkWVqzbUS6LoYhBPmXBQAA 1 gPF2N18LgEO4cq70twKRmwAA 4 JuwW17+XpEyu82pacm1W7AAA D4dTQtLfTkKFelspkdsldAAA GCKbtbV5MkmzeewK94/nuwAA yu6pp0C6xE2Y8WsqgglhKgAA 2 addProtocolResolver /FtEC3pKi0WdIB5Q0P3zyQAA 1 ProtocolResolver BAbmem/bU0ynEIX/Et1GbAAA getProtocolResolvers /FtEC3pKi0WdIB5Q0P3zyQAA FileSystemResourceLoader 6eooFiJdkE+izOOxrEuNTgAA 4 JrlmBEhPlEy1CKdWqJaRJAAA XUjFXUQjj0CLoeByA4DTlgAA jniLkap2b0ioQ2zFMwONCAAA ikYESStJb0KKa1wT2TMnkAAA 2 JuwW17+XpEyu82pacm1W7AAA D4dTQtLfTkKFelspkdsldAAA 1 getResourceByPath vkProtected WeI5VK83yEuXDwmBYTNJRQAA 1 String path 7m5xS99KsEipPK/z5s0mRgAA 6eooFiJdkE+izOOxrEuNTgAA /FtEC3pKi0WdIB5Q0P3zyQAA hDybVb95ZkCtdnWORm8lxwAA 4 DNK7uBPsD0CHt736PvG2ggAA Yb9eSPGk6E+Yqf7qoJ1ShAAA mZA8A3ikp0u6Iiq/Vh69kgAA giz68CKiD0KOwLU9+mCvaQAA 6eooFiJdkE+izOOxrEuNTgAA WeI5VK83yEuXDwmBYTNJRQAA /FtEC3pKi0WdIB5Q0P3zyQAA 6eooFiJdkE+izOOxrEuNTgAA WeI5VK83yEuXDwmBYTNJRQAA /FtEC3pKi0WdIB5Q0P3zyQAA 4 GhzXXbm7AE+stM9UE35qUwAA K9Siz5i07U+1UkR8ROFGdgAA ZEgNbEPiXEO7yMKUDefW2wAA O9x6VBXPwEioHIUfjm49HwAA ClassRelativeResourceLoader 6eooFiJdkE+izOOxrEuNTgAA 4 QPH2knF09EWWbLHyyUeU9gAA 4erONPgKKEWGlC760UteagAA GyIZdbBhGUmD9Oc6+Yh+BgAA WxFDHKGzvkeXmsn9VlYotQAA 1 GCKbtbV5MkmzeewK94/nuwAA 1 getResourceByPath vkProtected GoAJj7SK9EuEnw6bpQhwnQAA 1 String path g8Ifsl4yHUeEQoy9HK5H2AAA 6eooFiJdkE+izOOxrEuNTgAA GoAJj7SK9EuEnw6bpQhwnQAA /FtEC3pKi0WdIB5Q0P3zyQAA 4 UZcT8CpMHU+R9ssdBb/QHQAA oBIwCk+YRUa/zLSmhQXH+QAA 55EvqEbgrUyPe+oplr4KwAAA 33XbPBI1zkGLwNEH+3vciAAA AbstractApplicationContext True 6eooFiJdkE+izOOxrEuNTgAA 4 vVX4w/Fjo0SpqY8HH1IZOAAA D2gJuBadPUiwhRwq9MF6bAAA 0k0oL3/bP0+nJOY0MeblCAAA 7yY4eFOjxUmqs5UvRHpcqAAA 1 rKkkrs0UVkm/xfWq70MjPQAA 1 yu6pp0C6xE2Y8WsqgglhKgAA 1 N/1YApMrHk6T4MkcjuYIzgAA 6eooFiJdkE+izOOxrEuNTgAA 50/oHuZbCEm40+kSv4xkOQAA /FtEC3pKi0WdIB5Q0P3zyQAA 4 DXonoKm/FUiZGtbOpUvS1AAA x01yz5EBOEulMqGMiWYNUQAA TXIPGNs/LEmKLGSuD/zLxQAA p4mqW7F5vEum+Jns+UVsXwAA ConfigurableApplicationContext 6eooFiJdkE+izOOxrEuNTgAA 3 Ww6zG/aIKk6r4yv1aP6JogAA +507JUSG/EWnw7Qja7AAEAAA rTtcWuZcUEKaGLdDgImobQAA 1 rKkkrs0UVkm/xfWq70MjPQAA 3 +5OzMhzHH0y2c8LzLGRCQQAA 8rsbo5lEd0ejOg+/y1BADgAA SlZZI2U2Wkyp62yqqBsJtQAA 6eooFiJdkE+izOOxrEuNTgAA 50/oHuZbCEm40+kSv4xkOQAA BGLK54QHuEi9JrXkIwvt9QAA 4 72pM5IOZfk6BlF350Y7ZEgAA ZhTsV0SWvk6Iuo8fehtK0AAA K5hCy9NmEU2rV9f2GHyllAAA YuHb3uhJUU+/0Fm+MV4PBAAA ApplicationContext 6eooFiJdkE+izOOxrEuNTgAA 3 RhNuxONOtE6ErnVtlW+P5AAA +DEMC6a22U27P0HADXeXpAAA +30fG/b3ZUGry0LAX4+3UQAA 1 /Kjepn435U63gwWJNiOjDwAA 1 +5OzMhzHH0y2c8LzLGRCQQAA 6eooFiJdkE+izOOxrEuNTgAA BGLK54QHuEi9JrXkIwvt9QAA lFir+W8oe02JBSON90x/ygAA 4 HX/qU9TkPkaB2ZqONGxBzgAA IUmT3UtZhEiG5ipTTvUniQAA b+gcm6Xup0O7UqT5pwZk3gAA oidyArL9oUq+6TY1drkmZwAA Lifecycle 6eooFiJdkE+izOOxrEuNTgAA 3 eHyv/+usbEuCBKnkT049WgAA FDnp7GWQBESTRCnFnDzVNwAA Bv0+xPtIs0Wtwjhje08wqgAA 1 8rsbo5lEd0ejOg+/y1BADgAA 6eooFiJdkE+izOOxrEuNTgAA BGLK54QHuEi9JrXkIwvt9QAA ee8KCeaKVEOoYTEhFF+74wAA 4 G6zRJPFsakuKLgRSi7KTygAA AjsAdbVXPUmZMMTjqWWuYAAA Yi6U7ac40kmLEOs6aRxI4QAA DgwL2w84LkK4Efl48v9i4QAA Closeable 6eooFiJdkE+izOOxrEuNTgAA 3 b4ReA2jJ+E+mJ/4xDNAorgAA 5S3uRerwhEG4dmvZf3HtgwAA F0oelcqLaEqeD9eYXUWq3wAA 1 SlZZI2U2Wkyp62yqqBsJtQAA 6eooFiJdkE+izOOxrEuNTgAA BGLK54QHuEi9JrXkIwvt9QAA +hjyiKZOS0WGUUiuCb09JAAA 4 MeEsUQMlBkyvpOXDUbdPIgAA 5QvDhanFB0e+Skzs5+6YKAAA FFb5hgZdL06Ju1BrlNFNjgAA YJDY2O2eF02K/F/7SJcGbQAA AbstractRefreshableApplicationContext True 6eooFiJdkE+izOOxrEuNTgAA 4 b1M21K3P20euCCbnUcl8IAAA AkySV+pJf0qj60axpdrbVwAA uU4iSkGgoESr6bxv8i/GeAAA 4S2zc2MTtEqHFiOmjfJS7gAA 1 N/1YApMrHk6T4MkcjuYIzgAA 1 ydmglSpfoE6ccV5cTOnl1AAA AbstractRefreshableConfigApplicationContext True 6eooFiJdkE+izOOxrEuNTgAA 4 za3NtrH5a0CG2UABkWyksAAA lE4PyxcLY0ev21JpmeKbAAAA UNr/QT8OCEWM+P6JWHS43AAA ofgtYgevFEWkeA572rla9AAA 1 ydmglSpfoE6ccV5cTOnl1AAA 1 bdADOSzxu0mwrZJqUENBhQAA 6eooFiJdkE+izOOxrEuNTgAA BEvxRapz30mKUXLDLkOXdQAA 50/oHuZbCEm40+kSv4xkOQAA 4 2oVPETvEjEqS5h3g160YUwAA oiorDGlEG02P9h2NDeuGrAAA YhLT81SoP0S3Xw5FFwJLGgAA Uk2z6ftst0Si57bwONhDQAAA 6eooFiJdkE+izOOxrEuNTgAA vG4azfyb30Sm0o/6aGjWEQAA BEvxRapz30mKUXLDLkOXdQAA 4 bVaQjnyraES2hZtkEHp2xAAA N9d81uxS+EOdZaFcIUhOYAAA IBRQvyEqxE2Pz+/+2gSAywAA s0AblGRrn0qs7cAvVx36OgAA AbstractXmlApplicationContext True 6eooFiJdkE+izOOxrEuNTgAA 4 cEy5f8mLmk29ue2Cpu634wAA zTctQQEHHUmvtj7tDlgpQQAA tvY/+yYNbUm/+6BSx+pSFwAA aOanu9CkX06PXBEcvz0l1QAA 1 bdADOSzxu0mwrZJqUENBhQAA 2 kY7rdRF4kkinvt0VxJ7uIgAA 8nrl4fwzgkON2nfuT1s/0AAA 6eooFiJdkE+izOOxrEuNTgAA 7f8epg+O+k+uKbOI0O1HiQAA vG4azfyb30Sm0o/6aGjWEQAA 4 xDJmhl529kGhC5qs9Sg3nwAA 5ZH7SProOUSKDW6xHbPyvgAA M0jFfvxkO0GzlToVzBItOAAA 4GpMRtnJi0axctTTAroVYgAA ClassPathXmlApplicationContext 6eooFiJdkE+izOOxrEuNTgAA 4 RO2/uQZxp0CgJC07rDqETAAA IADXKAmMVk6AIDMNJuQvEAAA TP7ftFaSCk6V7nT28ZNRjQAA U8wfIlo5sUKsJu8ahW+jOgAA 1 kY7rdRF4kkinvt0VxJ7uIgAA 6eooFiJdkE+izOOxrEuNTgAA bwDhV6aKRUCQaDjn/WyE7QAA 7f8epg+O+k+uKbOI0O1HiQAA 4 nXwvx56H7EW9dUZlPvl1KwAA myld8Zoq60anZt+bcg9+yQAA mZLDcxGfw022A7RIHq7s3AAA 1g4Ec87WxkKQPoxEAEseCgAA FileSystemXmlApplicationContext 6eooFiJdkE+izOOxrEuNTgAA 4 E31vXkuFTU2cGOlESZ4+MwAA TNcuxzxyMEyHJEB0u0jeHgAA XMB62mEURkyePP+mxe3yHgAA 7XqcQ04oIE6+hrG7PePkdAAA 1 8nrl4fwzgkON2nfuT1s/0AAA 6eooFiJdkE+izOOxrEuNTgAA RKe4WUWHGkyRUnbG2YLMOAAA 7f8epg+O+k+uKbOI0O1HiQAA 4 acfRmF+nq0S4IdD6qbcfRAAA TGp5wTtxfEmaVRgw1jf2jwAA BuwNeNP8P0qTQpb5SaQ2vgAA 3PaOh6cwpU+rHbtTPcY1TwAA ResourcePatternResolver 6eooFiJdkE+izOOxrEuNTgAA 3 HszryEnpakOIzpKytGidmgAA qBaNOyvfP0u86c9Y2/HX/QAA 36FOkcQF902plEto6qmACwAA 1 TMcQc6cj+0elJ1lhIi9bMwAA 1 InhEbs8I+0CMZAwDfz2vBwAA 1 /Kjepn435U63gwWJNiOjDwAA 6eooFiJdkE+izOOxrEuNTgAA x+tOUV3JJ0eR8grB2+LwEQAA hDybVb95ZkCtdnWORm8lxwAA 4 2Zemx6dyQ0GAmMZYD+iQ0QAA OWsyhBRYw0qkdpAv//z3vgAA xBe7hQJjnU+jT9rFp6dBbAAA b8+sgOnYfE+US48fBn8QFQAA 6eooFiJdkE+izOOxrEuNTgAA lFir+W8oe02JBSON90x/ygAA x+tOUV3JJ0eR8grB2+LwEQAA 4 7wMx8sx+P0OLoilsMNiMqgAA /qdkx776ckuyx7cy23TuhQAA e/fb9MpwakKAE4fWt9HDLgAA SuU9EPUwykihZc5gpKpiOQAA PathMatchingResourcePatternResolver 6eooFiJdkE+izOOxrEuNTgAA 4 V6FF4cCSyUacM01kBh2auQAA 12CktCN2fEaJvFPQefVHiwAA YhSv30xE6U6BZSg1MqViSgAA R90bOEppikuHmNZOpeG55AAA 1 TMcQc6cj+0elJ1lhIi9bMwAA 1 2qfOA/SRL0qSrBMZPvnIYwAA 6eooFiJdkE+izOOxrEuNTgAA oEcpdaUjcE+VohLe8ZGszwAA hDybVb95ZkCtdnWORm8lxwAA ConfigurableEnvironment 6eooFiJdkE+izOOxrEuNTgAA 3 B9nUanQiZ0+dR7vyBeQd3AAA 62GJZWNb3kGW8lvbdXrF/wAA 9c/uTjSL4kqcYF9spgBAGAAA 1 KLt4j+zlZEC/zyo8wIwIsAAA 2 +Qm8UlzpdUyxCU0bLIKOAQAA TzUjz9Nka0C8+kIktnFFHwAA 7 setActiveProfiles 6fDpx4Z0oE+lqShTNgTq4gAA addActiveProfile 6fDpx4Z0oE+lqShTNgTq4gAA setDefaultProfiles 6fDpx4Z0oE+lqShTNgTq4gAA getPropertySources 6fDpx4Z0oE+lqShTNgTq4gAA getSystemEnvironment 6fDpx4Z0oE+lqShTNgTq4gAA getSystemProperties 6fDpx4Z0oE+lqShTNgTq4gAA merge 6fDpx4Z0oE+lqShTNgTq4gAA 1 ConfigurableEnvironment parent 30pR+tFO0UmExjXrmaVVEQAA Environment 6eooFiJdkE+izOOxrEuNTgAA 3 JU4rd2CXeUq5O1oSynLO+gAA uwXj0gY4IUOaOeL7eDnmEAAA 8FJypH974EixzEALUc+qDQAA 1 HF+GEY83GkCZ6Yqs9FfMawAA 1 +Qm8UlzpdUyxCU0bLIKOAQAA 3 getActiveProfiles zNpfuAeTv0CHYXvyiPz6qAAA getDefaultProfiles zNpfuAeTv0CHYXvyiPz6qAAA acceptsProfiles zNpfuAeTv0CHYXvyiPz6qAAA 1 String... profiles SsziOMJy50WF43he87XVhgAA ConfigurablePropertyResolver 6eooFiJdkE+izOOxrEuNTgAA 6 5EhYNoGMh0yhz7RELV8J9QAA kc5YNI6cOUSXTSmwtX7URQAA k0GirobD2kmbl1VqlhjajQAA G6EgxRu3iESOftCYzr7hKwAA x6lUigIx1E2atFbor/XfMgAA sMnPA/LmhUeHiXlHVLJYxQAA 1 A5urUBuY3kOveBe9Y7cMowAA 2 BYgb8uTd4EqLQdcqgzTcBgAA wnSe2lju2ke2O4aFMiYoogAA 1 TzUjz9Nka0C8+kIktnFFHwAA 8 getConversionService 7o7slMxw8U6wYjL/SpggfQAA setConversionService 7o7slMxw8U6wYjL/SpggfQAA setPlaceholderPrefix 7o7slMxw8U6wYjL/SpggfQAA setPlaceholderSuffix 7o7slMxw8U6wYjL/SpggfQAA setValueSeparator 7o7slMxw8U6wYjL/SpggfQAA setIgnoreUnresolvableNestedPlaceholders 7o7slMxw8U6wYjL/SpggfQAA setRequiredProperties 7o7slMxw8U6wYjL/SpggfQAA validateRequiredProperties 7o7slMxw8U6wYjL/SpggfQAA PropertyResolver 6eooFiJdkE+izOOxrEuNTgAA 6 a5b8rUTFSU6eNyJViR3kmQAA FX+NsuhvDEqwSo/rwtJgIgAA MVQ7AxYUf0OzelP5Xcbd2gAA HZq7QedB50yN7+dKMGewygAA C9q+WPXsCEmSKDOmeMekYQAA JfPvvDnZdEG9FMu8OGEQagAA 3 HF+GEY83GkCZ6Yqs9FfMawAA BYgb8uTd4EqLQdcqgzTcBgAA wnSe2lju2ke2O4aFMiYoogAA 5 containsProperty o+9xVF4/XEOG2aXyxsD6IgAA 1 String key hxrHz1VWTU+DOh/br9CM6gAA getProperty o+9xVF4/XEOG2aXyxsD6IgAA 1 String key CNNYS7euUUu9mVUliuvu5QAA getRequiredProperty o+9xVF4/XEOG2aXyxsD6IgAA 1 String key yxsqLUoICUaX5vEAYqUMGwAA resolvePlaceholders o+9xVF4/XEOG2aXyxsD6IgAA 1 String text WXs8/aA+bk6ArCvJoPTcNwAA resolveRequiredPlaceholders o+9xVF4/XEOG2aXyxsD6IgAA 1 String text MnoiZ7Na3UqRY1MJu3F29wAA 6eooFiJdkE+izOOxrEuNTgAA zNpfuAeTv0CHYXvyiPz6qAAA o+9xVF4/XEOG2aXyxsD6IgAA 4 8V+7RV1RG02QylvWfG2gsQAA K9eYKhjUW0KyvyRDNVS1JQAA s3/YDZPv/EWCNz1AscUJZAAA X1dAQLj1AEui/ZjW+KaTtwAA 6eooFiJdkE+izOOxrEuNTgAA 7o7slMxw8U6wYjL/SpggfQAA o+9xVF4/XEOG2aXyxsD6IgAA 4 qbWP/Hd+aEmynryUQDJ9oAAA O7xjQSbbRU2oHjG8SwzzlgAA 1efICpQeuUCWnPuQZxs8JgAA SkPMhMjojUSENvYHZpx+mgAA 6eooFiJdkE+izOOxrEuNTgAA 6fDpx4Z0oE+lqShTNgTq4gAA zNpfuAeTv0CHYXvyiPz6qAAA 4 YqYtRmHFQEy5cM2DB4XizQAA 3K6HhLVnNEyvG61GNdvXaQAA cga3BCDQD0G0btfJm+lWPQAA F5PCqs5V902uUaxnGg3PxwAA 6eooFiJdkE+izOOxrEuNTgAA 6fDpx4Z0oE+lqShTNgTq4gAA 7o7slMxw8U6wYjL/SpggfQAA 4 V+PQ8kMzKEy9haj2IH73MQAA /myp5+UDTEiHdcsgF+by1gAA NW3g58N8bEmYltMPfsCmkAAA iJ65vh9oqECCdKvL20T0AAAA AbstractEnvironment True 6eooFiJdkE+izOOxrEuNTgAA 4 2m8MXGGfjEaAGMZtFvak+wAA URTO3sKW4Ey7Ma+qR2WXvgAA SqO4ecggqEqXBm1nahtm9QAA GAAjZ/o540aC20zRal62xQAA 1 KLt4j+zlZEC/zyo8wIwIsAAA 1 xDyK7cccMUOOT5OFqWOh0QAA 6eooFiJdkE+izOOxrEuNTgAA U2qPzJOpRkCvX1DbVs6SrQAA 6fDpx4Z0oE+lqShTNgTq4gAA 4 oUrY8Oed7UKiv1JCyIj1xgAA kfnFdRktFUOGpDMcd30g/QAA y0VMP42d/ka0f/BEuTieXQAA xeLYDzN3L0WEVyFi24whfgAA StandardEnvironment 6eooFiJdkE+izOOxrEuNTgAA 4 9sMhYAElmE+RHevd0NuZVwAA 5OSUeD2iWECAe0qcdlHMcgAA nHaW/LQW7EykODBh6rgIKQAA P9jQWcJ3ukacagpz2oefxwAA 1 xDyK7cccMUOOT5OFqWOh0QAA 6eooFiJdkE+izOOxrEuNTgAA IYFxpkg1GUW6ltuJ1xoblgAA U2qPzJOpRkCvX1DbVs6SrQAA 4 Oq2YiRhHkUGsbeAiozo09AAA Q5P05BaxHkKU/tmRhDmptwAA y2dyvOw3hE+dIrrAEOdMqgAA jnk4NZn0i0WkFAGAwdTvmgAA 6eooFiJdkE+izOOxrEuNTgAA 7o7slMxw8U6wYjL/SpggfQAA o+9xVF4/XEOG2aXyxsD6IgAA 4 nysR+PGMk0CHldObg0W/jAAA oHSxl7rIAEeyjzQs5e1nfgAA j3gOjRCjl0KH/riZg/BCMQAA N/XeFs/CXEiYAbPOVhk0tAAA AbstractPropertyResolver True 6eooFiJdkE+izOOxrEuNTgAA 4 tor9R18wUUKqgvrlGMSeUQAA XS0kPOtqtUqxA3DiMW5hhgAA Esda/eLXGE2QGjT1qYUwewAA 2jHxJsqFLEKQImtSTXnZnwAA 1 A5urUBuY3kOveBe9Y7cMowAA 1 8eLpR7FB506iTAVPSArCWAAA PropertySourcesPropertyResolver 6eooFiJdkE+izOOxrEuNTgAA 4 a/YjgFWCQUmrY/yWS0BVPwAA kO4HEgmcnku8waShhB54DgAA UnghAp8Lkku2yWjWPKQVsQAA IV7T+QDrqkyzCesgJAzCvQAA 1 8eLpR7FB506iTAVPSArCWAAA 6eooFiJdkE+izOOxrEuNTgAA RLzPzaZKbkqBCDJxNtoqHwAA 7o7slMxw8U6wYjL/SpggfQAA 4 q/VR2TibYkeBdmmBAcje1QAA OcF1PXdnAkuYOc4FlzMPkAAA 9YjNZV7eW0St2PIVx18migAA wxBjtfWvTkqNgUDvE2H5tgAA 6eooFiJdkE+izOOxrEuNTgAA QamtjQLIykeMrM86VPsKvwAA RLzPzaZKbkqBCDJxNtoqHwAA 4 skZxQQ4qTUCw3czPvjd+HwAA a8dAAn7MX0GCDWSeLyTLDQAA 2x1oQHsuL0mWbEqf73sSzAAA MbKz6Aao+02syQk5w56aPAAA PropertySources 6eooFiJdkE+izOOxrEuNTgAA 3 CHlyWQxxa0SP1SOKFaZzbwAA XoEKXzBcw0iZlNfg1UKDJgAA 5VkQ+PmZIE+jo1QXw82mcwAA 1 aCAB2g8V7E6cGUsFmYii9AAA 2 contains lvuOCBQu4UKGWuwv3KJ6XAAA 1 String name Ky9raQcYK0ybxawR8566uwAA get lvuOCBQu4UKGWuwv3KJ6XAAA 1 String name yX/uGD+ptEusfqyzRb6PGQAA MutablePropertySources 6eooFiJdkE+izOOxrEuNTgAA 4 ChdJsqHB7kesOs7b1GoIkAAA ugkLh5W6mUmKBEMxAQJn1QAA TFv6W8VM9kWN3Y6jCrMw1AAA Ctnzcp2ENUu1Ku9gJFMA0AAA 1 aCAB2g8V7E6cGUsFmYii9AAA 6eooFiJdkE+izOOxrEuNTgAA 0OUP6eP1AUC4WGSMr6C8wAAA lvuOCBQu4UKGWuwv3KJ6XAAA 4 LUewY+AzQk+cp7n8tzJz8gAA puAKyVxptEmd7tAkCToCEQAA WQmR8iJcSkWL0ZB3tQUjgAAA /QzJxdKtlk6ZTOsugOG5rQAA PropertySource True 6eooFiJdkE+izOOxrEuNTgAA 4 8csK9TqyK0iTF2cDno0EjwAA VHxmwMJvv0mrW/FHOEQWEQAA kw3o4Fhwik+HGDnqRceqiwAA iRzdrHOYZU2Q/hUtALmhEAAA 2 InTQiC10q0Kt6ksLH2t5iAAA 9dc0xBoytkGjG5XqAMYu1wAA 4 getName uKLIVLILH0iIM0N6VBXa5gAA getSource uKLIVLILH0iIM0N6VBXa5gAA containsProperty uKLIVLILH0iIM0N6VBXa5gAA 1 String name Zie2vh417EGouSA8E6YHEwAA getProperty uKLIVLILH0iIM0N6VBXa5gAA 1 String name 1Pxp47xX5EmG6lSfTiHW9QAA EnumerablePropertySource True 6eooFiJdkE+izOOxrEuNTgAA 4 XoDV+uDukUS0zm6Fpkp2vgAA sDFUtpe/vkK29lRZMCz+1QAA cKSiOsse3E68KFPHam3wsQAA 899EhNlGOEK583ghHbi4rgAA 1 InTQiC10q0Kt6ksLH2t5iAAA 3 oRAMqatnvkW7ae2M0Bu9GwAA 7M2c3nbLw02QGVZD1J86tAAA nmHxsfPUH0uMgV7NLgoPQAAA 2 containsProperty BKNWKXJ33U2ch95k1yoQKAAA 1 String name iT6JEuKghkKDB4SkVwDQvQAA getPropertyNames BKNWKXJ33U2ch95k1yoQKAAA 6eooFiJdkE+izOOxrEuNTgAA BKNWKXJ33U2ch95k1yoQKAAA uKLIVLILH0iIM0N6VBXa5gAA 4 SjvkVHopK0SljbrBb4k3cwAA ekMYdhOqrU6LDfaLJU40bgAA BRqxY//QzUe48/zQmnmRkQAA AHnUm4rhkku5yKI+CXE2VQAA CommandLinePropertySource True 6eooFiJdkE+izOOxrEuNTgAA 4 KCLoNKRN7ES3CAM4YfQiuQAA 8zfUC5weoUCANCZJkFa7dAAA 30c1Aj2FOUeZhfzdAZBWmwAA rdLEORBaXEW77wH20drq7QAA 1 oRAMqatnvkW7ae2M0Bu9GwAA 2 rb4CKSf44k25SENMlHVQlAAA xef0ENo/NEiq/PTeYl2dOQAA 2 containsProperty xs3Z2C3rzEqitr//pReeSgAA getProperty xs3Z2C3rzEqitr//pReeSgAA JOptCommandLinePropertySource 6eooFiJdkE+izOOxrEuNTgAA 4 phIXYmv+EU6496bxNEHSRwAA QYAbfjC6M0eKMDWYzA8hhgAA 9mT6uAtkq0uRJAqtkRVZuQAA iH81cL9R5UuzavmmFwIxHwAA 1 rb4CKSf44k25SENMlHVQlAAA SimpleCommandLinePropertySource 6eooFiJdkE+izOOxrEuNTgAA 4 Wv9xhASwc0i9XRzl95H4mwAA 1ON9RnG0OE6lIAHJlvLF+QAA uucD8wu+rk+UrmyALNffjwAA EXd13Ao3UkecKrDp5K5ohwAA 1 xef0ENo/NEiq/PTeYl2dOQAA 6eooFiJdkE+izOOxrEuNTgAA xs3Z2C3rzEqitr//pReeSgAA BKNWKXJ33U2ch95k1yoQKAAA 4 mGSkuKC/Z0SUcrFHcE4hAwAA arjnphh+PEWoAD15oEJKcAAA jgMuGfVbekeUnUdEGptScAAA FK+m/E5NgkuhZDQP+ay97wAA 6eooFiJdkE+izOOxrEuNTgAA TsG4o5o8NkG74GpCuneMcAAA xs3Z2C3rzEqitr//pReeSgAA 4 GBmM70zFnkqjK7rDpZvVFgAA 5apRid3dsUmLd+Ntk3THGAAA /c0iEwxiG0iba2ZLHMkdsgAA PURLptucOUyJRPR8rZSg8wAA 6eooFiJdkE+izOOxrEuNTgAA edMcCT5eYUuD0KsIHKT+owAA xs3Z2C3rzEqitr//pReeSgAA 4 ee/pu6SR70OkNLdeHLyzXwAA avs+tEXfcEigkiLovGReUgAA kptRCYagGkOYxshBU6PQlQAA AanXpTAb9EidWR8ktkcIgQAA CompositePropertySource 6eooFiJdkE+izOOxrEuNTgAA 4 33AoohI68US7useFrK+d6gAA +4N51swY+kqFaugLZe0wowAA TuN9xzCK+ECiBpsA5Rc8rwAA 9h7tpcBGckmfATQxlj9yrQAA 1 7M2c3nbLw02QGVZD1J86tAAA 3 getProperty riXQVdXIZ02zm0NuVBhf2wAA 1 String name gdKcA/+xZkiDWdFpCHdHeQAA containsProperty riXQVdXIZ02zm0NuVBhf2wAA 1 String name Btkl0rWGEESrojKMeRDhNAAA getPropertyNames riXQVdXIZ02zm0NuVBhf2wAA 6eooFiJdkE+izOOxrEuNTgAA riXQVdXIZ02zm0NuVBhf2wAA BKNWKXJ33U2ch95k1yoQKAAA 4 Vi2BAjljNUexRKhBXEIXTgAA wNo1IEUshEufpgLEwlYfOgAA i6pF7a4kx0a+LMe6J+BEzgAA bwEaL1swyEykfyxP8o/6AQAA MapPropertySource 6eooFiJdkE+izOOxrEuNTgAA 4 ofVZ47URd0q//8gDOJ1aYQAA xg34VHJ+fEyzj7CBiwRDPAAA Q2G0OFPdX0WvGNLjqraOhQAA hN8Iz1t2uEGqMaJbfuBCygAA 1 nmHxsfPUH0uMgV7NLgoPQAAA 2 KWE3w89dYU2y8vUO6VPD/AAA CiJHZkIANkKwAlfb7JEpaQAA 3 getProperty 0G95rtMbMkGOVGNGUylrTwAA 1 String name DBNKkR5Nb0uvGJYM4te4jgAA containsProperty 0G95rtMbMkGOVGNGUylrTwAA 1 String name se1lf11PgU6HhLhvoSIfPwAA getPropertyNames 0G95rtMbMkGOVGNGUylrTwAA 6eooFiJdkE+izOOxrEuNTgAA 0G95rtMbMkGOVGNGUylrTwAA BKNWKXJ33U2ch95k1yoQKAAA 4 zX9P9cOnqEyWbhXgvyvywgAA KMO4VpnocUSCij/V83vvUgAA Wpo5wXGWQ0yPemxCm418XQAA eeiAA6jWEEKpczjpn+GYoQAA JndiPropertySource 6eooFiJdkE+izOOxrEuNTgAA 4 fz4ooYRQQUKQC0x7WctXHAAA m5vdCSJjaUqlp4lcuEchswAA xw0ej2Y+UUeaA65irBJiaAAA yGbYuvxSfEeQO/yX68WY7wAA 1 9dc0xBoytkGjG5XqAMYu1wAA 1 getProperty nv96eSShbEO1tnb3nAtytQAA 1 String name uDsjpVaEXUOwyRveC5aNogAA 6eooFiJdkE+izOOxrEuNTgAA nv96eSShbEO1tnb3nAtytQAA uKLIVLILH0iIM0N6VBXa5gAA 4 cc/GZPyTG0OHyTjwDkboLwAA pzWCZrIsCU66Vimkd/OaTgAA Ea4og1CVhECO4dioOiztHQAA jL4/z3mZvkWwHhd4rb7n/QAA SystemEnvironmentPropertySource 6eooFiJdkE+izOOxrEuNTgAA 4 wSTCYN8ovESWUhnKxWxqwQAA HHLin3FNRESgFQRQqaOSnwAA XUkrJ1ubBEmq+Q7xl+wrOwAA T+hbm20xG029tPoTD2XY0wAA 1 CiJHZkIANkKwAlfb7JEpaQAA 2 containsProperty ivhMphxwukqsfoGz7lapfwAA 1 String name MUtz9/ZyX0OF4Fageu0cNgAA getProperty ivhMphxwukqsfoGz7lapfwAA 1 String name ySY/hAKU4UWzhn9GOFK3+gAA PropertiesPropertySource 6eooFiJdkE+izOOxrEuNTgAA 4 ZOn3N4yC30eZ0KrCvKIfaQAA CJmM98xiXkOO52chzlq5agAA LSPQWRGASUaQeQusGBtG7AAA CHXx9zm8nEe1+IOMw8euqgAA 1 KWE3w89dYU2y8vUO6VPD/AAA 1 5Okg+yP8K0qo5g6wa7yS1wAA ResourcePropertySource 6eooFiJdkE+izOOxrEuNTgAA 4 6RVdgqhCy0+iMo+R9/xplQAA R6Z8gj6VWky9KE1zT8PdqwAA RW8ikxodg06e4nxGbUrFfgAA f+sqyxx7wE2mMGESMyFR8AAA 1 5Okg+yP8K0qo5g6wa7yS1wAA 6eooFiJdkE+izOOxrEuNTgAA B6FADWablEW17McE5tzbgQAA 0G95rtMbMkGOVGNGUylrTwAA 4 HHHU0OqiC0iGi3c9EDsWWQAA a0vY1/xY1UmSbtG+YyRJpwAA XFRy7cL8tEuedrQg3OawuwAA YXcH+dGu2UOhdXjytbWHrwAA 6eooFiJdkE+izOOxrEuNTgAA ivhMphxwukqsfoGz7lapfwAA 0G95rtMbMkGOVGNGUylrTwAA 4 X/jpYZNZr06jF8Rk6jkuUAAA /d8DY2k0QUum5Afe9iaKHwAA McYyW5GC2EalLkOTnN8nIQAA 9QwQUr2610qd1BjhI5lhCQAA 6eooFiJdkE+izOOxrEuNTgAA XIx80iKLUEKrRmQb2g/QlwAA B6FADWablEW17McE5tzbgQAA 4 Z01S2AcyEkmL7OJqPqpDYAAA r+sN3/VA/0i3BKenrRmHKwAA 9smHI2dRUE6dvsQ601VpVAAA b+26uot92kWHSbDocOZJBgAA BeanFactory 6eooFiJdkE+izOOxrEuNTgAA 3 EZ14tAVAqkOmpUMdWhduaAAA qjURzw+nn0OxCn5XENLvGgAA KuHlGqDs/UWzG9UOIQFHMwAA 1 KhOVhPhrJUWQQw1C9RdH0QAA 2 WXTiKWeTjkGVlZYyqQcbZwAA MXGs6Ey5G0u9sk5NDAcyfQAA 13 getBean TMI6ZqTAxEmDRQJ9OIC40gAA 1 String name VXPbGAhnLEucX1Zn2ubgigAA getBean TMI6ZqTAxEmDRQJ9OIC40gAA 2 String name zy1oySpoqUyWee+4nMqlPwAA Class<T> requiredType zy1oySpoqUyWee+4nMqlPwAA getBean TMI6ZqTAxEmDRQJ9OIC40gAA 1 Class<T> requiredType IUmsECBvaEq6+cmDG8ANxwAA getBean TMI6ZqTAxEmDRQJ9OIC40gAA 2 String name JaXKCiieLEexJL09xBGCVgAA Object... args JaXKCiieLEexJL09xBGCVgAA getBean TMI6ZqTAxEmDRQJ9OIC40gAA 2 Class<T> requiredType ePhctIRKJkWsQEnoF9ms2AAA Object... args ePhctIRKJkWsQEnoF9ms2AAA containsBean TMI6ZqTAxEmDRQJ9OIC40gAA 1 String name OpWlleBBeUWSx4s6fGb87wAA isSingleton TMI6ZqTAxEmDRQJ9OIC40gAA 1 String name OY4xwJAVjEGiyKpDITrnfQAA isPrototype TMI6ZqTAxEmDRQJ9OIC40gAA 1 String name d+fxViy0ZkC+/YRAenouawAA isTypeMatch TMI6ZqTAxEmDRQJ9OIC40gAA 2 String name lHEHt+gGgEe8bqzqdCZzaQAA ResolvableType typeToMatch lHEHt+gGgEe8bqzqdCZzaQAA Operation1 TMI6ZqTAxEmDRQJ9OIC40gAA isTypeMatch TMI6ZqTAxEmDRQJ9OIC40gAA 2 String name EZJ6iAmnQ0i+hqp4LqwcbwAA Class<?> typeToMatch EZJ6iAmnQ0i+hqp4LqwcbwAA getType TMI6ZqTAxEmDRQJ9OIC40gAA 1 String name L+BvlquljU2M+T/56KOhZQAA getAliases TMI6ZqTAxEmDRQJ9OIC40gAA 1 String name LpXQ3pjX6kOb0vUuJg803QAA SimpleJndiBeanFactory 6eooFiJdkE+izOOxrEuNTgAA 4 0RvoZrCqf0izQuzJage5+gAA /pMtHzfP+UKRaFYQqSwebwAA 2C6aEsz3pUqC6pVrstWI/AAA q425PbgyHEuMgDBasbpfHAAA 1 KhOVhPhrJUWQQw1C9RdH0QAA 6eooFiJdkE+izOOxrEuNTgAA cvJFIWfhtEuAL85V8mFxBQAA TMI6ZqTAxEmDRQJ9OIC40gAA 4 2hkN8o69EUSTFgKoHY80BQAA +3UVFd7Rh0CVtFZP09BJuAAA COD/DGlHO020uUrCL77Q7AAA FuXZXNmwBky+iOFSQyjZ6QAA AutowireCapableBeanFactory 6eooFiJdkE+izOOxrEuNTgAA 3 K4pTXhN4dESxOiWTz/lMlwAA dQSb16TAwU6ITNdmf2RfngAA XHZ9cPhp70mVLn2JePOOYgAA 1 5K8f7npNbEi5GLs1ooh1rQAA 1 WXTiKWeTjkGVlZYyqQcbZwAA 1 VJrFgQs4D0CVpTKawrT1EAAA 13 createBean 9XtIewnLAE61E3BltmTSlgAA 1 Class<T> beanClass rrQdLYixY02/mHymAbkqUQAA autowireBean 9XtIewnLAE61E3BltmTSlgAA 1 Object existingBean 767DyQv5Q0apLdzVZuGH/wAA configureBean 9XtIewnLAE61E3BltmTSlgAA 2 Object existingBean pmTA9/R5TE2lUMD1ZZG7CwAA String beanName pmTA9/R5TE2lUMD1ZZG7CwAA resolveDependency 9XtIewnLAE61E3BltmTSlgAA 2 DependencyDescriptor descriptor PYgJ71S7XEu+mjrSOXRcYAAA String beanName PYgJ71S7XEu+mjrSOXRcYAAA createBean 9XtIewnLAE61E3BltmTSlgAA 3 Class<?> beanClass DGsVtI8nRkm2Mbp8U4bt2AAA int autowireMode DGsVtI8nRkm2Mbp8U4bt2AAA boolean dependencyCheck DGsVtI8nRkm2Mbp8U4bt2AAA autowire 9XtIewnLAE61E3BltmTSlgAA 3 Class<?> beanClass J7T5NEaerUG0QXcPFU82YgAA int autowireMode J7T5NEaerUG0QXcPFU82YgAA boolean dependencyCheck J7T5NEaerUG0QXcPFU82YgAA autowireBeanProperties 9XtIewnLAE61E3BltmTSlgAA 3 Object existingBean oCPJTHoErEiZNhwb/x0iyAAA int autowireMode oCPJTHoErEiZNhwb/x0iyAAA boolean dependencyCheck oCPJTHoErEiZNhwb/x0iyAAA applyBeanPropertyValues 9XtIewnLAE61E3BltmTSlgAA 2 Object existingBean srrZlk1uJ0SRV1LWVXfZoAAA String beanName srrZlk1uJ0SRV1LWVXfZoAAA initializeBean 9XtIewnLAE61E3BltmTSlgAA 2 Object existingBean p4ial9txBEq4nmaNmM2VbQAA String beanName p4ial9txBEq4nmaNmM2VbQAA applyBeanPostProcessorsBeforeInitialization 9XtIewnLAE61E3BltmTSlgAA 2 Object existingBean lzG822SQ/UGwy1Kjv9aypAAA String beanName lzG822SQ/UGwy1Kjv9aypAAA applyBeanPostProcessorsAfterInitialization 9XtIewnLAE61E3BltmTSlgAA 2 Object existingBean VMrqc+HWfEGYAe/2aUFVUwAA String beanName VMrqc+HWfEGYAe/2aUFVUwAA destroyBean 9XtIewnLAE61E3BltmTSlgAA 1 Object existingBean oiLJ7tikfUCC9JL/ymxnSQAA resolveDependency 9XtIewnLAE61E3BltmTSlgAA AbstractAutowireCapableBeanFactory True 6eooFiJdkE+izOOxrEuNTgAA 4 7qKgI6D7Lk69BQ56TftNuwAA A15RHYv+ukSwQ4nPk/yISgAA uE//+wWxZ0Ccj7WLsVAxQAAA jR7CHuCH1Ua+sbca5ru/4QAA 1 5K8f7npNbEi5GLs1ooh1rQAA 1 5qZyOZsGMUiA0F9yHJzlKgAA 6eooFiJdkE+izOOxrEuNTgAA 9XtIewnLAE61E3BltmTSlgAA TMI6ZqTAxEmDRQJ9OIC40gAA 4 RCQGJJ83wkqTt02G3F+xWQAA HAXjX5UOB0ODG51ds9dXPQAA NZa8pomXgEeydrbBEQttuAAA D2aDtHH5hUChCSeJ59KAKAAA 6eooFiJdkE+izOOxrEuNTgAA WnZ8E4DVD0iyQGJ/wQ5S3QAA 9XtIewnLAE61E3BltmTSlgAA 4 4o6eendRpEW+Zd2PU9ZG0gAA 7fLKkKsHC0eLw7DJLfnF7AAA tThSUrK5UEqQPEDaZS6g7wAA jADsvVUATEm8PeW+ul+NxAAA DefaultListableBeanFactory 6eooFiJdkE+izOOxrEuNTgAA 4 3Ngz+Q3j0EakjNbESr1uKgAA fbe03Ma0lkSlfix8tv93AQAA PvxxP2bdw0qKMDPxB+niyQAA qG4nSSgUz0mEJslzKu0CDgAA 1 Ir9UqKMKNkWVIjtVgs85aAAA 1 5qZyOZsGMUiA0F9yHJzlKgAA 1 EJYA4pKplEGsPyVQ9+Uf2wAA 6eooFiJdkE+izOOxrEuNTgAA h4p7U8hjS0ucw+pbYXCaZgAA WnZ8E4DVD0iyQGJ/wQ5S3QAA 4 LwWFDdZj+Eumd843t873eQAA CYYyo5EmkE+DLt6OjXjBaQAA uS/5KbzgtUeiKCWJEJ9FigAA Vw749dWXnU6E9vE89Ufy9gAA XmlBeanFactory 6eooFiJdkE+izOOxrEuNTgAA 4 1gxyJBgV+UGVPMJkTOtiGQAA r3BNseLuRkakjDSbcC/mYAAA jdvMbYNMSEiddQdOnjb7XwAA 8AvZ/BxOZkmChMeE7T9dhQAA 1 EJYA4pKplEGsPyVQ9+Uf2wAA 6eooFiJdkE+izOOxrEuNTgAA PKWx1teiK0eEs6D2X8T7bwAA h4p7U8hjS0ucw+pbYXCaZgAA 4 5WRk0v2oGkOgFczbc/SAdgAA 1I+KyoW4yUGKm0g1XSwrPwAA JVBvwGBtP0SJSffbH8YtsgAA NFkB5k23c0OlFvy//BwA0QAA ConfigurableListableBeanFactory 6eooFiJdkE+izOOxrEuNTgAA 3 3Tiq4tpgd02DQFk38GHSaQAA tH632kvNskWLA4/TL2e+sAAA NqWuotNwlka5N/gH5Xfs4AAA 1 Ir9UqKMKNkWVIjtVgs85aAAA 1 VJrFgQs4D0CVpTKawrT1EAAA 10 ignoreDependencyType +N18dPzKN0eVvNMeanQxQAAA 1 Class<?> type +PO4AvwGS0m1feExgEPB2gAA ignoreDependencyInterface +N18dPzKN0eVvNMeanQxQAAA 1 Class<?> ifc aKD1ycHbT02t0te9RDUGdwAA registerResolvableDependency +N18dPzKN0eVvNMeanQxQAAA isAutowireCandidate +N18dPzKN0eVvNMeanQxQAAA getBeanDefinition +N18dPzKN0eVvNMeanQxQAAA 1 String beanName xOcCwD1+JE+Orvb+/bHBcgAA getBeanNamesIterator +N18dPzKN0eVvNMeanQxQAAA clearMetadataCache +N18dPzKN0eVvNMeanQxQAAA freezeConfiguration +N18dPzKN0eVvNMeanQxQAAA isConfigurationFrozen +N18dPzKN0eVvNMeanQxQAAA preInstantiateSingletons +N18dPzKN0eVvNMeanQxQAAA 6eooFiJdkE+izOOxrEuNTgAA +N18dPzKN0eVvNMeanQxQAAA 9XtIewnLAE61E3BltmTSlgAA 4 ULcvQe++gEWO0hemLJhlFgAA cyrO4tycn0u22uw2k9iM4wAA d9jbGvhKukuRCV66AEscNQAA 7HfB6KFtnUmVXeCbo2qz6QAA 6eooFiJdkE+izOOxrEuNTgAA h4p7U8hjS0ucw+pbYXCaZgAA +N18dPzKN0eVvNMeanQxQAAA 4 0z4YPcG7xU2QbOyekTxqpQAA 10+OFAQk2kCOgWBkMatfmQAA lDLVawy0lUizvB0bxNQxPAAA kYeD7TnOS0uXlkw0NQ1PMAAA HierarchicalBeanFactory 6eooFiJdkE+izOOxrEuNTgAA 3 UQDEiLumIUGRE6wXBTGZ4AAA 2BSLCttvHk63TqSVN0uIKgAA 5Q/SKEA5PE+Kku3hY6WUqQAA 1 MXGs6Ey5G0u9sk5NDAcyfQAA 1 f+HC5XI6l0S6OwVskaX4PgAA 2 getParentBeanFactory() KH8sdvK48EiyJs9ksz0sgAAA containsLocalBean KH8sdvK48EiyJs9ksz0sgAAA 1 String name 8Tg9q7yhUE+4Sk1EfD6oSwAA 6eooFiJdkE+izOOxrEuNTgAA KH8sdvK48EiyJs9ksz0sgAAA TMI6ZqTAxEmDRQJ9OIC40gAA 4 HlNJ1fvrmkqScp5eO0KppwAA nKv2/DUKekOL4Gqi4J8e4QAA t0/iMGtXjEC5XUKAVRsFWwAA CFVO+WexmEe+4I+NdLENogAA 6eooFiJdkE+izOOxrEuNTgAA oEcpdaUjcE+VohLe8ZGszwAA x+tOUV3JJ0eR8grB2+LwEQAA 4 7f/GZ/2SoUaYo7IEcV1UEgAA TVuAgls1hUy9MssBxkGwygAA MJMWR5IS9Eewt0PGBnh/owAA DWtFiZGjokOkKsgS30uDiAAA beans OB1ywkeJUU2zhj8yqaXuowAA 8 BeanFactory Rn8ewg26pESd+x4A4hmKIwAA 0jk+U14FS0aUY3sp+htArQAA 25 clMaroon $00B9FFFF 413 24 292 215 sdkNone TMI6ZqTAxEmDRQJ9OIC40gAA 1 BeanFactory <<interface>> False False TMI6ZqTAxEmDRQJ9OIC40gAA TMI6ZqTAxEmDRQJ9OIC40gAA clMaroon $00B9FFFF 94 354 142 43 cvJFIWfhtEuAL85V8mFxBQAA 1 SimpleJndiBeanFactory False False cvJFIWfhtEuAL85V8mFxBQAA cvJFIWfhtEuAL85V8mFxBQAA False cvJFIWfhtEuAL85V8mFxBQAA clMaroon $00B9FFFF 198,354;413,221 KhOVhPhrJUWQQw1C9RdH0QAA EZ14tAVAqkOmpUMdWhduaAAA 0RvoZrCqf0izQuzJage5+gAA False 1.5707963267949 15 KhOVhPhrJUWQQw1C9RdH0QAA False 1.5707963267949 30 KhOVhPhrJUWQQw1C9RdH0QAA False -1.5707963267949 15 KhOVhPhrJUWQQw1C9RdH0QAA clMaroon $00B9FFFF True 328 354 463 215 sdkNone 9XtIewnLAE61E3BltmTSlgAA 1 AutowireCapableBeanFactory <<interface>> False False 9XtIewnLAE61E3BltmTSlgAA 9XtIewnLAE61E3BltmTSlgAA clMaroon $00B9FFFF 180 640 226 43 WnZ8E4DVD0iyQGJ/wQ5S3QAA 3 AbstractAutowireCapableBeanFactory False False WnZ8E4DVD0iyQGJ/wQ5S3QAA WnZ8E4DVD0iyQGJ/wQ5S3QAA False WnZ8E4DVD0iyQGJ/wQ5S3QAA clMaroon $00B9FFFF 559,354;558,238 WXTiKWeTjkGVlZYyqQcbZwAA EZ14tAVAqkOmpUMdWhduaAAA K4pTXhN4dESxOiWTz/lMlwAA False 1.5707963267949 15 WXTiKWeTjkGVlZYyqQcbZwAA False 1.5707963267949 30 WXTiKWeTjkGVlZYyqQcbZwAA False -1.5707963267949 15 WXTiKWeTjkGVlZYyqQcbZwAA clMaroon $00B9FFFF 320,640;416,568 5K8f7npNbEi5GLs1ooh1rQAA K4pTXhN4dESxOiWTz/lMlwAA 7qKgI6D7Lk69BQ56TftNuwAA False 1.5707963267949 15 5K8f7npNbEi5GLs1ooh1rQAA False 1.5707963267949 30 5K8f7npNbEi5GLs1ooh1rQAA False -1.5707963267949 15 5K8f7npNbEi5GLs1ooh1rQAA clMaroon $00B9FFFF 453 878 166 43 h4p7U8hjS0ucw+pbYXCaZgAA 1 DefaultListableBeanFactory False False h4p7U8hjS0ucw+pbYXCaZgAA h4p7U8hjS0ucw+pbYXCaZgAA False h4p7U8hjS0ucw+pbYXCaZgAA clMaroon $00B9FFFF 514,878;313,682 5qZyOZsGMUiA0F9yHJzlKgAA 7qKgI6D7Lk69BQ56TftNuwAA 3Ngz+Q3j0EakjNbESr1uKgAA False 1.5707963267949 15 5qZyOZsGMUiA0F9yHJzlKgAA False 1.5707963267949 30 5qZyOZsGMUiA0F9yHJzlKgAA False -1.5707963267949 15 5qZyOZsGMUiA0F9yHJzlKgAA clMaroon $00B9FFFF 485 970 102 43 PKWx1teiK0eEs6D2X8T7bwAA 1 XmlBeanFactory False False PKWx1teiK0eEs6D2X8T7bwAA PKWx1teiK0eEs6D2X8T7bwAA False PKWx1teiK0eEs6D2X8T7bwAA clMaroon $00B9FFFF 535,970;535,920 EJYA4pKplEGsPyVQ9+Uf2wAA 3Ngz+Q3j0EakjNbESr1uKgAA 1gxyJBgV+UGVPMJkTOtiGQAA False 1.5707963267949 15 EJYA4pKplEGsPyVQ9+Uf2wAA False 1.5707963267949 30 EJYA4pKplEGsPyVQ9+Uf2wAA False -1.5707963267949 15 EJYA4pKplEGsPyVQ9+Uf2wAA clMaroon $00B9FFFF 524 640 253 176 sdkNone +N18dPzKN0eVvNMeanQxQAAA 1 ConfigurableListableBeanFactory <<interface>> False False +N18dPzKN0eVvNMeanQxQAAA +N18dPzKN0eVvNMeanQxQAAA clMaroon $00B9FFFF 620,640;595,568 VJrFgQs4D0CVpTKawrT1EAAA K4pTXhN4dESxOiWTz/lMlwAA 3Tiq4tpgd02DQFk38GHSaQAA False 1.5707963267949 15 VJrFgQs4D0CVpTKawrT1EAAA False 1.5707963267949 30 VJrFgQs4D0CVpTKawrT1EAAA False -1.5707963267949 15 VJrFgQs4D0CVpTKawrT1EAAA clMaroon $00B9FFFF 549,878;591,815 Ir9UqKMKNkWVIjtVgs85aAAA 3Tiq4tpgd02DQFk38GHSaQAA 3Ngz+Q3j0EakjNbESr1uKgAA False 1.5707963267949 15 Ir9UqKMKNkWVIjtVgs85aAAA False 1.5707963267949 30 Ir9UqKMKNkWVIjtVgs85aAAA False -1.5707963267949 15 Ir9UqKMKNkWVIjtVgs85aAAA clMaroon $00B9FFFF 883 354 171 72 sdkNone KH8sdvK48EiyJs9ksz0sgAAA 1 HierarchicalBeanFactory <<interface>> False False KH8sdvK48EiyJs9ksz0sgAAA KH8sdvK48EiyJs9ksz0sgAAA clMaroon $00B9FFFF 912,354;704,223 MXGs6Ey5G0u9sk5NDAcyfQAA EZ14tAVAqkOmpUMdWhduaAAA UQDEiLumIUGRE6wXBTGZ4AAA False 1.5707963267949 15 MXGs6Ey5G0u9sk5NDAcyfQAA False 1.5707963267949 30 MXGs6Ey5G0u9sk5NDAcyfQAA False -1.5707963267949 15 MXGs6Ey5G0u9sk5NDAcyfQAA clMaroon $00B9FFFF 877 468 185 124 sdkNone 7moLeQGkI06Y4G8asNOvcgAA 1 ApplicationContext <<interface>> False False 7moLeQGkI06Y4G8asNOvcgAA 7moLeQGkI06Y4G8asNOvcgAA clMaroon $00B9FFFF 969,468;968,425 f+HC5XI6l0S6OwVskaX4PgAA UQDEiLumIUGRE6wXBTGZ4AAA gPfFelCSikS5mxAR0kLDKwAA False 1.5707963267949 15 f+HC5XI6l0S6OwVskaX4PgAA False 1.5707963267949 30 f+HC5XI6l0S6OwVskaX4PgAA False -1.5707963267949 15 f+HC5XI6l0S6OwVskaX4PgAA clMaroon $00B9FFFF 876 634 189 45 sdkNone CC2SoGhvr0imGAlSHhRvBQAA 1 ConfigurableApplicationContext <<interface>> False False CC2SoGhvr0imGAlSHhRvBQAA False CC2SoGhvr0imGAlSHhRvBQAA clMaroon $00B9FFFF 886 721 167 45 sdkNone q9xSiHYieka+Fhq/hHSDBgAA 1 AbstractApplicationContext <<interface>> False False q9xSiHYieka+Fhq/hHSDBgAA False q9xSiHYieka+Fhq/hHSDBgAA clMaroon $00B9FFFF 852 808 235 45 sdkNone CJ/FFWtFu0K7UactUe3YWAAA 1 AbstractRefreshableApplicationContext <<interface>> False False CJ/FFWtFu0K7UactUe3YWAAA False CJ/FFWtFu0K7UactUe3YWAAA clMaroon $00B9FFFF 18 840 884 259 39 忽略剩下的各种Context clMaroon $00B9FFFF 970,634;970,591 6mHjO0NHSUCxSlMF/vApAAAA gPfFelCSikS5mxAR0kLDKwAA j8yyn/xaGkC7yBknq95THAAA False 1.5707963267949 15 6mHjO0NHSUCxSlMF/vApAAAA False 1.5707963267949 30 6mHjO0NHSUCxSlMF/vApAAAA False -1.5707963267949 15 6mHjO0NHSUCxSlMF/vApAAAA clMaroon $00B9FFFF 969,721;970,678 iSAgb4jw/k+lh0SBNujpmAAA j8yyn/xaGkC7yBknq95THAAA DKEApTcZwE+ZEdCORL7ZjgAA False 1.5707963267949 15 iSAgb4jw/k+lh0SBNujpmAAA False 1.5707963267949 30 iSAgb4jw/k+lh0SBNujpmAAA False -1.5707963267949 15 iSAgb4jw/k+lh0SBNujpmAAA clMaroon $00B9FFFF 969,808;969,765 u2Xa1B0OQk2eU+/vCJQ9TgAA DKEApTcZwE+ZEdCORL7ZjgAA 68p5YGhbxUGhBmGuzrF6bwAA False 1.5707963267949 15 u2Xa1B0OQk2eU+/vCJQ9TgAA False 1.5707963267949 30 u2Xa1B0OQk2eU+/vCJQ9TgAA False -1.5707963267949 15 u2Xa1B0OQk2eU+/vCJQ9TgAA EntityResolver Rn8ewg26pESd+x4A4hmKIwAA 0xj9hPxu1kWzFA+rAEhx6AAA 5 clMaroon $00B9FFFF 459 72 250 59 sdkNone h4ag3XHa7UyhnvRLBXQ+pgAA 1 EntityResolver <<interface>> False False h4ag3XHa7UyhnvRLBXQ+pgAA h4ag3XHa7UyhnvRLBXQ+pgAA clMaroon $00B9FFFF 465 175 239 56 py1qgPeEX0CbzxFYCVwAxgAA 1 DelegatingEntityResolver False False py1qgPeEX0CbzxFYCVwAxgAA py1qgPeEX0CbzxFYCVwAxgAA False py1qgPeEX0CbzxFYCVwAxgAA clMaroon $00B9FFFF 584,175;583,130 R3VOinV/H0i9mPzy8dzb4QAA hhdnj5969EG0jPcq8GKplgAA U4NG7PI9m0K+BH2VNkRjywAA False 1.5707963267949 15 R3VOinV/H0i9mPzy8dzb4QAA False 1.5707963267949 30 R3VOinV/H0i9mPzy8dzb4QAA False -1.5707963267949 15 R3VOinV/H0i9mPzy8dzb4QAA clMaroon $00B9FFFF 465 275 239 56 6QuPrw7LZ0acCv3PfkqUxgAA 1 ResourceEntityResolver False False 6QuPrw7LZ0acCv3PfkqUxgAA 6QuPrw7LZ0acCv3PfkqUxgAA False 6QuPrw7LZ0acCv3PfkqUxgAA clMaroon $00B9FFFF 584,275;584,230 2ytTBLai8EaKdZV+IOu1wwAA U4NG7PI9m0K+BH2VNkRjywAA zjXtkOneGk+TK5ji9z4CHwAA False 1.5707963267949 15 2ytTBLai8EaKdZV+IOu1wwAA False 1.5707963267949 30 2ytTBLai8EaKdZV+IOu1wwAA False -1.5707963267949 15 2ytTBLai8EaKdZV+IOu1wwAA BeanDefinitionReader Rn8ewg26pESd+x4A4hmKIwAA RRWTuVKsFEaFmZ4pNt93jwAA 9 clMaroon $00B9FFFF 499 80 210 124 sdkNone JuiNzn8ZTUe9OSmBuPf06QAA 1 BeanDefinitionReader <<interface>> False False JuiNzn8ZTUe9OSmBuPf06QAA JuiNzn8ZTUe9OSmBuPf06QAA clMaroon $00B9FFFF 513 256 182 43 9erBlzE6NE2RM3q4CXCiLAAA 3 AbstractBeanDefinitionReader False False 9erBlzE6NE2RM3q4CXCiLAAA 9erBlzE6NE2RM3q4CXCiLAAA False 9erBlzE6NE2RM3q4CXCiLAAA clMaroon $00B9FFFF 328 351 154 43 mOBeQj2QqECI3feQBBvv2gAA 1 XmlBeanDefinitionReader False False mOBeQj2QqECI3feQBBvv2gAA mOBeQj2QqECI3feQBBvv2gAA False mOBeQj2QqECI3feQBBvv2gAA clMaroon $00B9FFFF 517 351 174 43 r+8zi8j7wUmcM8qmToqIVwAA 1 GroovyBeanDefinitionReader False False r+8zi8j7wUmcM8qmToqIVwAA r+8zi8j7wUmcM8qmToqIVwAA False r+8zi8j7wUmcM8qmToqIVwAA clMaroon $00B9FFFF 740 351 192 43 nOBG3/ORc0Gue/u8J2vM5AAA 1 PropertiesBeanDefinitionReader False False nOBG3/ORc0Gue/u8J2vM5AAA nOBG3/ORc0Gue/u8J2vM5AAA False nOBG3/ORc0Gue/u8J2vM5AAA clMaroon $00B9FFFF 603,256;603,203 sEPnHyBMbkm5dAO3cBjOXQAA +Jo/YUBrQ0eNgn22ERH9BAAA 9XextuZzmE2xocAFFbm75wAA False 1.5707963267949 15 sEPnHyBMbkm5dAO3cBjOXQAA False 1.5707963267949 30 sEPnHyBMbkm5dAO3cBjOXQAA False -1.5707963267949 15 sEPnHyBMbkm5dAO3cBjOXQAA clMaroon $00B9FFFF 448,351;559,298 hJmYAXdO3kOVjJkStyEacAAA 9XextuZzmE2xocAFFbm75wAA r7Ot3fkVw0WUnnYGiT6VyQAA False 1.5707963267949 15 hJmYAXdO3kOVjJkStyEacAAA False 1.5707963267949 30 hJmYAXdO3kOVjJkStyEacAAA False -1.5707963267949 15 hJmYAXdO3kOVjJkStyEacAAA clMaroon $00B9FFFF 603,351;603,298 E7XZbKyX80mxCzXLtDO9tgAA 9XextuZzmE2xocAFFbm75wAA xScXMlsbJk+UM70d2DhNAQAA False 1.5707963267949 15 E7XZbKyX80mxCzXLtDO9tgAA False 1.5707963267949 30 E7XZbKyX80mxCzXLtDO9tgAA False -1.5707963267949 15 E7XZbKyX80mxCzXLtDO9tgAA clMaroon $00B9FFFF 784,351;654,298 rIwOBpDOKESmpCRV5QwqqQAA 9XextuZzmE2xocAFFbm75wAA Rpe6xOdQhU6TVsy/VV+WZwAA False 1.5707963267949 15 rIwOBpDOKESmpCRV5QwqqQAA False 1.5707963267949 30 rIwOBpDOKESmpCRV5QwqqQAA False -1.5707963267949 15 rIwOBpDOKESmpCRV5QwqqQAA Resource Rn8ewg26pESd+x4A4hmKIwAA afFhFP3zNkGjUytGHgr4JAAA 33 clMaroon $00B9FFFF 590 64 122 59 sdkNone False EypG3LSOrUugXmr60wTTuAAA 1 InputStreamSource <<interface>> False False EypG3LSOrUugXmr60wTTuAAA EypG3LSOrUugXmr60wTTuAAA clMaroon $00B9FFFF 444 164 110 108 GbwKx9japU29TkJzElS5DAAA 1 EncodedResource False False GbwKx9japU29TkJzElS5DAAA GbwKx9japU29TkJzElS5DAAA False GbwKx9japU29TkJzElS5DAAA clMaroon $00B9FFFF 553,172;614,122 h/EF0+A+mkywAJKpndx0UAAA 5+emH+/9gU6Na9F5hoEBlgAA NVDaHAxKVEapthU/UUz4ewAA False 1.5707963267949 15 h/EF0+A+mkywAJKpndx0UAAA False 1.5707963267949 30 h/EF0+A+mkywAJKpndx0UAAA False -1.5707963267949 15 h/EF0+A+mkywAJKpndx0UAAA clMaroon $00B9FFFF 740 164 96 176 sdkNone Xp9wRWjEX0qvNBa8eMqm6wAA 1 Resource <<interface>> False False Xp9wRWjEX0qvNBa8eMqm6wAA Xp9wRWjEX0qvNBa8eMqm6wAA clMaroon $00B9FFFF 595 384 112 43 K1HPP6E6bk2VZXM2QbaRgAAA 3 AbstractResource False False K1HPP6E6bk2VZXM2QbaRgAAA K1HPP6E6bk2VZXM2QbaRgAAA False K1HPP6E6bk2VZXM2QbaRgAAA clMaroon $00B9FFFF 669,384;740,304 c5G4SenWmUm13j4Wa1Zl2wAA JNax10tQ+0apxvW3f2EKXQAA ZTBVVZF+Z0KZRrn/Fy5MggAA False 1.5707963267949 15 c5G4SenWmUm13j4Wa1Zl2wAA False 1.5707963267949 30 c5G4SenWmUm13j4Wa1Zl2wAA False -1.5707963267949 15 c5G4SenWmUm13j4Wa1Zl2wAA clMaroon $00B9FFFF 140 508 186 43 lKU9qHfzRUCUfIkmOxQPWAAA 3 AbstractFileResolvingResource False False lKU9qHfzRUCUfIkmOxQPWAAA lKU9qHfzRUCUfIkmOxQPWAAA False lKU9qHfzRUCUfIkmOxQPWAAA clMaroon $00B9FFFF 68 600 118 43 M1Pr3/z300G2kSZys9+V2gAA 1 ClassPathResource False False M1Pr3/z300G2kSZys9+V2gAA M1Pr3/z300G2kSZys9+V2gAA False M1Pr3/z300G2kSZys9+V2gAA clMaroon $00B9FFFF 236 600 101 43 2obaeOJyfkeJFGGVgabaMAAA 1 UrlResource False False 2obaeOJyfkeJFGGVgabaMAAA 2obaeOJyfkeJFGGVgabaMAAA False 2obaeOJyfkeJFGGVgabaMAAA clMaroon $00B9FFFF 150,600;208,550 4xch/4qtGUOGJoRZ9UE+LwAA uSNIMX3thEmW8H3Yxg8z2gAA 1SDEE2K130isbmzmakL6iQAA False 1.5707963267949 15 4xch/4qtGUOGJoRZ9UE+LwAA False 1.5707963267949 30 4xch/4qtGUOGJoRZ9UE+LwAA False -1.5707963267949 15 4xch/4qtGUOGJoRZ9UE+LwAA clMaroon $00B9FFFF 274,600;244,550 Fzbl1OfkIES/1POUM7qceAAA uSNIMX3thEmW8H3Yxg8z2gAA q7FTUOm8HE6EhEpSETjP9AAA False 1.5707963267949 15 Fzbl1OfkIES/1POUM7qceAAA False 1.5707963267949 30 Fzbl1OfkIES/1POUM7qceAAA False -1.5707963267949 15 Fzbl1OfkIES/1POUM7qceAAA clMaroon $00B9FFFF 303,508;595,421 N1F4QIOnWku7meDFV57jmwAA ZTBVVZF+Z0KZRrn/Fy5MggAA uSNIMX3thEmW8H3Yxg8z2gAA False 1.5707963267949 15 N1F4QIOnWku7meDFV57jmwAA False 1.5707963267949 30 N1F4QIOnWku7meDFV57jmwAA False -1.5707963267949 15 N1F4QIOnWku7meDFV57jmwAA clMaroon $00B9FFFF 357 508 145 43 PEG/9N+8jkqI6iLpzuAZFwAA 1 BeanDefinitionResource False False PEG/9N+8jkqI6iLpzuAZFwAA PEG/9N+8jkqI6iLpzuAZFwAA False PEG/9N+8jkqI6iLpzuAZFwAA clMaroon $00B9FFFF 533 508 121 43 DuZ5+vXoM02UPGUP6l8eBQAA 1 ByteArrayResource False False DuZ5+vXoM02UPGUP6l8eBQAA DuZ5+vXoM02UPGUP6l8eBQAA False DuZ5+vXoM02UPGUP6l8eBQAA clMaroon $00B9FFFF 685 508 127 43 LZ8rOWtT00O8zq6eblgr/gAA 1 DescriptiveResource False False LZ8rOWtT00O8zq6eblgr/gAA LZ8rOWtT00O8zq6eblgr/gAA False LZ8rOWtT00O8zq6eblgr/gAA clMaroon $00B9FFFF 1241 508 125 43 a08oCwoxHUSXkU/FORpi/wAA 1 FileSystemResource False False a08oCwoxHUSXkU/FORpi/wAA a08oCwoxHUSXkU/FORpi/wAA False a08oCwoxHUSXkU/FORpi/wAA clMaroon $00B9FFFF 954 508 136 43 6rLBS/Hw/0GfJYqjX2C3+gAA 1 InputStreamResource False False 6rLBS/Hw/0GfJYqjX2C3+gAA 6rLBS/Hw/0GfJYqjX2C3+gAA False 6rLBS/Hw/0GfJYqjX2C3+gAA clMaroon $00B9FFFF 1121 508 89 43 Fs1kDebEiEOzlZzSXUDUVwAA 1 PathResource False False Fs1kDebEiEOzlZzSXUDUVwAA Fs1kDebEiEOzlZzSXUDUVwAA False Fs1kDebEiEOzlZzSXUDUVwAA clMaroon $00B9FFFF 843 508 80 43 cduVJ8xKVUSKisD1nT+KggAA 1 VfsResource False False cduVJ8xKVUSKisD1nT+KggAA cduVJ8xKVUSKisD1nT+KggAA False cduVJ8xKVUSKisD1nT+KggAA clMaroon $00B9FFFF 466,508;612,426 DAhXQZITjUKUNJ9Sb9/JbQAA ZTBVVZF+Z0KZRrn/Fy5MggAA QNxBNmkeYEKeoUImtkaYvwAA False 1.5707963267949 15 DAhXQZITjUKUNJ9Sb9/JbQAA False 1.5707963267949 30 DAhXQZITjUKUNJ9Sb9/JbQAA False -1.5707963267949 15 DAhXQZITjUKUNJ9Sb9/JbQAA clMaroon $00B9FFFF 603,508;640,426 0Mw4c+/azUeRcMnKZ0RWIQAA ZTBVVZF+Z0KZRrn/Fy5MggAA /GB9RUBz7EudFSNpj1XJogAA False 1.5707963267949 15 0Mw4c+/azUeRcMnKZ0RWIQAA False 1.5707963267949 30 0Mw4c+/azUeRcMnKZ0RWIQAA False -1.5707963267949 15 0Mw4c+/azUeRcMnKZ0RWIQAA clMaroon $00B9FFFF 731,508;667,426 q3m90zeVfEWLi8C0/f895QAA ZTBVVZF+Z0KZRrn/Fy5MggAA NtaNTbP680mDnZIM7ethDAAA False 1.5707963267949 15 q3m90zeVfEWLi8C0/f895QAA False 1.5707963267949 30 q3m90zeVfEWLi8C0/f895QAA False -1.5707963267949 15 q3m90zeVfEWLi8C0/f895QAA clMaroon $00B9FFFF 1241,517;706,416 RQFje06pUU2jqRqL5vlvAQAA ZTBVVZF+Z0KZRrn/Fy5MggAA wGJ1ZQ5vQ0+z/SzShOHc8wAA False 1.5707963267949 15 RQFje06pUU2jqRqL5vlvAQAA False 1.5707963267949 30 RQFje06pUU2jqRqL5vlvAQAA False -1.5707963267949 15 RQFje06pUU2jqRqL5vlvAQAA clMaroon $00B9FFFF 958,508;706,424 96lCxZrN7kmrocEKcoHuJQAA ZTBVVZF+Z0KZRrn/Fy5MggAA X3hvoGkJ5UOFS8hRRg8C6AAA False 1.5707963267949 15 96lCxZrN7kmrocEKcoHuJQAA False 1.5707963267949 30 96lCxZrN7kmrocEKcoHuJQAA False -1.5707963267949 15 96lCxZrN7kmrocEKcoHuJQAA clMaroon $00B9FFFF 1121,518;706,418 h3im9Hb8PkiT6+NstJ49yQAA ZTBVVZF+Z0KZRrn/Fy5MggAA 1FGiAtNEd0qE7n1oANqWKQAA False 1.5707963267949 15 h3im9Hb8PkiT6+NstJ49yQAA False 1.5707963267949 30 h3im9Hb8PkiT6+NstJ49yQAA False -1.5707963267949 15 h3im9Hb8PkiT6+NstJ49yQAA clMaroon $00B9FFFF 843,508;689,426 DLVPK3KHoUyDILbyj/9nnQAA ZTBVVZF+Z0KZRrn/Fy5MggAA JfvFHjutLkm3k6NbQANEUAAA False 1.5707963267949 15 DLVPK3KHoUyDILbyj/9nnQAA False 1.5707963267949 30 DLVPK3KHoUyDILbyj/9nnQAA False -1.5707963267949 15 DLVPK3KHoUyDILbyj/9nnQAA clMaroon $00B9FFFF 360 384 133 59 sdkNone Hddd4ubAwEqOAAYnyQXl0wAA 1 ContextResource <<interface>> False False Hddd4ubAwEqOAAYnyQXl0wAA Hddd4ubAwEqOAAYnyQXl0wAA clMaroon $00B9FFFF 920 384 111 72 sdkNone B6mM/9JaR02ScNj0JuIx1QAA 1 WritableResource <<interface>> False False B6mM/9JaR02ScNj0JuIx1QAA B6mM/9JaR02ScNj0JuIx1QAA clMaroon $00B9FFFF 740,197;675,122 qVDPlRQRd0yUgj2RwolfggAA 5+emH+/9gU6Na9F5hoEBlgAA JNax10tQ+0apxvW3f2EKXQAA False 1.5707963267949 15 qVDPlRQRd0yUgj2RwolfggAA False 1.5707963267949 30 qVDPlRQRd0yUgj2RwolfggAA False -1.5707963267949 15 qVDPlRQRd0yUgj2RwolfggAA clMaroon $00B9FFFF 491,384;740,272 nzlhDUTVBk+eCm0oNnChiAAA JNax10tQ+0apxvW3f2EKXQAA 5b0C4Vng8kmtZBo6p2ehTQAA False 1.5707963267949 15 nzlhDUTVBk+eCm0oNnChiAAA False 1.5707963267949 30 nzlhDUTVBk+eCm0oNnChiAAA False -1.5707963267949 15 nzlhDUTVBk+eCm0oNnChiAAA clMaroon $00B9FFFF 936,384;835,294 jczuChRIXEK+OKd1a0wKAQAA JNax10tQ+0apxvW3f2EKXQAA yi8jMIPF4kmUC2al3ZryOgAA False 1.5707963267949 15 jczuChRIXEK+OKd1a0wKAQAA False 1.5707963267949 30 jczuChRIXEK+OKd1a0wKAQAA False -1.5707963267949 15 jczuChRIXEK+OKd1a0wKAQAA clMaroon $00B9FFFF 1129,508;1030,451 cLQHI2PS30Or8AXCv0PMfQAA yi8jMIPF4kmUC2al3ZryOgAA 1FGiAtNEd0qE7n1oANqWKQAA False 1.5707963267949 15 cLQHI2PS30Or8AXCv0PMfQAA False 1.5707963267949 30 cLQHI2PS30Or8AXCv0PMfQAA False -1.5707963267949 15 cLQHI2PS30Or8AXCv0PMfQAA clMaroon $00B9FFFF 1241,508;1030,437 EOMowpigAE2c+NC/rbXKfQAA yi8jMIPF4kmUC2al3ZryOgAA wGJ1ZQ5vQ0+z/SzShOHc8wAA False 1.5707963267949 15 EOMowpigAE2c+NC/rbXKfQAA False 1.5707963267949 30 EOMowpigAE2c+NC/rbXKfQAA False -1.5707963267949 15 EOMowpigAE2c+NC/rbXKfQAA NamespaceHandler Rn8ewg26pESd+x4A4hmKIwAA oTnvbKSDxEOG+5CTapxL6AAA 21 clMaroon $00B9FFFF 445 64 433 85 sdkNone 2N1R1KhaHEu7lKvAfVDEjgAA 1 NamespaceHandler <<interface>> False False 2N1R1KhaHEu7lKvAfVDEjgAA 2N1R1KhaHEu7lKvAfVDEjgAA clMaroon $00B9FFFF 432 236 459 147 ZhPHuQeVkEqTlr4R1vt62QAA 3 NamespaceHandlerSupport False False ZhPHuQeVkEqTlr4R1vt62QAA ZhPHuQeVkEqTlr4R1vt62QAA False ZhPHuQeVkEqTlr4R1vt62QAA clMaroon $00B9FFFF 76 448 141 56 gqvxp2rBxkOqbJXDcrgj9QAA 1 AopNamespaceHandler False False gqvxp2rBxkOqbJXDcrgj9QAA gqvxp2rBxkOqbJXDcrgj9QAA False gqvxp2rBxkOqbJXDcrgj9QAA clMaroon $00B9FFFF 242 448 153 56 0/x5kMhdeEGM+DG/EBXm4gAA 1 CacheNamespaceHandler False False 0/x5kMhdeEGM+DG/EBXm4gAA 0/x5kMhdeEGM+DG/EBXm4gAA False 0/x5kMhdeEGM+DG/EBXm4gAA clMaroon $00B9FFFF 420 448 164 56 nQBEJomUvUuF9287/RMHpQAA 1 ContextNamespaceHandler False False nQBEJomUvUuF9287/RMHpQAA nQBEJomUvUuF9287/RMHpQAA False nQBEJomUvUuF9287/RMHpQAA clMaroon $00B9FFFF 609 448 139 56 aVrvHRnaLkuNEd8suGUokQAA 1 JeeNamespaceHandler False False aVrvHRnaLkuNEd8suGUokQAA aVrvHRnaLkuNEd8suGUokQAA False aVrvHRnaLkuNEd8suGUokQAA clMaroon $00B9FFFF 773 448 146 56 xy043JjFek21Zj9RNykKTgAA 1 LangNamespaceHandler False False xy043JjFek21Zj9RNykKTgAA xy043JjFek21Zj9RNykKTgAA False xy043JjFek21Zj9RNykKTgAA clMaroon $00B9FFFF 944 448 146 56 KcNcendufUWOAUbRXKoWYwAA 1 TaskNamespaceHandler False False KcNcendufUWOAUbRXKoWYwAA KcNcendufUWOAUbRXKoWYwAA False KcNcendufUWOAUbRXKoWYwAA clMaroon $00B9FFFF 1115 448 138 56 7+m0gVnSS0uHb/377qbiPgAA 1 UtilNamespaceHandler False False 7+m0gVnSS0uHb/377qbiPgAA 7+m0gVnSS0uHb/377qbiPgAA False 7+m0gVnSS0uHb/377qbiPgAA clMaroon $00B9FFFF 160 236 224 43 R7u2oeTWdESogqMIXwZSggAA 1 SimpleConstructorNamespaceHandler False False R7u2oeTWdESogqMIXwZSggAA R7u2oeTWdESogqMIXwZSggAA False R7u2oeTWdESogqMIXwZSggAA clMaroon $00B9FFFF 948 236 207 43 s2l/7OiPEEelx8B8VPgKdgAA 1 SimplePropertyNamespaceHandler False False s2l/7OiPEEelx8B8VPgKdgAA s2l/7OiPEEelx8B8VPgKdgAA False s2l/7OiPEEelx8B8VPgKdgAA clMaroon $00B9FFFF 325,236;552,148 VloOB8LaVkmx/BsvGjtKfwAA RwIRpJVb2UeAfjWIQP4cXwAA plBLYL5vGkSRqUPIr5LsYAAA False 1.5707963267949 15 VloOB8LaVkmx/BsvGjtKfwAA False 1.5707963267949 30 VloOB8LaVkmx/BsvGjtKfwAA False -1.5707963267949 15 VloOB8LaVkmx/BsvGjtKfwAA clMaroon $00B9FFFF 661,236;661,148 y9o3eNjOvEKGCImhl/XBPwAA RwIRpJVb2UeAfjWIQP4cXwAA I3uN6TonhEqibxdqHgoZtgAA False 1.5707963267949 15 y9o3eNjOvEKGCImhl/XBPwAA False 1.5707963267949 30 y9o3eNjOvEKGCImhl/XBPwAA False -1.5707963267949 15 y9o3eNjOvEKGCImhl/XBPwAA clMaroon $00B9FFFF 997,236;770,148 yKlIhrQyWUij3RfX5h2P9AAA RwIRpJVb2UeAfjWIQP4cXwAA ynwCFJIhpkmFwP1HZuWz/QAA False 1.5707963267949 15 yKlIhrQyWUij3RfX5h2P9AAA False 1.5707963267949 30 yKlIhrQyWUij3RfX5h2P9AAA False -1.5707963267949 15 yKlIhrQyWUij3RfX5h2P9AAA clMaroon $00B9FFFF 216,452;434,382 q5F31IhpOEOxlGO1V8PotAAA I3uN6TonhEqibxdqHgoZtgAA pNn2yJV+7Eu20N1K998gHgAA False 1.5707963267949 15 q5F31IhpOEOxlGO1V8PotAAA False 1.5707963267949 30 q5F31IhpOEOxlGO1V8PotAAA False -1.5707963267949 15 q5F31IhpOEOxlGO1V8PotAAA clMaroon $00B9FFFF 374,448;510,382 mt03a5sObE2F12gfJx3yrAAA I3uN6TonhEqibxdqHgoZtgAA TnP1cXNef0GSRX8eKbesXAAA False 1.5707963267949 15 mt03a5sObE2F12gfJx3yrAAA False 1.5707963267949 30 mt03a5sObE2F12gfJx3yrAAA False -1.5707963267949 15 mt03a5sObE2F12gfJx3yrAAA clMaroon $00B9FFFF 527,448;591,382 BUesOaxx5UOIR4R67XS5jQAA I3uN6TonhEqibxdqHgoZtgAA V7ze5lstO0mUOxm+n+Z46wAA False 1.5707963267949 15 BUesOaxx5UOIR4R67XS5jQAA False 1.5707963267949 30 BUesOaxx5UOIR4R67XS5jQAA False -1.5707963267949 15 BUesOaxx5UOIR4R67XS5jQAA clMaroon $00B9FFFF 675,448;668,382 43l036EXmkW9rPMG7USXcAAA I3uN6TonhEqibxdqHgoZtgAA U8mjH8zmqkyKf4Ys9OsBPQAA False 1.5707963267949 15 43l036EXmkW9rPMG7USXcAAA False 1.5707963267949 30 43l036EXmkW9rPMG7USXcAAA False -1.5707963267949 15 43l036EXmkW9rPMG7USXcAAA clMaroon $00B9FFFF 815,448;742,382 U/vZOTE9MUOeyqWHs1RGCAAA I3uN6TonhEqibxdqHgoZtgAA AcGYe2zkR0WOfERKR+nXuQAA False 1.5707963267949 15 U/vZOTE9MUOeyqWHs1RGCAAA False 1.5707963267949 30 U/vZOTE9MUOeyqWHs1RGCAAA False -1.5707963267949 15 U/vZOTE9MUOeyqWHs1RGCAAA clMaroon $00B9FFFF 958,448;817,382 O7wkF+CsMUWxfVc4HutJRQAA I3uN6TonhEqibxdqHgoZtgAA XN2onDqzP0upxO4qoZKA7QAA False 1.5707963267949 15 O7wkF+CsMUWxfVc4HutJRQAA False 1.5707963267949 30 O7wkF+CsMUWxfVc4HutJRQAA False -1.5707963267949 15 O7wkF+CsMUWxfVc4HutJRQAA clMaroon $00B9FFFF 1115,453;890,382 GRHQJQrHAEqlAIBE2mFmkQAA I3uN6TonhEqibxdqHgoZtgAA FJpAJrMKS0O0Hbi+6v6EpAAA False 1.5707963267949 15 GRHQJQrHAEqlAIBE2mFmkQAA False 1.5707963267949 30 GRHQJQrHAEqlAIBE2mFmkQAA False -1.5707963267949 15 GRHQJQrHAEqlAIBE2mFmkQAA ExpressionParser Rn8ewg26pESd+x4A4hmKIwAA SFg4UvYxvkaTbSDa1/3h9wAA 7 clMaroon $00B9FFFF 490 84 333 72 sdkNone cUGJw724BEurOG/ONaGiIwAA 1 ExpressionParser <<interface>> False False cUGJw724BEurOG/ONaGiIwAA cUGJw724BEurOG/ONaGiIwAA clMaroon $00B9FFFF 490 212 333 69 x0sSzgf0t0OFEX+sWL12KQAA 3 TemplateAwareExpressionParser False False x0sSzgf0t0OFEX+sWL12KQAA x0sSzgf0t0OFEX+sWL12KQAA False x0sSzgf0t0OFEX+sWL12KQAA clMaroon $00B9FFFF 360 336 345 69 T6jBcpPph0iMLGmfE/yA7gAA 1 SpelExpressionParser False False T6jBcpPph0iMLGmfE/yA7gAA T6jBcpPph0iMLGmfE/yA7gAA False T6jBcpPph0iMLGmfE/yA7gAA clMaroon $00B9FFFF 780 336 178 43 phadBJpLAEKuYK32aybSTgAA 1 InternalSpelExpressionParser False False phadBJpLAEKuYK32aybSTgAA phadBJpLAEKuYK32aybSTgAA False phadBJpLAEKuYK32aybSTgAA clMaroon $00B9FFFF 656,212;656,155 NulDjwzaV0eJdoIpe8qBCgAA iZ+nPsD4eU+SBn/lfoPbegAA n/uAtdTeRk6a6wmlV29pcQAA False 1.5707963267949 15 NulDjwzaV0eJdoIpe8qBCgAA False 1.5707963267949 30 NulDjwzaV0eJdoIpe8qBCgAA False -1.5707963267949 15 NulDjwzaV0eJdoIpe8qBCgAA clMaroon $00B9FFFF 566,336;622,280 dJ9Z1nJdXkSoB7aAw0UIlAAA n/uAtdTeRk6a6wmlV29pcQAA ipJ3drxCJESvUHjQgSg6AAAA False 1.5707963267949 15 dJ9Z1nJdXkSoB7aAw0UIlAAA False 1.5707963267949 30 dJ9Z1nJdXkSoB7aAw0UIlAAA False -1.5707963267949 15 dJ9Z1nJdXkSoB7aAw0UIlAAA clMaroon $00B9FFFF 828,336;721,280 KHYoQiuVk0KWxyVwJXoM/wAA n/uAtdTeRk6a6wmlV29pcQAA mejGSCSDZEGuWo3jlvqE9AAA False 1.5707963267949 15 KHYoQiuVk0KWxyVwJXoM/wAA False 1.5707963267949 30 KHYoQiuVk0KWxyVwJXoM/wAA False -1.5707963267949 15 KHYoQiuVk0KWxyVwJXoM/wAA InstantiationStrategy Rn8ewg26pESd+x4A4hmKIwAA Ht3JUEwAtEyFavFrSI3RrgAA 5 clMaroon $00B9FFFF 462 56 667 85 sdkNone CsUNfEOqVkq9hhyDIV3YVQAA 1 InstantiationStrategy <<interface>> False False CsUNfEOqVkq9hhyDIV3YVQAA CsUNfEOqVkq9hhyDIV3YVQAA clMaroon $00B9FFFF 467 196 656 69 Dd1mq+WWtEGDUds1Q6TNPwAA 1 SimpleInstantiationStrategy False False Dd1mq+WWtEGDUds1Q6TNPwAA Dd1mq+WWtEGDUds1Q6TNPwAA False Dd1mq+WWtEGDUds1Q6TNPwAA clMaroon $00B9FFFF 682 320 227 43 gMAkn6VsaUKHgLrf0DnIFgAA 1 CglibSubclassingInstantiationStrategy False False gMAkn6VsaUKHgLrf0DnIFgAA gMAkn6VsaUKHgLrf0DnIFgAA False gMAkn6VsaUKHgLrf0DnIFgAA clMaroon $00B9FFFF 794,196;795,140 DfoGJYFOr0+TARVvLbI6NAAA Y3SAsiyqNkKqvAkNZaFLPwAA XbNd0iMriUCrULVGoNBxxwAA False 1.5707963267949 15 DfoGJYFOr0+TARVvLbI6NAAA False 1.5707963267949 30 DfoGJYFOr0+TARVvLbI6NAAA False -1.5707963267949 15 DfoGJYFOr0+TARVvLbI6NAAA clMaroon $00B9FFFF 795,320;794,264 yXxF+UYu5U6R0ENOi8aZIAAA XbNd0iMriUCrULVGoNBxxwAA PsuFF0MAtEKCSSr2/CtIYQAA False 1.5707963267949 15 yXxF+UYu5U6R0ENOi8aZIAAA False 1.5707963267949 30 yXxF+UYu5U6R0ENOi8aZIAAA False -1.5707963267949 15 yXxF+UYu5U6R0ENOi8aZIAAA Scope Rn8ewg26pESd+x4A4hmKIwAA eQGE2ooGMEKHS24n7pYVXgAA 11 clMaroon $00B9FFFF 485 100 306 111 sdkNone mywCjp1aOUyaXghJ+SzhyQAA 1 Scope <<interface>> False False mywCjp1aOUyaXghJ+SzhyQAA mywCjp1aOUyaXghJ+SzhyQAA clMaroon $00B9FFFF 344 292 122 43 gofn8tMtKUyaQ81oxdBKzAAA 1 SimpleThreadScope False False gofn8tMtKUyaQ81oxdBKzAAA gofn8tMtKUyaQ81oxdBKzAAA False gofn8tMtKUyaQ81oxdBKzAAA clMaroon $00B9FFFF 435,292;556,210 AZHESo826kyeQGoHqxpSmgAA rvpaPGu5VEqTkdGY33vnRAAA 8Y9u5lSkyUSw5FBnAC6TcwAA False 1.5707963267949 15 AZHESo826kyeQGoHqxpSmgAA False 1.5707963267949 30 AZHESo826kyeQGoHqxpSmgAA False -1.5707963267949 15 AZHESo826kyeQGoHqxpSmgAA clMaroon $00B9FFFF 539 292 198 43 kdCkLUbyKUiwIe8OQpqhcwAA 3 AbstractRequestAttributesScope False False kdCkLUbyKUiwIe8OQpqhcwAA kdCkLUbyKUiwIe8OQpqhcwAA False kdCkLUbyKUiwIe8OQpqhcwAA clMaroon $00B9FFFF 504 376 101 43 FIrqIiv6YE+aQTDvM3unOQAA 1 RequestScope False False FIrqIiv6YE+aQTDvM3unOQAA FIrqIiv6YE+aQTDvM3unOQAA False FIrqIiv6YE+aQTDvM3unOQAA clMaroon $00B9FFFF 680 376 90 43 Hs7ki7vi60y1tTx8qcDtnQAA 1 SessionScope False False Hs7ki7vi60y1tTx8qcDtnQAA Hs7ki7vi60y1tTx8qcDtnQAA False Hs7ki7vi60y1tTx8qcDtnQAA clMaroon $00B9FFFF 792 292 130 43 NHxavM2W2kekISgSOdU98wAA 1 ServletContextScope False False NHxavM2W2kekISgSOdU98wAA NHxavM2W2kekISgSOdU98wAA False NHxavM2W2kekISgSOdU98wAA clMaroon $00B9FFFF 637,292;637,210 Qoe4h6kRrEuMVHPOcNsd0gAA rvpaPGu5VEqTkdGY33vnRAAA 1s3GRWfbuU6srNDKY6uk4gAA False 1.5707963267949 15 Qoe4h6kRrEuMVHPOcNsd0gAA False 1.5707963267949 30 Qoe4h6kRrEuMVHPOcNsd0gAA False -1.5707963267949 15 Qoe4h6kRrEuMVHPOcNsd0gAA clMaroon $00B9FFFF 575,376;616,334 N6r+cH/6NEGaPfsSLivnoAAA 1s3GRWfbuU6srNDKY6uk4gAA 9o/rMCPgqEaVIs3Gwt+QSwAA False 1.5707963267949 15 N6r+cH/6NEGaPfsSLivnoAAA False 1.5707963267949 30 N6r+cH/6NEGaPfsSLivnoAAA False -1.5707963267949 15 N6r+cH/6NEGaPfsSLivnoAAA clMaroon $00B9FFFF 702,376;659,334 YL2cvgX77kWmZ93Q2xVzkgAA 1s3GRWfbuU6srNDKY6uk4gAA bv2AGJdkNkGR37vJM5x2TQAA False 1.5707963267949 15 YL2cvgX77kWmZ93Q2xVzkgAA False 1.5707963267949 30 YL2cvgX77kWmZ93Q2xVzkgAA False -1.5707963267949 15 YL2cvgX77kWmZ93Q2xVzkgAA clMaroon $00B9FFFF 827,292;713,210 xdKy7r6TskC08oVwsT1GrwAA rvpaPGu5VEqTkdGY33vnRAAA 3ccZJoWyAESYV8nch/rzIQAA False 1.5707963267949 15 xdKy7r6TskC08oVwsT1GrwAA False 1.5707963267949 30 xdKy7r6TskC08oVwsT1GrwAA False -1.5707963267949 15 xdKy7r6TskC08oVwsT1GrwAA 107 ApplicationContext Rn8ewg26pESd+x4A4hmKIwAA 3 gPfFelCSikS5mxAR0kLDKwAA JNoeLNFcGUKmurL6YnhjBAAA V8+0Ey8aNU2C3OBgPoEfTgAA 1 f+HC5XI6l0S6OwVskaX4PgAA 1 6mHjO0NHSUCxSlMF/vApAAAA 6 getId() 7moLeQGkI06Y4G8asNOvcgAA getApplicationName 7moLeQGkI06Y4G8asNOvcgAA getDisplayName 7moLeQGkI06Y4G8asNOvcgAA getStartupDate 7moLeQGkI06Y4G8asNOvcgAA getParent 7moLeQGkI06Y4G8asNOvcgAA getAutowireCapableBeanFactory 7moLeQGkI06Y4G8asNOvcgAA Rn8ewg26pESd+x4A4hmKIwAA 7moLeQGkI06Y4G8asNOvcgAA KH8sdvK48EiyJs9ksz0sgAAA 4 jEj3fo3CZU29ThcDHw4blwAA gzyZuRgkYkmzMcu9rsEOWgAA hQSwLPEGXkGwB50/FSUpuQAA aRDQeNkVWEe+ltaLQnJxmwAA ConfigurableApplicationContext Rn8ewg26pESd+x4A4hmKIwAA 3 j8yyn/xaGkC7yBknq95THAAA RH2aWrHmDkOybQrDm0FkzQAA K69BQjoP806QUrs7/qQzawAA 1 6mHjO0NHSUCxSlMF/vApAAAA 1 iSAgb4jw/k+lh0SBNujpmAAA AbstractApplicationContext Rn8ewg26pESd+x4A4hmKIwAA 3 DKEApTcZwE+ZEdCORL7ZjgAA J30jtpK/CECU4JifscMTNgAA 5Ic6oF2TR0+2b558ULzYBwAA 1 iSAgb4jw/k+lh0SBNujpmAAA 1 u2Xa1B0OQk2eU+/vCJQ9TgAA AbstractRefreshableApplicationContext Rn8ewg26pESd+x4A4hmKIwAA 3 68p5YGhbxUGhBmGuzrF6bwAA EVevbgNTc0CYzQhZ4RnUiQAA tAdUv8ADjkKzs0t9Y7360AAA 1 u2Xa1B0OQk2eU+/vCJQ9TgAA Rn8ewg26pESd+x4A4hmKIwAA CC2SoGhvr0imGAlSHhRvBQAA 7moLeQGkI06Y4G8asNOvcgAA 4 HcyEDJO7y0eHj7aQUEf8pwAA qBnCVmp0RUu/rmdPyQd+aQAA gnt6ddusHUqBITGhT7ZK3gAA 4RnH2w9ojUazuxgDJUKdEgAA Rn8ewg26pESd+x4A4hmKIwAA q9xSiHYieka+Fhq/hHSDBgAA CC2SoGhvr0imGAlSHhRvBQAA 4 yrWADsSYoUW9SiZyITnY8QAA +pYEdylHFUuCB1mMJ1rKZAAA UvMZsPNpgUO40MXBnXIYuQAA YVacaUb1okiWzSR+uHW6QgAA Rn8ewg26pESd+x4A4hmKIwAA CJ/FFWtFu0K7UactUe3YWAAA q9xSiHYieka+Fhq/hHSDBgAA 4 it+qLu4ii0CDN+OKg7vZIAAA Hzte047CwESFL7BIcPIr7gAA hvdbuoJWkEuR/h7bau9FPwAA S+d5kuXkWUyhgyylTe8DdwAA EntityResolver Rn8ewg26pESd+x4A4hmKIwAA 3 hhdnj5969EG0jPcq8GKplgAA A1iPvK2680WzCxKQFj3O3gAA 4OTEoEjix0CEJI4jod2kDgAA 1 R3VOinV/H0i9mPzy8dzb4QAA 1 resolveEntity h4ag3XHa7UyhnvRLBXQ+pgAA 2 String publicId nhNE0T9nyUObdkslmLvdbgAA String systemId nhNE0T9nyUObdkslmLvdbgAA DelegatingEntityResolver Rn8ewg26pESd+x4A4hmKIwAA 4 U4NG7PI9m0K+BH2VNkRjywAA IOYo7rIF5EuJTdO0vTK1kgAA bQii23pbRUex4Q8QcTxPZgAA rOAM7NY8Zk6SmZVybZOKEAAA 1 R3VOinV/H0i9mPzy8dzb4QAA 1 2ytTBLai8EaKdZV+IOu1wwAA 1 resolveEntity py1qgPeEX0CbzxFYCVwAxgAA 2 String publicId EY5FLEcYDEWNK3/78ckO9gAA String systemId EY5FLEcYDEWNK3/78ckO9gAA Rn8ewg26pESd+x4A4hmKIwAA py1qgPeEX0CbzxFYCVwAxgAA h4ag3XHa7UyhnvRLBXQ+pgAA 4 x2MpudtdyEWzNiQWNjoMJgAA gD8vkKXOTkef1hwmKTKqOgAA zBI43OeCPUuYes5AeBU3/AAA Izb8TKYpJ0yhl8gtpkHFAgAA ResourceEntityResolver Rn8ewg26pESd+x4A4hmKIwAA 4 zjXtkOneGk+TK5ji9z4CHwAA 7XbiX2l9X0SpmjjMeqoPrgAA i/FMHNhhikOVK3nr8RHtewAA R31TocrR5EWmDrYUooTg2QAA 1 2ytTBLai8EaKdZV+IOu1wwAA 1 resolveEntity 6QuPrw7LZ0acCv3PfkqUxgAA 2 String publicId bSikHCrCvEqFhPhk04tTIQAA String systemId bSikHCrCvEqFhPhk04tTIQAA Rn8ewg26pESd+x4A4hmKIwAA 6QuPrw7LZ0acCv3PfkqUxgAA py1qgPeEX0CbzxFYCVwAxgAA 4 Y7uAwxwHs0eUIBxDnJqEFQAA bkzVkEF+E0mWFXc286wYPwAA fPS2rWdLkk2Rh4UE/21MBgAA sXDj8AwL2kOQ+kvmYohbrAAA BeanDefinitionReader Rn8ewg26pESd+x4A4hmKIwAA 3 +Jo/YUBrQ0eNgn22ERH9BAAA +dWEF77bzU6q+88KtxMmmgAA dRMnAe2KUEqhGrkzSqyi2AAA 1 sEPnHyBMbkm5dAO3cBjOXQAA 6 getRegistry JuiNzn8ZTUe9OSmBuPf06QAA getResourceLoader JuiNzn8ZTUe9OSmBuPf06QAA getBeanClassLoader JuiNzn8ZTUe9OSmBuPf06QAA getBeanNameGenerator JuiNzn8ZTUe9OSmBuPf06QAA loadBeanDefinitions JuiNzn8ZTUe9OSmBuPf06QAA 1 Resource resource lDqfdajGSEKUW9jUi8IOUgAA loadBeanDefinitions JuiNzn8ZTUe9OSmBuPf06QAA 1 String location CVDwEP8TBkefeS6Utwws+QAA AbstractBeanDefinitionReader True Rn8ewg26pESd+x4A4hmKIwAA 4 9XextuZzmE2xocAFFbm75wAA kDPYaWoqV0WgujKiv8nFkQAA lnjaUot/b0acHiTYcuvRnwAA O1GvIaMnZ0+ffRhuC6ptEQAA 1 sEPnHyBMbkm5dAO3cBjOXQAA 3 hJmYAXdO3kOVjJkStyEacAAA E7XZbKyX80mxCzXLtDO9tgAA rIwOBpDOKESmpCRV5QwqqQAA XmlBeanDefinitionReader Rn8ewg26pESd+x4A4hmKIwAA 4 r7Ot3fkVw0WUnnYGiT6VyQAA 9WfDc/9unEq8/QV3NjQJSQAA 7rWZvl8HmUWL/YF0QIGPcQAA cbpYtygDFUC/H+bpEvLJIAAA 1 hJmYAXdO3kOVjJkStyEacAAA GroovyBeanDefinitionReader Rn8ewg26pESd+x4A4hmKIwAA 4 xScXMlsbJk+UM70d2DhNAQAA R6GhxIEYU0Gzk0ILea2qWwAA V2ExkfjCQk2PlqxwpAcOpgAA vZrB8U2qXkq2bQgQFZTX8AAA 1 E7XZbKyX80mxCzXLtDO9tgAA PropertiesBeanDefinitionReader Rn8ewg26pESd+x4A4hmKIwAA 4 Rpe6xOdQhU6TVsy/VV+WZwAA eazN09i2lUGthMqL76i8NgAA SG+LQCkHp0mnjECqabJZhQAA TlIA2JBMokCXqb++HzLhiQAA 1 rIwOBpDOKESmpCRV5QwqqQAA Rn8ewg26pESd+x4A4hmKIwAA 9erBlzE6NE2RM3q4CXCiLAAA JuiNzn8ZTUe9OSmBuPf06QAA 4 60I7lHQKZU+NNPGvEzfobQAA Mx3HWuELykmu+Uyk+xW76AAA nqP5OrBK5keaRug2R1O8fQAA mnDeIhe8Fk2p1ml3lMBKjgAA Rn8ewg26pESd+x4A4hmKIwAA mOBeQj2QqECI3feQBBvv2gAA 9erBlzE6NE2RM3q4CXCiLAAA 4 5JU1edcw9UuzZu7YRnQOsAAA ceZZWmwwaki0frvL5xXZlQAA HUF9ZjApNkqp+GTM+xG1rwAA JDWT0ERVa06Yd+C18sdgRgAA Rn8ewg26pESd+x4A4hmKIwAA r+8zi8j7wUmcM8qmToqIVwAA 9erBlzE6NE2RM3q4CXCiLAAA 4 K9fwUcvj/kyNqaBEF3ww+wAA 4zL12QcBgEu5oc8U0u96WwAA 4iv5eMiv20eGwEXCQg6jggAA epbHnC8daUaJg3oTJISWRwAA Rn8ewg26pESd+x4A4hmKIwAA nOBG3/ORc0Gue/u8J2vM5AAA 9erBlzE6NE2RM3q4CXCiLAAA 4 2L0z9k51SUe1cJs77QLQJgAA yQU9g+vdS0qFOwZlHYHLJQAA rrlhsF5ERU+PTfwbNiuecAAA Uswdtqyy0EiAfFnRTWaUxwAA InputStreamSource Rn8ewg26pESd+x4A4hmKIwAA 3 5+emH+/9gU6Na9F5hoEBlgAA PDp1dPhq3EaGELf/UpHStgAA 0wIwf4RTDUm1CznkPZaSWwAA 1 h/EF0+A+mkywAJKpndx0UAAA 1 qVDPlRQRd0yUgj2RwolfggAA 1 getInputStream EypG3LSOrUugXmr60wTTuAAA EncodedResource Rn8ewg26pESd+x4A4hmKIwAA 4 NVDaHAxKVEapthU/UUz4ewAA gyAgrtzwZESl+W3pSpCCvAAA YH8U/2iRzUObj9b4geng4AAA jX86rTsq9EuX6bgPRvhhSQAA 1 h/EF0+A+mkywAJKpndx0UAAA 5 getResource GbwKx9japU29TkJzElS5DAAA getEncoding GbwKx9japU29TkJzElS5DAAA getCharset GbwKx9japU29TkJzElS5DAAA getReader GbwKx9japU29TkJzElS5DAAA getInputStream GbwKx9japU29TkJzElS5DAAA Rn8ewg26pESd+x4A4hmKIwAA GbwKx9japU29TkJzElS5DAAA EypG3LSOrUugXmr60wTTuAAA 4 b3dJT983vEKKp7myUNaaxgAA Jm6oR8BnU0GVIPMpzvsLQQAA qWpc58epkkG78lgBHLztiAAA 8ETJKYU+t0SUknerFWch+wAA Resource Rn8ewg26pESd+x4A4hmKIwAA 3 JNax10tQ+0apxvW3f2EKXQAA zjlvARbSp06/ZdpFDyc/PgAA XPSJirUIz0KZeN2EgBUaTAAA 1 c5G4SenWmUm13j4Wa1Zl2wAA 1 qVDPlRQRd0yUgj2RwolfggAA 2 nzlhDUTVBk+eCm0oNnChiAAA jczuChRIXEK+OKd1a0wKAQAA 10 exists Xp9wRWjEX0qvNBa8eMqm6wAA isReadable Xp9wRWjEX0qvNBa8eMqm6wAA isOpen Xp9wRWjEX0qvNBa8eMqm6wAA getURL Xp9wRWjEX0qvNBa8eMqm6wAA getURI Xp9wRWjEX0qvNBa8eMqm6wAA getFile Xp9wRWjEX0qvNBa8eMqm6wAA contentLength Xp9wRWjEX0qvNBa8eMqm6wAA getFilename Xp9wRWjEX0qvNBa8eMqm6wAA lastModified Xp9wRWjEX0qvNBa8eMqm6wAA getDescription Xp9wRWjEX0qvNBa8eMqm6wAA AbstractResource True Rn8ewg26pESd+x4A4hmKIwAA 4 ZTBVVZF+Z0KZRrn/Fy5MggAA G60a52kjhEao+MQPEwJzdAAA Jlq7ol9miEWJS//tfHNsvwAA k3KVym1DZ0CwwVqzv+qtxgAA 1 c5G4SenWmUm13j4Wa1Zl2wAA 8 N1F4QIOnWku7meDFV57jmwAA DAhXQZITjUKUNJ9Sb9/JbQAA 0Mw4c+/azUeRcMnKZ0RWIQAA q3m90zeVfEWLi8C0/f895QAA RQFje06pUU2jqRqL5vlvAQAA 96lCxZrN7kmrocEKcoHuJQAA h3im9Hb8PkiT6+NstJ49yQAA DLVPK3KHoUyDILbyj/9nnQAA Rn8ewg26pESd+x4A4hmKIwAA K1HPP6E6bk2VZXM2QbaRgAAA Xp9wRWjEX0qvNBa8eMqm6wAA 4 DkNhxYKdREmoysdowmxVEgAA pIFe+Z9MZUaVXGUK7WWGxgAA xYyFWh21okW2T718j03dtQAA 5lxBBpaPOU69SHVoTDhXtwAA AbstractFileResolvingResource True Rn8ewg26pESd+x4A4hmKIwAA 4 uSNIMX3thEmW8H3Yxg8z2gAA pAMJlq3T/k22lW2n9fapBQAA 2gNNyGsFsEOPDOkfr5hNqwAA PpjfFnq8aEyS7cseoC9wdAAA 1 N1F4QIOnWku7meDFV57jmwAA 2 4xch/4qtGUOGJoRZ9UE+LwAA Fzbl1OfkIES/1POUM7qceAAA ClassPathResource Rn8ewg26pESd+x4A4hmKIwAA 4 1SDEE2K130isbmzmakL6iQAA JoOPjlWNfkimModBpZ/enwAA nHAHLD9zN0C3KCO6GrQcqQAA ErBoFxv2H0ePa0RGBBF2rAAA 1 4xch/4qtGUOGJoRZ9UE+LwAA UrlResource Rn8ewg26pESd+x4A4hmKIwAA 4 q7FTUOm8HE6EhEpSETjP9AAA oBh0nhzcYUWZejgeXfSyBAAA MBH7cOYC60qVooXboRyNHAAA jP4EYm8zFEW6yHhO3HBd3AAA 1 Fzbl1OfkIES/1POUM7qceAAA Rn8ewg26pESd+x4A4hmKIwAA M1Pr3/z300G2kSZys9+V2gAA lKU9qHfzRUCUfIkmOxQPWAAA 4 h9f7ezAA1U2Ib2MC82NkSgAA 84TQqpF9aU+iF837vcLGHQAA vugvfrAHnEmkzIDoIsppEAAA mD9UZqR05E2dkxobeXxNVgAA Rn8ewg26pESd+x4A4hmKIwAA 2obaeOJyfkeJFGGVgabaMAAA lKU9qHfzRUCUfIkmOxQPWAAA 4 0ut/qp2I+UyqR2HJPch6QgAA 06rNPF9HfUq4ghDmQI+tiwAA y9YyRmN4qk6ERhUGCr+QpgAA kg0wNFKcLEObCzzUC+msZwAA Rn8ewg26pESd+x4A4hmKIwAA lKU9qHfzRUCUfIkmOxQPWAAA K1HPP6E6bk2VZXM2QbaRgAAA 4 xzrM2bBAIk+2WlG7CvLOwAAA 36cJFPfB7UKvKFgL7/xTXAAA ZMRVUzeSSkWQAcgQAK5JrgAA C/70PGEcdkmKK9860rb1PwAA BeanDefinitionResource vkPackage Rn8ewg26pESd+x4A4hmKIwAA 4 QNxBNmkeYEKeoUImtkaYvwAA A0iFWVLHB0KstSN479vPzgAA 9vxdf2d2KU6PwkldG1S0oQAA y9AQ827AVUuY5phan8BHeAAA 1 DAhXQZITjUKUNJ9Sb9/JbQAA ByteArrayResource Rn8ewg26pESd+x4A4hmKIwAA 4 /GB9RUBz7EudFSNpj1XJogAA h787UZ+uqU+tdpqrVjOB2gAA USE7EMDcjkGqsjn7LDveMgAA UheHEck420um+MQVlNZ07gAA 1 0Mw4c+/azUeRcMnKZ0RWIQAA DescriptiveResource Rn8ewg26pESd+x4A4hmKIwAA 4 NtaNTbP680mDnZIM7ethDAAA v25FxXkS1EKH7Eh9IoOVHgAA OZzEmSPiXEmeJbdeGHKAaQAA i+nl5T4M2EWYiAr3a6ohIAAA 1 q3m90zeVfEWLi8C0/f895QAA FileSystemResource Rn8ewg26pESd+x4A4hmKIwAA 4 wGJ1ZQ5vQ0+z/SzShOHc8wAA jPZI24+h0UqvqKOtnQRWjQAA 1dhgobQSsEeNqFgb8WT4swAA LwxZX/akK0evnFCOr5LRpwAA 2 RRkgMdPm/E+z9fRcuQntoQAA EOMowpigAE2c+NC/rbXKfQAA 1 RQFje06pUU2jqRqL5vlvAQAA InputStreamResource Rn8ewg26pESd+x4A4hmKIwAA 4 X3hvoGkJ5UOFS8hRRg8C6AAA mp3J6XlauUaODufdQIc1dwAA 9iZx2IlztkKepKabYZVU7wAA ug4I8+6mwEKPVexFjPjakAAA 1 96lCxZrN7kmrocEKcoHuJQAA PathResource Rn8ewg26pESd+x4A4hmKIwAA 4 1FGiAtNEd0qE7n1oANqWKQAA 6Sa22/Im60qif9keuwNUgQAA QaEWRv0MokmqtCoDtEyd9QAA 7oJZ7Hkd00eoADtD2Nu8TQAA 1 cLQHI2PS30Or8AXCv0PMfQAA 1 h3im9Hb8PkiT6+NstJ49yQAA VfsResource Rn8ewg26pESd+x4A4hmKIwAA 4 JfvFHjutLkm3k6NbQANEUAAA cr8t9W4kI02f1cDO3NodzQAA OKMVIjI/ak2VF26iVeTROQAA rsPI5YcbNkCT1IJegrjvmQAA 1 DLVPK3KHoUyDILbyj/9nnQAA Rn8ewg26pESd+x4A4hmKIwAA PEG/9N+8jkqI6iLpzuAZFwAA K1HPP6E6bk2VZXM2QbaRgAAA 4 CR+DJar5cki21e+7hq2++AAA hvVFzIfmFUyCwFWlmrKIWwAA 89TGVFy9JUGJeLHb/PPhEgAA dClsZqsL+Umrj5Ucti/UHwAA Rn8ewg26pESd+x4A4hmKIwAA DuZ5+vXoM02UPGUP6l8eBQAA K1HPP6E6bk2VZXM2QbaRgAAA 4 68/WUcVGy0Sy+IDtYQGvawAA aRsbZHiJ2kCr52vdYQoHwgAA xGdFYBaxDU61gpro/eZXXAAA +tZ7X7hQ8keMNnaw4W0AAgAA Rn8ewg26pESd+x4A4hmKIwAA LZ8rOWtT00O8zq6eblgr/gAA K1HPP6E6bk2VZXM2QbaRgAAA 4 UEIDYC0jQkql638hQqlH1gAA EG4M78XcHkC33zuCd2mQsgAA 8JCJO1wk6k2ZH3eRbtAjMgAA GT+N9+mouEmf6vnByEzDJwAA Rn8ewg26pESd+x4A4hmKIwAA a08oCwoxHUSXkU/FORpi/wAA K1HPP6E6bk2VZXM2QbaRgAAA 4 CHzhkdZGJkOgDs6RIdPbVgAA EYRyUJGuoUmz/dHQyuPOAwAA ZRh3/p2+QEeMsR6BJ510awAA sXwF6DqNFUCNZzes7TT5fwAA Rn8ewg26pESd+x4A4hmKIwAA 6rLBS/Hw/0GfJYqjX2C3+gAA K1HPP6E6bk2VZXM2QbaRgAAA 4 0pp+pt6Cx0eno8HaSpxStwAA Zp+VzFUeVk6VW49z8nV1swAA db7kdlzCjUKO1aeJPBNvOwAA OBlQNks5tU+zqWnc8UZjNQAA Rn8ewg26pESd+x4A4hmKIwAA Fs1kDebEiEOzlZzSXUDUVwAA K1HPP6E6bk2VZXM2QbaRgAAA 4 rr++1wULl0eywGVSBIIBmwAA bz13TjMu+UC2FwvvDY3cKwAA ZpD4IcZpu0+hxOpNyrONzwAA QIRC3Q+kuEu5RE3//20bugAA Rn8ewg26pESd+x4A4hmKIwAA cduVJ8xKVUSKisD1nT+KggAA K1HPP6E6bk2VZXM2QbaRgAAA 4 eAFBi68SbUeUDsfgYhsmFgAA OVhqH4qxC0S7AbgMH0+K6gAA bW07doKhGECXzEAYIBJUJgAA r6AtCqucVUiFNuawTE1LtAAA 1 ijm2tWy8jUu2d/4A06C8fQAA ContextResource Rn8ewg26pESd+x4A4hmKIwAA 3 5b0C4Vng8kmtZBo6p2ehTQAA Xv37uHAsmUahD2iJQ8zSKwAA mb8xNFG+C0uBiNd+0aqj4wAA 1 nzlhDUTVBk+eCm0oNnChiAAA 1 getPathWithinContext Hddd4ubAwEqOAAYnyQXl0wAA WritableResource Rn8ewg26pESd+x4A4hmKIwAA 3 yi8jMIPF4kmUC2al3ZryOgAA PVlRox1np0+dF/MLeH/wCAAA zTe7cbdql0aufN3PN2wuIQAA 4 RRkgMdPm/E+z9fRcuQntoQAA ijm2tWy8jUu2d/4A06C8fQAA cLQHI2PS30Or8AXCv0PMfQAA EOMowpigAE2c+NC/rbXKfQAA 1 jczuChRIXEK+OKd1a0wKAQAA 2 isWritable B6mM/9JaR02ScNj0JuIx1QAA getOutputStream B6mM/9JaR02ScNj0JuIx1QAA Rn8ewg26pESd+x4A4hmKIwAA Xp9wRWjEX0qvNBa8eMqm6wAA EypG3LSOrUugXmr60wTTuAAA 4 iLu7so7CxEuKSpOyQdqjjgAA 3lTmOfUMSkmGwwluvytkKwAA bTXlaz5MA0mTDwNHbeCcngAA /p8MuhUMJ0a9DgcdR4ZCUQAA Rn8ewg26pESd+x4A4hmKIwAA Hddd4ubAwEqOAAYnyQXl0wAA Xp9wRWjEX0qvNBa8eMqm6wAA 4 10BPSt6F8kqybcWhplnl4wAA kowrVxPoQka8o9a5zWZYpQAA /Bxvbgr3602sJEuqrPJnuwAA 1my306rf7k2W+IoM7Zv7mgAA Rn8ewg26pESd+x4A4hmKIwAA B6mM/9JaR02ScNj0JuIx1QAA Xp9wRWjEX0qvNBa8eMqm6wAA 4 73D6IDXoW0WxpxAxEEvL9wAA IvXPr0rQc0201Ns1OjmpEQAA oLwZDipOGEKd1YIUFH2qTwAA Fc9bbf/C4kSwT+jVzMQVhgAA Rn8ewg26pESd+x4A4hmKIwAA a08oCwoxHUSXkU/FORpi/wAA B6mM/9JaR02ScNj0JuIx1QAA Rn8ewg26pESd+x4A4hmKIwAA DLVPK3KHoUyDILbyj/9nnQAA B6mM/9JaR02ScNj0JuIx1QAA Rn8ewg26pESd+x4A4hmKIwAA Fs1kDebEiEOzlZzSXUDUVwAA B6mM/9JaR02ScNj0JuIx1QAA 4 qPQnIC6xYEmzRbcyrfiiygAA pC3BlUn+pk+lfF/n/11kygAA sadMMlpD+kmAAQ+aMxyDEAAA xSpTj+ekyUuqpTfa4L7R4AAA Rn8ewg26pESd+x4A4hmKIwAA a08oCwoxHUSXkU/FORpi/wAA B6mM/9JaR02ScNj0JuIx1QAA 4 qK5k5tyGwESABQfazPoQwQAA ZQyZBl3NIUGCjjEKuPx55wAA dK4dDh8LHEiXc4Gi/dpYNgAA /DPE7EY6C0+snH+DfdwjnAAA NamespaceHandler Rn8ewg26pESd+x4A4hmKIwAA 3 RwIRpJVb2UeAfjWIQP4cXwAA 54EKyhjhdU2I5OCA0J6r0gAA E5nf+1EFCEygzSHbLn2n5wAA 3 VloOB8LaVkmx/BsvGjtKfwAA y9o3eNjOvEKGCImhl/XBPwAA yKlIhrQyWUij3RfX5h2P9AAA 3 init 2N1R1KhaHEu7lKvAfVDEjgAA parse 2N1R1KhaHEu7lKvAfVDEjgAA 2 Element element 9qHRTtjiNUubmRpt+SXNAgAA ParserContext parserContext 9qHRTtjiNUubmRpt+SXNAgAA decorate 2N1R1KhaHEu7lKvAfVDEjgAA 3 Node source SRC28POeAE2G1aOd110pFwAA BeanDefinitionHolder definition SRC28POeAE2G1aOd110pFwAA ParserContext parserContext SRC28POeAE2G1aOd110pFwAA NamespaceHandlerSupport True Rn8ewg26pESd+x4A4hmKIwAA 4 I3uN6TonhEqibxdqHgoZtgAA nbQ6XWYXCUO32NvknhmtEQAA 6ok/Kh+5ZkC5EG3hpfElAAAA dOuGtBeCjkalRncWyqwLjgAA 1 y9o3eNjOvEKGCImhl/XBPwAA 7 q5F31IhpOEOxlGO1V8PotAAA mt03a5sObE2F12gfJx3yrAAA BUesOaxx5UOIR4R67XS5jQAA 43l036EXmkW9rPMG7USXcAAA U/vZOTE9MUOeyqWHs1RGCAAA O7wkF+CsMUWxfVc4HutJRQAA GRHQJQrHAEqlAIBE2mFmkQAA 5 parse ZhPHuQeVkEqTlr4R1vt62QAA 2 Element element VOBqu3ZPr0eOecoG/u2XvwAA ParserContext parserContext VOBqu3ZPr0eOecoG/u2XvwAA decorate ZhPHuQeVkEqTlr4R1vt62QAA 3 Node node MrDfI07Lzkak8n9TZng2lQAA BeanDefinitionHolder definition MrDfI07Lzkak8n9TZng2lQAA ParserContext parserContext MrDfI07Lzkak8n9TZng2lQAA registerBeanDefinitionParser vkProtected ZhPHuQeVkEqTlr4R1vt62QAA 2 String elementName DwKALcfH00mTkMOlD5r1hgAA BeanDefinitionParser parser DwKALcfH00mTkMOlD5r1hgAA registerBeanDefinitionDecorator vkProtected ZhPHuQeVkEqTlr4R1vt62QAA 2 String elementName NzzH3KyCdkS2kVovXC/MxwAA BeanDefinitionDecorator dec NzzH3KyCdkS2kVovXC/MxwAA registerBeanDefinitionDecoratorForAttribute vkProtected ZhPHuQeVkEqTlr4R1vt62QAA 2 String attrName NbxVxmvxuE6FgZnUy8HsLQAA BeanDefinitionDecorator dec NbxVxmvxuE6FgZnUy8HsLQAA 3 Map<String, BeanDefinitionParser> parsers vkPrivate ZhPHuQeVkEqTlr4R1vt62QAA Map<String, BeanDefinitionDecorator> decorators vkPrivate ZhPHuQeVkEqTlr4R1vt62QAA Map<String, BeanDefinitionDecorator> attributeDecorators vkPrivate ZhPHuQeVkEqTlr4R1vt62QAA AopNamespaceHandler Rn8ewg26pESd+x4A4hmKIwAA 4 pNn2yJV+7Eu20N1K998gHgAA HQG0ynwxxEq5eNjIGXVaaQAA Y7SmtjpwNE+ZZRKBgIvsiAAA PJmv86HzBEyimnGVPHjUqwAA 1 q5F31IhpOEOxlGO1V8PotAAA 1 init gqvxp2rBxkOqbJXDcrgj9QAA CacheNamespaceHandler Rn8ewg26pESd+x4A4hmKIwAA 4 TnP1cXNef0GSRX8eKbesXAAA 3KSDa25EBU+sqWermagafQAA EaYOQAyXRkixiPmevyK44AAA owDcgbtajEGH0P8Rk+y4qQAA 1 mt03a5sObE2F12gfJx3yrAAA 1 init 0/x5kMhdeEGM+DG/EBXm4gAA ContextNamespaceHandler Rn8ewg26pESd+x4A4hmKIwAA 4 V7ze5lstO0mUOxm+n+Z46wAA OxsuwwzY0UeIiAQ3gYy4tgAA q4tExvUUuEuC6uRkIZYmHwAA V2yM1L7H0k+stuYOFs0LAgAA 1 BUesOaxx5UOIR4R67XS5jQAA 1 init nQBEJomUvUuF9287/RMHpQAA JeeNamespaceHandler Rn8ewg26pESd+x4A4hmKIwAA 4 U8mjH8zmqkyKf4Ys9OsBPQAA NT/P8N2lxUq/KuFtrMYgRgAA 3uXSwoo77UCv2atmJc7KzwAA EYcjaq8peEi8rIgZO8hFHQAA 1 43l036EXmkW9rPMG7USXcAAA 1 init aVrvHRnaLkuNEd8suGUokQAA LangNamespaceHandler Rn8ewg26pESd+x4A4hmKIwAA 4 AcGYe2zkR0WOfERKR+nXuQAA kexRY4tiQUOvjs+eMo4GawAA lGa7tMBQOU2a2AJXEdGxgAAA 4vJ5xCpIYEeKS14vfNQztgAA 1 U/vZOTE9MUOeyqWHs1RGCAAA 1 init xy043JjFek21Zj9RNykKTgAA TaskNamespaceHandler Rn8ewg26pESd+x4A4hmKIwAA 4 XN2onDqzP0upxO4qoZKA7QAA O9pBWUIyLESM/fweDehOhAAA uWhtTn7MA021pw7Ku29wBAAA EQikBbTdfEGyMSdBai/+fAAA 1 O7wkF+CsMUWxfVc4HutJRQAA 1 init KcNcendufUWOAUbRXKoWYwAA UtilNamespaceHandler Rn8ewg26pESd+x4A4hmKIwAA 4 FJpAJrMKS0O0Hbi+6v6EpAAA W1YAHPs/l0OWHFL5aNQ09gAA mxpvaZVNh0+WM+T1sFX9zgAA Jm1cPA+aeki1a0+4rFuLlAAA 1 GRHQJQrHAEqlAIBE2mFmkQAA 1 init 7+m0gVnSS0uHb/377qbiPgAA SimpleConstructorNamespaceHandler Rn8ewg26pESd+x4A4hmKIwAA 4 plBLYL5vGkSRqUPIr5LsYAAA TsiurgWiM0aZTxyNFBekywAA dJYV+rtQMUaWlS6OAwIVSgAA lUgWbJf2gk6bjpPS6G1rzQAA 1 VloOB8LaVkmx/BsvGjtKfwAA SimplePropertyNamespaceHandler Rn8ewg26pESd+x4A4hmKIwAA 4 ynwCFJIhpkmFwP1HZuWz/QAA fH/G92oFeEWovxQEq8mBogAA xXjP4+NdDUCGMMtuz/WICQAA wXGjZG9oHE2xaJ27jVCnSAAA 1 yKlIhrQyWUij3RfX5h2P9AAA Rn8ewg26pESd+x4A4hmKIwAA R7u2oeTWdESogqMIXwZSggAA 2N1R1KhaHEu7lKvAfVDEjgAA 4 ef0Ws1BSpk+TYAhu6a/O+AAA nAW/vfuNvkyc3Ad1IdNnmQAA 5M6odkeMj022XcagXEqpOwAA 36WDhYZqbkOKZP0oSXrqJgAA Rn8ewg26pESd+x4A4hmKIwAA ZhPHuQeVkEqTlr4R1vt62QAA 2N1R1KhaHEu7lKvAfVDEjgAA 4 XluJLfMCVEuYNyi/+51x0gAA Nu0SwEngukCwHdok5nCy8wAA q94jM7oSMkGh1ral+WzFBgAA 7BykBcwtqkqZARFSEF6ZMgAA Rn8ewg26pESd+x4A4hmKIwAA s2l/7OiPEEelx8B8VPgKdgAA 2N1R1KhaHEu7lKvAfVDEjgAA 4 BQLz8tJqS0eS4Mimi9nsCQAA DSnGg7xIu0W/1sVUmTG0qgAA dRZVZVEm2UyDAuM1AnOTfQAA fNuJq4QzQkioiwJdaCZkDQAA Rn8ewg26pESd+x4A4hmKIwAA gqvxp2rBxkOqbJXDcrgj9QAA ZhPHuQeVkEqTlr4R1vt62QAA 4 1dBjZhrC0UaKp4lfhhGrNwAA 9XzIvcCl3US3DO2Sq4h3DQAA pbZWURwswkS++8E/B1y47QAA vigSrUY+4UC1IoHKL2ZORQAA Rn8ewg26pESd+x4A4hmKIwAA 0/x5kMhdeEGM+DG/EBXm4gAA ZhPHuQeVkEqTlr4R1vt62QAA 4 tznXuNrkWE+KqWlF00qidgAA 7aOx+DDhck2Occxl2J7PAgAA L13sNjx1fUSza0AkrZg5JQAA 5gfy5L/U6E6iBn/U0HhnDAAA Rn8ewg26pESd+x4A4hmKIwAA nQBEJomUvUuF9287/RMHpQAA ZhPHuQeVkEqTlr4R1vt62QAA 4 CbcSAIdRykGCsztl5w+3vgAA 8Ryuq84JhEWh3Un0L+tbYgAA 7l1OjQn98Um+TwmK3WdBkwAA JubxFzo8EEWUx724d31rbAAA Rn8ewg26pESd+x4A4hmKIwAA aVrvHRnaLkuNEd8suGUokQAA ZhPHuQeVkEqTlr4R1vt62QAA 4 dtHDurNnXU2yQcP3uyHVtQAA W1EQ3AoDt0Cjh/tvkMN0OgAA x5vYELQDmUCs65N+pBvqggAA wTi5pXjo50y6JgGNyobv4AAA Rn8ewg26pESd+x4A4hmKIwAA xy043JjFek21Zj9RNykKTgAA ZhPHuQeVkEqTlr4R1vt62QAA 4 60TBe5SYAkmtHnIC4VNEDwAA h/rpMcIUskK5FcFJbGH+FAAA +jhVN6DRz0COTHgsfSBqGgAA mvJ9F9cNy0a2wzOV6VDDwwAA Rn8ewg26pESd+x4A4hmKIwAA KcNcendufUWOAUbRXKoWYwAA ZhPHuQeVkEqTlr4R1vt62QAA 4 b27wqIBOME+/wLI//Y84oQAA nN8F0nkxfUuuQaZL0ec4gQAA C442Gd98MECdz0OJJNGEgAAA wwBZMcLVb0e06nB5u8WZDAAA Rn8ewg26pESd+x4A4hmKIwAA 7+m0gVnSS0uHb/377qbiPgAA ZhPHuQeVkEqTlr4R1vt62QAA 4 1VvGDeMQPEeaZa7CJLGSnAAA Vp0a+MKMwkWUz2j/peJpdwAA HlGx7nmMfUm4UFKVXNiADgAA pXqDQoGyvUehSb972zb3IQAA ExpressionParser Rn8ewg26pESd+x4A4hmKIwAA 3 iZ+nPsD4eU+SBn/lfoPbegAA sUhrNwvhZEGlt4MvUfXtZQAA JwBqFmm+N029Rit/WVISogAA 1 NulDjwzaV0eJdoIpe8qBCgAA 2 parseExpression cUGJw724BEurOG/ONaGiIwAA 1 String expressionString vJJBv940bUqLa60+Opt0yAAA parseExpression cUGJw724BEurOG/ONaGiIwAA 2 String expressionString 92mzIzg9d0iGMGKm+xIpVwAA ParserContext context 92mzIzg9d0iGMGKm+xIpVwAA TemplateAwareExpressionParser True Rn8ewg26pESd+x4A4hmKIwAA 4 n/uAtdTeRk6a6wmlV29pcQAA 9jCsS8h5xEqO+dH20/2AugAA JNu6/vdm1EW4yFd73bvW0wAA h8EhsOycy0iAlSHeiG5tIQAA 1 NulDjwzaV0eJdoIpe8qBCgAA 2 dJ9Z1nJdXkSoB7aAw0UIlAAA KHYoQiuVk0KWxyVwJXoM/wAA 2 parseExpression x0sSzgf0t0OFEX+sWL12KQAA 1 String expressionString BAZ1Yv1hdUKjr1RRKk3+hgAA parseExpression x0sSzgf0t0OFEX+sWL12KQAA 2 String expressionString J4tCnEKjAEOLXUyrqxXD/QAA ParserContext context J4tCnEKjAEOLXUyrqxXD/QAA SpelExpressionParser Rn8ewg26pESd+x4A4hmKIwAA 4 ipJ3drxCJESvUHjQgSg6AAAA nmjWSi4DtUaVC+pvgHKdqwAA PyG+I65BXkOJeZMhh8BW6AAA ZQzBwFGFx0Cg87uXBgQx4AAA 1 dJ9Z1nJdXkSoB7aAw0UIlAAA 2 parseRaw T6jBcpPph0iMLGmfE/yA7gAA 1 String expressionString 1ywZ8u2P/06bVtYstxqiewAA doParseExpression vkProtected T6jBcpPph0iMLGmfE/yA7gAA 2 String expressionString vAf9vtE2F0CLlLLTPxArlQAA ParserContext context vAf9vtE2F0CLlLLTPxArlQAA InternalSpelExpressionParser vkPackage Rn8ewg26pESd+x4A4hmKIwAA 4 mejGSCSDZEGuWo3jlvqE9AAA HJAdsH48BUeRQ2ip1iThjQAA csOx5lEJW0iS06wAMEafAAAA XgMc22kO30yXTn6p7vTjTAAA 1 KHYoQiuVk0KWxyVwJXoM/wAA Rn8ewg26pESd+x4A4hmKIwAA x0sSzgf0t0OFEX+sWL12KQAA cUGJw724BEurOG/ONaGiIwAA 4 veKesyLfiEGFVHF7sr15mgAA FlTPK43O0k+BOaZNIAOnwwAA +R042TjkxEOha48I9U4u9gAA oeG3NY98Y0Ci06/aVMKAVQAA Rn8ewg26pESd+x4A4hmKIwAA T6jBcpPph0iMLGmfE/yA7gAA x0sSzgf0t0OFEX+sWL12KQAA 4 KmNDsmzdFkeK0l4/vcSR9AAA 48rd0pPfzkqLFtuNqVLakgAA JNlA7memv0S9ct9YgOznpwAA ecgwDhgJ1k+QJmrPckE9RAAA Rn8ewg26pESd+x4A4hmKIwAA phadBJpLAEKuYK32aybSTgAA x0sSzgf0t0OFEX+sWL12KQAA 4 yrni/AmISkqaRRxpAn+J1gAA IGQz4eqA/UqOOOMIBJoSvgAA P4+rjiWgBkOw7XM8AAvtkgAA Idm7rm4WM0unoBOc455vMgAA ApplicationObjectSupport True Rn8ewg26pESd+x4A4hmKIwAA 2 setApplicationContext nL95+Gy59kOvWKdvNRKVTwAA getApplicationContext nL95+Gy59kOvWKdvNRKVTwAA ApplicationContextAware Rn8ewg26pESd+x4A4hmKIwAA ApplicationEventPublisherAware Rn8ewg26pESd+x4A4hmKIwAA Aware Rn8ewg26pESd+x4A4hmKIwAA EventPublicationInterceptor Rn8ewg26pESd+x4A4hmKIwAA 3 setApplicationEventPublisher HqLUKJgtEEOSLiyJQWIlCQAA afterPropertiesSet HqLUKJgtEEOSLiyJQWIlCQAA invoke HqLUKJgtEEOSLiyJQWIlCQAA BeanClassLoaderAware Rn8ewg26pESd+x4A4hmKIwAA InstantiationStrategy Rn8ewg26pESd+x4A4hmKIwAA 3 Y3SAsiyqNkKqvAkNZaFLPwAA zhgDIQmXMkWS8XeQRk4YDQAA N02u9A2Aq0qh4x22TYwEUgAA 1 DfoGJYFOr0+TARVvLbI6NAAA 3 instantiate CsUNfEOqVkq9hhyDIV3YVQAA 3 RootBeanDefinition bd o5N/zdSKtU+m4Kzsnu5uPgAA String beanName o5N/zdSKtU+m4Kzsnu5uPgAA BeanFactory owner o5N/zdSKtU+m4Kzsnu5uPgAA instantiate CsUNfEOqVkq9hhyDIV3YVQAA 5 RootBeanDefinition bd cGVSXtmyKk+5XA6TPpugmAAA String beanName cGVSXtmyKk+5XA6TPpugmAAA BeanFactory owner cGVSXtmyKk+5XA6TPpugmAAA Constructor<?> ctor cGVSXtmyKk+5XA6TPpugmAAA Object... args cGVSXtmyKk+5XA6TPpugmAAA instantiate CsUNfEOqVkq9hhyDIV3YVQAA 6 RootBeanDefinition bd zbUz+aEZJk2xI9DohXDf1gAA String beanName zbUz+aEZJk2xI9DohXDf1gAA BeanFactory owner zbUz+aEZJk2xI9DohXDf1gAA Object factoryBean zbUz+aEZJk2xI9DohXDf1gAA Method factoryMethod zbUz+aEZJk2xI9DohXDf1gAA Object... args zbUz+aEZJk2xI9DohXDf1gAA SimpleInstantiationStrategy Rn8ewg26pESd+x4A4hmKIwAA 4 XbNd0iMriUCrULVGoNBxxwAA l46iLioKq0eiVNwJsbd+hgAA 0GT84wYLXkiR+uswJ/MKqQAA HEkz9vZyQkCTEnQP0GPXEwAA 1 DfoGJYFOr0+TARVvLbI6NAAA 1 yXxF+UYu5U6R0ENOi8aZIAAA 2 instantiateWithMethodInjection vkProtected Dd1mq+WWtEGDUds1Q6TNPwAA 3 RootBeanDefinition bd CnK6IIZ+e0K8M3bdFE6ZYwAA String beanName CnK6IIZ+e0K8M3bdFE6ZYwAA BeanFactory owner CnK6IIZ+e0K8M3bdFE6ZYwAA instantiateWithMethodInjection vkProtected Dd1mq+WWtEGDUds1Q6TNPwAA 5 RootBeanDefinition bd WlB8DKrsHkGc1WiBdIuX6QAA String beanName WlB8DKrsHkGc1WiBdIuX6QAA BeanFactory owner WlB8DKrsHkGc1WiBdIuX6QAA Constructor<?> ctor WlB8DKrsHkGc1WiBdIuX6QAA Object... args WlB8DKrsHkGc1WiBdIuX6QAA CglibSubclassingInstantiationStrategy Rn8ewg26pESd+x4A4hmKIwAA 4 PsuFF0MAtEKCSSr2/CtIYQAA M89jpomTk0mxGjy4FtLqVgAA iUgJg3fgSUeUvLSe6wRAugAA fwiFljz7TEytRgff7Uzj3wAA 1 yXxF+UYu5U6R0ENOi8aZIAAA Rn8ewg26pESd+x4A4hmKIwAA Dd1mq+WWtEGDUds1Q6TNPwAA CsUNfEOqVkq9hhyDIV3YVQAA 4 b3gm8qL6j0ivDyYJ3f82HwAA BgXJyKRuW0a43WPm+5YzigAA fwfxBp/IQ0qdaCmAPFIwtQAA U68K9fD5FE6stK2pNsZj4QAA Rn8ewg26pESd+x4A4hmKIwAA gMAkn6VsaUKHgLrf0DnIFgAA Dd1mq+WWtEGDUds1Q6TNPwAA 4 L1vWmofLHESz0WJ4c7TpkQAA Ipg77wH20kKO7ckeGRacmgAA WFXNH0HiyUufekYHojudIAAA FXbPamCFuUOibBl+jr7d/AAA Scope Rn8ewg26pESd+x4A4hmKIwAA 3 rvpaPGu5VEqTkdGY33vnRAAA ixdv8P4h80myhhto6H0zMQAA uv76UaTdskWd0GD+9mH1qgAA 3 AZHESo826kyeQGoHqxpSmgAA Qoe4h6kRrEuMVHPOcNsd0gAA xdKy7r6TskC08oVwsT1GrwAA 5 get mywCjp1aOUyaXghJ+SzhyQAA 2 String name cH79QFF0W0Oi7eAZ4l310gAA ObjectFactory<?> objectFactory cH79QFF0W0Oi7eAZ4l310gAA remove mywCjp1aOUyaXghJ+SzhyQAA 1 String name hAUgZya/vkyLJTmrDMUVmAAA registerDestructionCallback mywCjp1aOUyaXghJ+SzhyQAA 2 String name Wwzul3a0QE2HtPr18F0uHAAA Runnable callback Wwzul3a0QE2HtPr18F0uHAAA resolveContextualObject mywCjp1aOUyaXghJ+SzhyQAA 1 String key qZB070IhwUuSX9QEXFr1eAAA getConversationId mywCjp1aOUyaXghJ+SzhyQAA SimpleThreadScope Rn8ewg26pESd+x4A4hmKIwAA 4 8Y9u5lSkyUSw5FBnAC6TcwAA A5TI4+cPjkSON+irt/drvQAA EMecKlKt9UWkm52urNRZUQAA 4TyYVEkuAEGGxaFPoJXuggAA 1 AZHESo826kyeQGoHqxpSmgAA Rn8ewg26pESd+x4A4hmKIwAA gofn8tMtKUyaQ81oxdBKzAAA mywCjp1aOUyaXghJ+SzhyQAA 4 RJ0cEAaJJU2NSAvC9APmyAAA wZ9YvgAgb0qgD9cCVojZ0AAA bKpRSgQpi0yb2vPVe0qkYgAA dBxXPL16GECE6yb75wze0wAA AbstractRequestAttributesScope True Rn8ewg26pESd+x4A4hmKIwAA 4 1s3GRWfbuU6srNDKY6uk4gAA 9HCi3z9Ql0SJj2m0SHPNsgAA DnAdDDvyDUS1CfQIrTQAiwAA u9bSzmRjhkW43UtWSG/NzAAA 1 Qoe4h6kRrEuMVHPOcNsd0gAA 2 N6r+cH/6NEGaPfsSLivnoAAA YL2cvgX77kWmZ93Q2xVzkgAA RequestScope Rn8ewg26pESd+x4A4hmKIwAA 4 9o/rMCPgqEaVIs3Gwt+QSwAA +QeHjE23jE+tqqLtpTgKzAAA 4WwQAz5RV0WfucQToBVlOQAA XfBafrZIfUGQAZgwGON7WQAA 1 N6r+cH/6NEGaPfsSLivnoAAA SessionScope Rn8ewg26pESd+x4A4hmKIwAA 4 bv2AGJdkNkGR37vJM5x2TQAA 6eKoBLW74Uupd0FFmLPf2wAA jSCzj/srxEWFnUJR78JAgwAA iAI0Tcc9D0+gWqXHLBxrxQAA 1 YL2cvgX77kWmZ93Q2xVzkgAA ServletContextScope Rn8ewg26pESd+x4A4hmKIwAA 4 3ccZJoWyAESYV8nch/rzIQAA e9wwd4m7G0qbuy7i+561SAAA 6HQy+ikokkCDzbSmGxcVqQAA MZfZ5kHQd0iZqpI39bnWbwAA 1 xdKy7r6TskC08oVwsT1GrwAA Rn8ewg26pESd+x4A4hmKIwAA kdCkLUbyKUiwIe8OQpqhcwAA mywCjp1aOUyaXghJ+SzhyQAA 4 ZIbPX6xW3USRsXUM7BGVIAAA m+azU4vQ/0aRpOUvvXmhIAAA r5Z7qAof9UeUKD06xjXEvAAA XSN2DHy490KIEqMEUmv7YQAA Rn8ewg26pESd+x4A4hmKIwAA FIrqIiv6YE+aQTDvM3unOQAA kdCkLUbyKUiwIe8OQpqhcwAA 4 evGlgZEz8UubVjIdzxLxLQAA iZjxWOsRp0OUGP0iw8og2gAA Y83peroIiEOHc4yRivzMVgAA JwRbdLTJgUCS4wXf+M4r5AAA Rn8ewg26pESd+x4A4hmKIwAA Hs7ki7vi60y1tTx8qcDtnQAA kdCkLUbyKUiwIe8OQpqhcwAA 4 mJPf3PVMhU6/C0T0zrQNWgAA pi2rDFmk20OmbX1YZJUbdgAA kddiGNB9UkSwuo7xTcPH2wAA 7rogKLTuiEqwqWZ3P9iNvAAA Rn8ewg26pESd+x4A4hmKIwAA NHxavM2W2kekISgSOdU98wAA mywCjp1aOUyaXghJ+SzhyQAA 4 EypFU06YcEG6kqN3rP13BQAA Tc+6FHKla0+o0A3p7l9XfgAA P26F66Vlf0uykWte5s+RJwAA nLgX2r1w80CHQa+PRWeYUQAA 流程图 OB1ywkeJUU2zhj8yqaXuowAA 2 BeanDefinition IKX9OnbHUkCCQB/szc3puAAA TOP 3jr/OALDWk2vvxELASNrvAAA 24 BeanDefinition InzFK1z9JESgMJ/Us6vrXgAA GenericBeanDefinition InzFK1z9JESgMJ/Us6vrXgAA 1 C4hmFB6XSkGtoY4UJpK90AAA 20 BKVqwamOHE6OpGFWuukS8QAA wbjvqDm2B0C6KCwby20LiAAA dY2K+lEtjE21d+gjP2pNlQAA sK2iU4Rk6U2Muqgl1KLGgwAA /Lar9b1TkEaoboWgaiAMPAAA lvqxiRSX70WP5vsY19d6NgAA DzQBw2QrxkyIez4hNRZQ/wAA gW6HKfqD3kqpxIrZMhoPwAAA QKsvEfqHSUii/DfHqs1+UQAA vkKulccJtk6pVBcGv/rjxQAA 7qDsrlMXekWywR1gU7iVdgAA XCnt3hhax0+N8V7E4jsOnwAA qFKhq9lK6EG2XzhdbKCMBAAA wqq6HWVPMEWNVDEj0+vnjgAA mifRZtozjEiTQLMzp3gwVgAA DPqC8KjXY0yQOIEDTCO+fAAA elMjk7wgo0iK7+uYUxtR+wAA QhrxLiMsMkCOYLOrwQusBAAA w6RzcT/3/0qJMLO1Jdb+RgAA KIazdixZCkaR1e1y0+Sq4wAA parentName InzFK1z9JESgMJ/Us6vrXgAA 1 J9ri3Tl9Gk2QYeUuJzSp+gAA 1 BKVqwamOHE6OpGFWuukS8QAA beanClass/beanClassName InzFK1z9JESgMJ/Us6vrXgAA 1 /uCXm25dmE270VIqKecbjQAA 1 wbjvqDm2B0C6KCwby20LiAAA scope(String) InzFK1z9JESgMJ/Us6vrXgAA 1 5uM9w7znWk+j+8PSSIBqegAA 1 dY2K+lEtjE21d+gjP2pNlQAA abstractFlag(boolean) InzFK1z9JESgMJ/Us6vrXgAA 1 VdLpkRhpEU2LmreILp64QwAA 1 sK2iU4Rk6U2Muqgl1KLGgwAA lazyInit(boolean) InzFK1z9JESgMJ/Us6vrXgAA 1 +/uCB66wk06M2SLuim8+swAA 1 /Lar9b1TkEaoboWgaiAMPAAA autowireMode(int) InzFK1z9JESgMJ/Us6vrXgAA 1 +NSIoY/s4kmXqe7HLy900AAA 1 lvqxiRSX70WP5vsY19d6NgAA dependsOn(String数据) InzFK1z9JESgMJ/Us6vrXgAA 1 t1IwSmU+hUCQInfLhrZTNAAA 1 DzQBw2QrxkyIez4hNRZQ/wAA autowireCandidate(boolean) InzFK1z9JESgMJ/Us6vrXgAA 1 xS0gqKJ2SEas6S8aMbYYwgAA 1 vkKulccJtk6pVBcGv/rjxQAA primary(boolean) InzFK1z9JESgMJ/Us6vrXgAA 1 6IqB1D+weUuN+6/ples9/AAA 1 7qDsrlMXekWywR1gU7iVdgAA initMethodName InzFK1z9JESgMJ/Us6vrXgAA 1 6i+pzvGCB0Wqj9MNX3bj3gAA 1 XCnt3hhax0+N8V7E4jsOnwAA destroyMethodName InzFK1z9JESgMJ/Us6vrXgAA 1 VXjeJixrIEOKy1oaWdJ1igAA 1 qFKhq9lK6EG2XzhdbKCMBAAA factoryMethodName InzFK1z9JESgMJ/Us6vrXgAA 1 lcMlz2isM0a2kLbvMULIAAAA 1 wqq6HWVPMEWNVDEj0+vnjgAA factoryBeanName InzFK1z9JESgMJ/Us6vrXgAA 1 wkkjy2N3MU2l7IhjdotJfQAA 1 mifRZtozjEiTQLMzp3gwVgAA description InzFK1z9JESgMJ/Us6vrXgAA 1 jHh0hoqDgEGdieq5Gf9IYwAA 1 DPqC8KjXY0yQOIEDTCO+fAAA AttributeAccessorSupport.attributes(Map<String,BeanMetadataAttribute>) InzFK1z9JESgMJ/Us6vrXgAA 1 mjmkTJ8USU6IgnbpfVUqyQAA 1 elMjk7wgo0iK7+uYUxtR+wAA BeanMetadataAttribute InzFK1z9JESgMJ/Us6vrXgAA MethodOverrides.overrides(Set<MethodOverride>) InzFK1z9JESgMJ/Us6vrXgAA 1 q1VkCfIPxUSve3unShcosgAA 1 gW6HKfqD3kqpxIrZMhoPwAAA MethodOverrides.overrides(Set<MethodOverride>) InzFK1z9JESgMJ/Us6vrXgAA 1 fIXhSRqH7E25Y4WJphGilwAA 1 QhrxLiMsMkCOYLOrwQusBAAA ReplaceOverride InzFK1z9JESgMJ/Us6vrXgAA constructorArgumentValues(ConstructorArgumentValues) InzFK1z9JESgMJ/Us6vrXgAA 1 /LgUQqeP+UuqsWjEL/dHpgAA 1 QKsvEfqHSUii/DfHqs1+UQAA propertyValues(MutablePropertyValues) InzFK1z9JESgMJ/Us6vrXgAA 1 Bcw3L+tuwUWjmhKlyuieWAAA 1 w6RzcT/3/0qJMLO1Jdb+RgAA qualifiers(Map<String, AutowireCandidateQualifier>) InzFK1z9JESgMJ/Us6vrXgAA 1 3a8SWK9bMkeqHmeolelDhAAA 1 KIazdixZCkaR1e1y0+Sq4wAA 1 BeanDefinition 3jr/OALDWk2vvxELASNrvAAA D0RvGrC0nUeVO9eKjKi7RAAA 59 clMaroon $00B9FFFF 536 420 126 23 G1e5ejXW9EWSWHgL0th8SQAA GenericBeanDefinition False False clMaroon $00B9FFFF 171 112 90 23 22Y+TiIcckuxvUz0HsDfeAAA parentName False False clMaroon $00B9FFFF 584,420;229,134 BKVqwamOHE6OpGFWuukS8QAA J9ri3Tl9Gk2QYeUuJzSp+gAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 BKVqwamOHE6OpGFWuukS8QAA False 1.5707963267949 30 BKVqwamOHE6OpGFWuukS8QAA False -1.5707963267949 15 BKVqwamOHE6OpGFWuukS8QAA clMaroon $00B9FFFF 181 88 70 23 父Bean名字 clMaroon $00B9FFFF 141 180 150 23 sEDSP4jPIkCUuZPDU0J8EQAA beanClass/beanClassName False False clMaroon $00B9FFFF 580,420;233,202 wbjvqDm2B0C6KCwby20LiAAA /uCXm25dmE270VIqKecbjQAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 wbjvqDm2B0C6KCwby20LiAAA False 1.5707963267949 30 wbjvqDm2B0C6KCwby20LiAAA False -1.5707963267949 15 wbjvqDm2B0C6KCwby20LiAAA clMaroon $00B9FFFF 156 160 120 23 bean class对象或名称 clMaroon $00B9FFFF 171 256 90 25 tGZ+oHEpxU+eX9I82a/wHgAA scope(String) False False clMaroon $00B9FFFF 156 236 121 23 作用域(默认singleton) clMaroon $00B9FFFF 153 332 127 23 u/ZL8ONGHUO/hqW0b/GC0QAA abstractFlag(boolean) False False clMaroon $00B9FFFF 148 312 137 23 是否是抽象类(默认false) clMaroon $00B9FFFF 165 400 102 23 rwL7Wvue1U+LfWUSgAPtNgAA lazyInit(boolean) False False clMaroon $00B9FFFF 166 380 101 23 懒加载(默认false) clMaroon $00B9FFFF 162 488 109 25 M7CIZQsJXEeblx2Ipkje0AAA autowireMode(int) False False clMaroon $00B9FFFF 75 452 282 45 此bean的属性的注入方式(默认no,不启用自动装配) ,此处是基于xml的注入,不要和注解的混了。 clMaroon $00B9FFFF 148 556 136 25 +GEBArOLPEqymL4oULBCvAAA dependsOn(String数据) False False clMaroon $00B9FFFF 79 536 274 23 可以配置多个,依赖的bean将在此bean之前被加载 clMaroon $00B9FFFF 875 120 158 25 VThpbDbMmUOiEaBOzpCVvAAA autowireCandidate(boolean) False False clMaroon $00B9FFFF 843 104 222 23 是否作为其它bean注入的候选,默认true clMaroon $00B9FFFF 903 196 103 23 Yn6sfnwJ2Eac+rykbdkx8wAA primary(boolean) False False clMaroon $00B9FFFF 772 176 365 23 默认false,如果为true,那么当自动注入有多个候选时,此bean当选 clMaroon $00B9FFFF 905 268 98 25 nygNaq+9H0+Uiw/A1fFZ7wAA initMethodName False False clMaroon $00B9FFFF 913 244 82 23 初始化方法名 clMaroon $00B9FFFF 894 316 121 25 cfnnz90U80yu4E7Tyi/avAAA destroyMethodName False False clMaroon $00B9FFFF 895 396 119 25 wAJDfoR3o0ClnxN5tZ8dHQAA factoryMethodName False False clMaroon $00B9FFFF 775 360 358 38 指定工厂方法名,如果配置了此属性,那么此bean便是工厂bean。 当调用getBean时返回的不是此bean,而是工厂方法创建的bean clMaroon $00B9FFFF 793 444 322 23 上面的方法必须是静态方法,如果不是需要配置此属性使用 clMaroon $00B9FFFF 901 464 107 23 W57/KkqSAE2wmmFe8jsd2gAA factoryBeanName False False clMaroon $00B9FFFF 909 504 90 25 DRyX6UzohEeMvO4FD6muxwAA description False False clMaroon $00B9FFFF 762 576 385 23 fjHY9P1hk0+7Rv/6LCP/VAAA AttributeAccessorSupport.attributes(Map<String,BeanMetadataAttribute>) False False clMaroon $00B9FFFF 919 556 70 23 meta子标签 clMaroon $00B9FFFF 88 628 271 25 cK5SiqWln0eI92YZYCJ0sgAA MethodOverrides.overrides(Set<MethodOverride>) False False clMaroon $00B9FFFF 156 612 117 23 lookup-method子标签 clMaroon $00B9FFFF 819 648 271 23 PYDvYPs4L0C7N5bmhFJJZQAA MethodOverrides.overrides(Set<MethodOverride>) False False clMaroon $00B9FFFF 740 628 429 23 replace-method子标签,和上面保存在一个集合中,不同的是ReplaceOverride对象 clMaroon $00B9FFFF 68 704 297 25 I/4vBHENZUWFXKH6vkE+wAAA constructorArgumentValues(ConstructorArgumentValues) False False clMaroon $00B9FFFF 144 684 121 23 constructor-arg子标签 clMaroon $00B9FFFF 848 712 213 25 qakWanfkV0+P2u+AvCDNlAAA propertyValues(MutablePropertyValues) False False clMaroon $00B9FFFF 910 696 88 23 property子标签 clMaroon $00B9FFFF 817 788 275 23 gMBYjIy6OUuu0RMTeFMFpQAA qualifiers(Map<String, AutowireCandidateQualifier>) False False clMaroon $00B9FFFF 912 764 84 23 qualifier子标签 clMaroon $00B9FFFF 572,420;243,280 dY2K+lEtjE21d+gjP2pNlQAA 5uM9w7znWk+j+8PSSIBqegAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 dY2K+lEtjE21d+gjP2pNlQAA False 1.5707963267949 30 dY2K+lEtjE21d+gjP2pNlQAA False -1.5707963267949 15 dY2K+lEtjE21d+gjP2pNlQAA clMaroon $00B9FFFF 550,420;264,354 sK2iU4Rk6U2Muqgl1KLGgwAA VdLpkRhpEU2LmreILp64QwAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 sK2iU4Rk6U2Muqgl1KLGgwAA False 1.5707963267949 30 sK2iU4Rk6U2Muqgl1KLGgwAA False -1.5707963267949 15 sK2iU4Rk6U2Muqgl1KLGgwAA clMaroon $00B9FFFF 536,428;266,414 /Lar9b1TkEaoboWgaiAMPAAA +/uCB66wk06M2SLuim8+swAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 /Lar9b1TkEaoboWgaiAMPAAA False 1.5707963267949 30 /Lar9b1TkEaoboWgaiAMPAAA False -1.5707963267949 15 /Lar9b1TkEaoboWgaiAMPAAA clMaroon $00B9FFFF 536,442;270,490 lvqxiRSX70WP5vsY19d6NgAA +NSIoY/s4kmXqe7HLy900AAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 lvqxiRSX70WP5vsY19d6NgAA False 1.5707963267949 30 lvqxiRSX70WP5vsY19d6NgAA False -1.5707963267949 15 lvqxiRSX70WP5vsY19d6NgAA clMaroon $00B9FFFF 567,442;249,556 DzQBw2QrxkyIez4hNRZQ/wAA t1IwSmU+hUCQInfLhrZTNAAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 DzQBw2QrxkyIez4hNRZQ/wAA False 1.5707963267949 30 DzQBw2QrxkyIez4hNRZQ/wAA False -1.5707963267949 15 DzQBw2QrxkyIez4hNRZQ/wAA clMaroon $00B9FFFF 578,442;245,628 gW6HKfqD3kqpxIrZMhoPwAAA q1VkCfIPxUSve3unShcosgAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 gW6HKfqD3kqpxIrZMhoPwAAA False 1.5707963267949 30 gW6HKfqD3kqpxIrZMhoPwAAA False -1.5707963267949 15 gW6HKfqD3kqpxIrZMhoPwAAA clMaroon $00B9FFFF 583,442;232,704 QKsvEfqHSUii/DfHqs1+UQAA /LgUQqeP+UuqsWjEL/dHpgAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 QKsvEfqHSUii/DfHqs1+UQAA False 1.5707963267949 30 QKsvEfqHSUii/DfHqs1+UQAA False -1.5707963267949 15 QKsvEfqHSUii/DfHqs1+UQAA clMaroon $00B9FFFF 611,420;939,144 vkKulccJtk6pVBcGv/rjxQAA xS0gqKJ2SEas6S8aMbYYwgAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 vkKulccJtk6pVBcGv/rjxQAA False 1.5707963267949 30 vkKulccJtk6pVBcGv/rjxQAA False -1.5707963267949 15 vkKulccJtk6pVBcGv/rjxQAA clMaroon $00B9FFFF 615,420;936,218 7qDsrlMXekWywR1gU7iVdgAA 6IqB1D+weUuN+6/ples9/AAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 7qDsrlMXekWywR1gU7iVdgAA False 1.5707963267949 30 7qDsrlMXekWywR1gU7iVdgAA False -1.5707963267949 15 7qDsrlMXekWywR1gU7iVdgAA clMaroon $00B9FFFF 624,420;925,292 XCnt3hhax0+N8V7E4jsOnwAA 6i+pzvGCB0Wqj9MNX3bj3gAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 XCnt3hhax0+N8V7E4jsOnwAA False 1.5707963267949 30 XCnt3hhax0+N8V7E4jsOnwAA False -1.5707963267949 15 XCnt3hhax0+N8V7E4jsOnwAA clMaroon $00B9FFFF 636,420;913,340 qFKhq9lK6EG2XzhdbKCMBAAA VXjeJixrIEOKy1oaWdJ1igAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 qFKhq9lK6EG2XzhdbKCMBAAA False 1.5707963267949 30 qFKhq9lK6EG2XzhdbKCMBAAA False -1.5707963267949 15 qFKhq9lK6EG2XzhdbKCMBAAA clMaroon $00B9FFFF 661,427;895,412 wqq6HWVPMEWNVDEj0+vnjgAA lcMlz2isM0a2kLbvMULIAAAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 wqq6HWVPMEWNVDEj0+vnjgAA False 1.5707963267949 30 wqq6HWVPMEWNVDEj0+vnjgAA False -1.5707963267949 15 wqq6HWVPMEWNVDEj0+vnjgAA clMaroon $00B9FFFF 661,439;901,468 mifRZtozjEiTQLMzp3gwVgAA wkkjy2N3MU2l7IhjdotJfQAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 mifRZtozjEiTQLMzp3gwVgAA False 1.5707963267949 30 mifRZtozjEiTQLMzp3gwVgAA False -1.5707963267949 15 mifRZtozjEiTQLMzp3gwVgAA clMaroon $00B9FFFF 644,442;909,505 DPqC8KjXY0yQOIEDTCO+fAAA jHh0hoqDgEGdieq5Gf9IYwAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 DPqC8KjXY0yQOIEDTCO+fAAA False 1.5707963267949 30 DPqC8KjXY0yQOIEDTCO+fAAA False -1.5707963267949 15 DPqC8KjXY0yQOIEDTCO+fAAA clMaroon $00B9FFFF 623,442;929,576 elMjk7wgo0iK7+uYUxtR+wAA mjmkTJ8USU6IgnbpfVUqyQAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 elMjk7wgo0iK7+uYUxtR+wAA False 1.5707963267949 30 elMjk7wgo0iK7+uYUxtR+wAA False -1.5707963267949 15 elMjk7wgo0iK7+uYUxtR+wAA clMaroon $00B9FFFF 615,442;937,648 QhrxLiMsMkCOYLOrwQusBAAA fIXhSRqH7E25Y4WJphGilwAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 QhrxLiMsMkCOYLOrwQusBAAA False 1.5707963267949 30 QhrxLiMsMkCOYLOrwQusBAAA False -1.5707963267949 15 QhrxLiMsMkCOYLOrwQusBAAA clMaroon $00B9FFFF 611,442;939,712 w6RzcT/3/0qJMLO1Jdb+RgAA Bcw3L+tuwUWjmhKlyuieWAAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 w6RzcT/3/0qJMLO1Jdb+RgAA False 1.5707963267949 30 w6RzcT/3/0qJMLO1Jdb+RgAA False -1.5707963267949 15 w6RzcT/3/0qJMLO1Jdb+RgAA clMaroon $00B9FFFF 609,442;943,788 KIazdixZCkaR1e1y0+Sq4wAA 3a8SWK9bMkeqHmeolelDhAAA C4hmFB6XSkGtoY4UJpK90AAA False 1.5707963267949 15 KIazdixZCkaR1e1y0+Sq4wAA False 1.5707963267949 30 KIazdixZCkaR1e1y0+Sq4wAA False -1.5707963267949 15 KIazdixZCkaR1e1y0+Sq4wAA 20 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA 22Y+TiIcckuxvUz0HsDfeAAA 4 VH+AxK8EOUOrZeXJql8nBAAA HMFVA4vsFU+dQHhhz1ksdwAA y9mXbEUdz0qW+nfBiYgxRwAA 0KQcOgtBh02ldVFiRAA64wAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA sEDSP4jPIkCUuZPDU0J8EQAA 4 7HeCW+X3ak613clEi7vj4AAA ES+IpIasq0Oh9u5bhBl0gAAA zt0jl6KljUqwp/IhQwWpYAAA rCtY/u/o9kyxxmULpur0QQAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA tGZ+oHEpxU+eX9I82a/wHgAA 4 LB8nPTnFf0igvPa5XY0jEwAA 94cIiRvyzEqGD+i4r43FFgAA 9YMNaOyegUSZTkGMldTGRAAA jeYnByXcvUeBWpa2Sia/AgAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA u/ZL8ONGHUO/hqW0b/GC0QAA 4 qPxKOhiALEmZRZEL83UIAgAA i1DAVPxRVU2wH72lJAjNoAAA UYjBpBbfiUSSh0JhqMxkrgAA dXchzkEmc0uJ2GebRcbo4gAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA rwL7Wvue1U+LfWUSgAPtNgAA 4 96yFA83H5EChlQllR5sP0wAA axZ+sHl4vUi5jHreSkzNPwAA prC88Lx1gkqIoy9qTxhPHwAA 41HKRPWjk0+6pPAK/jcHowAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA M7CIZQsJXEeblx2Ipkje0AAA 4 JdxlgiYmw0eI8vVpg2BVtQAA GXl2MoztZEOTHwwqENIOYAAA uXQihJMUAUWCCNbW82j+YgAA 3QKUzCoOVk6Ku3n7GFSkvwAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA +GEBArOLPEqymL4oULBCvAAA 4 rAPVsaf5EkapvbgZYmH9ygAA 77RYrjUD/0qiF8jnrEJQWAAA +qzhEkMol02RCGIPuGMKlwAA cp0Y7aElYEKxUCgxsVCQnwAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA cK5SiqWln0eI92YZYCJ0sgAA 4 GoBOmyz9GUi/DiTtTejhbwAA u76g3JGI6UOi0lIaJfojLgAA m3Xmy/9/d0azpPJLjiCkpQAA 6xrGjqhiukGRORkcYT26GQAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA I/4vBHENZUWFXKH6vkE+wAAA 4 2CU93BU6gU2yxqPsK1tB5AAA 4pGKQuf1CkyS7CzndbHsowAA Ycdmra0oakyqrwNJM762JQAA jRFJLPXCiUGWPshxBstp2QAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA VThpbDbMmUOiEaBOzpCVvAAA 4 7VFvJ0PAG0mUo/0O9nPp0gAA yblujSRPEk6q3RI1ryHwVwAA 0QWMlVjelEKr4s6aTAXlSgAA 0QUGKcOFxUG8lwzITbxk+wAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA Yn6sfnwJ2Eac+rykbdkx8wAA 4 +8rLEwyDr02DMGU04C6gqgAA iSOIr/K8jkmrBpxPNAuujAAA erFdDbglIkObs3Jv9Xbv2gAA W70aQsKjDkSvr/D3jC7V7QAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA nygNaq+9H0+Uiw/A1fFZ7wAA 4 swAx8sASFUmEr9rVJS36+wAA fTXqsdnAAUWyt/aoLXTa2gAA 7BCSgF8qdEqGyPF27INUlwAA uW0AyGNtEEWxmvSaj9XxjwAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA cfnnz90U80yu4E7Tyi/avAAA 4 WWhhlEbvtUep5PK/KXU0fQAA b4Ms4x/4EUOK6zqpOg3GpQAA u4Z7aYDSJkCAx8BsInnJMwAA yTJahfAcBUGuuuyfSyEDiwAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA wAJDfoR3o0ClnxN5tZ8dHQAA 4 SjDH4Z+NuUuPOgjXElgX3AAA Jh1HtqDYNU2zIO0VQjJCtgAA gM17kpdqQUWS01G2wXCbIAAA mCuYNSPE3EiaC6HdmwziDgAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA W57/KkqSAE2wmmFe8jsd2gAA 4 aW6orbPWPEe/MEjmQ8xG/QAA FuTo3edqokCf+NNsLAfT4wAA oihQ4Opy1k2D8azJ4CQJnwAA Tv9oa0MjS0Ocs8bO4QbuwgAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA DRyX6UzohEeMvO4FD6muxwAA 4 RA+hnKjjpkCrThBUsbGhDwAA YkzMdS6CVEe4/R6VzS9fvwAA RGGioweIu0qz+IsDVaE5cAAA ZjEl0xYFz0yX8teJKhZD6wAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA fjHY9P1hk0+7Rv/6LCP/VAAA 4 v12ZbI5/u0eGRmlXC0ZwaQAA bUtSFfKyr0yJVc2TJscIkgAA mWXh9DvbqUSXBkVEG7V1awAA /fxlXcYl5UWeyjUviu9gsgAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA PYDvYPs4L0C7N5bmhFJJZQAA 4 l3+HVMd/HEejPKcAgKAyKgAA l6lNSARD9UGBZ86ChA9VowAA TvGOhrBR4k6p2xgkZtTPsQAA O+y3wz8Gs0WKI42ZJHgb4AAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA qakWanfkV0+P2u+AvCDNlAAA 4 h+qiPuOvm0eHknhU75QIqQAA RwWrDoSNJU6beb+eDBCwvQAA e7u2A/Hs0Eyd63RFOvvU/gAA rwNVfMakNEGRMN8vS3qwOQAA 3jr/OALDWk2vvxELASNrvAAA G1e5ejXW9EWSWHgL0th8SQAA gMBYjIy6OUuu0RMTeFMFpQAA 4 C/OF1dgiYkGGZ+KJdAJQHAAA KIpEoBrW1EWJemlLLjZIuwAA m/uuUj1FEEKebGDAiEYF2AAA gh4b8FX97EeFmI041dMM7AAA ActivityGraph1 IKX9OnbHUkCCQB/szc3puAAA TOP lB9qGQms5EeryF1oqqz6pgAA 1 Beanfactory lB9qGQms5EeryF1oqqz6pgAA wqFOzie+uUSAZQyQPtZQPgAA 13 clMaroon $00B9FFFF 596 200 124 120 1 lkSolid clMaroon $00B9FFFF 12 612 244 113 33 BeanFactory clMaroon $00B9FFFF 548 84 237 77 1 lkSolid clMaroon $00B9FFFF 548 92 103 23 beanDefinitionMap: clMaroon $00B9FFFF 548 112 228 23 ConcurrentHashMap<String, BeanDefinition> clMaroon $00B9FFFF 548 132 85 23 key: beanName clMaroon $00B9FFFF 456 368 133 50 1 lkSolid clMaroon $00B9FFFF 460 368 115 23 beanDefinitionNames: clMaroon $00B9FFFF 460 388 97 23 ArrayList<String> clMaroon $00B9FFFF 700 368 201 61 1 lkSolid clMaroon $00B9FFFF 704 372 55 23 aliasMap: clMaroon $00B9FFFF 704 388 187 23 ConcurrentHashMap<String, String> clMaroon $00B9FFFF 704 404 121 23 key: alias, value: name context OB1ywkeJUU2zhj8yqaXuowAA 27 MessageSource nbVJ7vLDkUqPfq7ku+FxPAAA UH8ScWk4CEuw+p0JqVXGfQAA 17 clMaroon $00B9FFFF 444 44 390 85 sdkNone N0GyyWJ2P0+EfQhGk1OcUAAA 1 MessageSource <<interface>> False False N0GyyWJ2P0+EfQhGk1OcUAAA N0GyyWJ2P0+EfQhGk1OcUAAA clMaroon $00B9FFFF 356 172 118 46 sdkNone 0y8Zj3msL0+htXOAjlNa7gAA 1 ApplicationContext <<interface>> False False 0y8Zj3msL0+htXOAjlNa7gAA 0y8Zj3msL0+htXOAjlNa7gAA clMaroon $00B9FFFF 460,172;551,128 0Ocn0pEuqEi2aYQ3rlsIPwAA P5zEUbNQjUGAkByLIMWWrwAA tOEnNaHFUkie48iRtDEhgAAA False 1.5707963267949 15 0Ocn0pEuqEi2aYQ3rlsIPwAA False 1.5707963267949 30 0Ocn0pEuqEi2aYQ3rlsIPwAA False -1.5707963267949 15 0Ocn0pEuqEi2aYQ3rlsIPwAA clMaroon $00B9FFFF 687 172 258 72 sdkNone DSG78/UVM06M+X3qbPLI1gAA 1 HierarchicalMessageSource <<interface>> False False DSG78/UVM06M+X3qbPLI1gAA DSG78/UVM06M+X3qbPLI1gAA clMaroon $00B9FFFF 630 300 148 43 FekxXBbgOkSw/rezJuFNuQAA 3 AbstractMessageSource False False FekxXBbgOkSw/rezJuFNuQAA FekxXBbgOkSw/rezJuFNuQAA False FekxXBbgOkSw/rezJuFNuQAA clMaroon $00B9FFFF 480 388 235 43 oQSAhdZprUuJ4jy1NUjefgAA 3 AbstractResourceBasedMessageSource False False oQSAhdZprUuJ4jy1NUjefgAA oQSAhdZprUuJ4jy1NUjefgAA False oQSAhdZprUuJ4jy1NUjefgAA clMaroon $00B9FFFF 320 484 253 43 XdacIQrrDk+sMUYcwmGtdwAA 1 ReloadableResourceBundleMessageSource False False XdacIQrrDk+sMUYcwmGtdwAA XdacIQrrDk+sMUYcwmGtdwAA False XdacIQrrDk+sMUYcwmGtdwAA clMaroon $00B9FFFF 640 484 190 43 s+J6UF9WGEu8/4EQz/82JgAA 1 ResourceBundleMessageSource False False s+J6UF9WGEu8/4EQz/82JgAA s+J6UF9WGEu8/4EQz/82JgAA False s+J6UF9WGEu8/4EQz/82JgAA clMaroon $00B9FFFF 784 388 132 43 eOZB4CaViUaWt4Fag3FznwAA 1 StaticMessageSource False False eOZB4CaViUaWt4Fag3FznwAA eOZB4CaViUaWt4Fag3FznwAA False eOZB4CaViUaWt4Fag3FznwAA clMaroon $00B9FFFF 764,172;700,128 MrF4o3QD60awdIPXXMRJFgAA P5zEUbNQjUGAkByLIMWWrwAA jCWpb1cIBkCtHVt9LYdr+wAA False 1.5707963267949 15 MrF4o3QD60awdIPXXMRJFgAA False 1.5707963267949 30 MrF4o3QD60awdIPXXMRJFgAA False -1.5707963267949 15 MrF4o3QD60awdIPXXMRJFgAA clMaroon $00B9FFFF 724,300;780,243 F8UGr8IQTEWGA69tMYN7RQAA jCWpb1cIBkCtHVt9LYdr+wAA 74hJgviwvkqYapWaZp0TKQAA False 1.5707963267949 15 F8UGr8IQTEWGA69tMYN7RQAA False 1.5707963267949 30 F8UGr8IQTEWGA69tMYN7RQAA False -1.5707963267949 15 F8UGr8IQTEWGA69tMYN7RQAA clMaroon $00B9FFFF 622,388;678,342 LOhY6ybYhEitJn+IVt2vGwAA 74hJgviwvkqYapWaZp0TKQAA ZB2x0kRIHUeqsrXWOuFY0gAA False 1.5707963267949 15 LOhY6ybYhEitJn+IVt2vGwAA False 1.5707963267949 30 LOhY6ybYhEitJn+IVt2vGwAA False -1.5707963267949 15 LOhY6ybYhEitJn+IVt2vGwAA clMaroon $00B9FFFF 814,388;738,342 HpWR0LY+eEydhp8C8FOpQAAA 74hJgviwvkqYapWaZp0TKQAA H/bA7qrGF0G7ufP17NMATAAA False 1.5707963267949 15 HpWR0LY+eEydhp8C8FOpQAAA False 1.5707963267949 30 HpWR0LY+eEydhp8C8FOpQAAA False -1.5707963267949 15 HpWR0LY+eEydhp8C8FOpQAAA clMaroon $00B9FFFF 479,484;564,430 koXHm+IC50eDcSO0u98zoQAA ZB2x0kRIHUeqsrXWOuFY0gAA 7WOaPLVDskeg/hUE4XqEYQAA False 1.5707963267949 15 koXHm+IC50eDcSO0u98zoQAA False 1.5707963267949 30 koXHm+IC50eDcSO0u98zoQAA False -1.5707963267949 15 koXHm+IC50eDcSO0u98zoQAA clMaroon $00B9FFFF 704,484;627,430 toitlf7TLEqeedacAM8I3wAA ZB2x0kRIHUeqsrXWOuFY0gAA fL/pwY/A1EK4udFQBuI4eAAA False 1.5707963267949 15 toitlf7TLEqeedacAM8I3wAA False 1.5707963267949 30 toitlf7TLEqeedacAM8I3wAA False -1.5707963267949 15 toitlf7TLEqeedacAM8I3wAA clMaroon $00B9FFFF 880 300 160 43 x2yGQa1uNUqSR4mVUxOWnAAA 1 DelegatingMessageSource False False x2yGQa1uNUqSR4mVUxOWnAAA x2yGQa1uNUqSR4mVUxOWnAAA False x2yGQa1uNUqSR4mVUxOWnAAA clMaroon $00B9FFFF 932,300;860,243 Jij7ik3mo0urWW7HUWPdXgAA jCWpb1cIBkCtHVt9LYdr+wAA LkshCXYJW0+5jV4ZKto5fAAA False 1.5707963267949 15 Jij7ik3mo0urWW7HUWPdXgAA False 1.5707963267949 30 Jij7ik3mo0urWW7HUWPdXgAA False -1.5707963267949 15 Jij7ik3mo0urWW7HUWPdXgAA EventObject nbVJ7vLDkUqPfq7ku+FxPAAA B+R4GV+Rq06wGXXkVItfIgAA 15 clMaroon $00B9FFFF 608 48 80 56 XoegHkPPlU2b3omMBVA+1wAA 1 EventObject False False XoegHkPPlU2b3omMBVA+1wAA XoegHkPPlU2b3omMBVA+1wAA False XoegHkPPlU2b3omMBVA+1wAA clMaroon $00B9FFFF 596 144 105 56 TWUnzp936E2mO+5RtbUpzAAA 3 ApplicationEvent False False TWUnzp936E2mO+5RtbUpzAAA TWUnzp936E2mO+5RtbUpzAAA False TWUnzp936E2mO+5RtbUpzAAA clMaroon $00B9FFFF 688 236 150 56 ubulBBsBxEy4iQKNCsPNAwAA 3 ApplicationContextEvent False False ubulBBsBxEy4iQKNCsPNAwAA ubulBBsBxEy4iQKNCsPNAwAA False ubulBBsBxEy4iQKNCsPNAwAA clMaroon $00B9FFFF 468 236 150 56 0qZp6aJp7E6Olj7ITfl/SAAA 1 PayloadApplicationEvent False False 0qZp6aJp7E6Olj7ITfl/SAAA 0qZp6aJp7E6Olj7ITfl/SAAA False 0qZp6aJp7E6Olj7ITfl/SAAA clMaroon $00B9FFFF 432 332 124 43 5gePSHxIvUqh4Vq+53wX+QAA 1 ContextClosedEvent False False 5gePSHxIvUqh4Vq+53wX+QAA 5gePSHxIvUqh4Vq+53wX+QAA False 5gePSHxIvUqh4Vq+53wX+QAA clMaroon $00B9FFFF 589 332 145 43 pf4bpK9lxU6eU/krI/EwCgAA 1 ContextRefreshedEvent False False pf4bpK9lxU6eU/krI/EwCgAA pf4bpK9lxU6eU/krI/EwCgAA False pf4bpK9lxU6eU/krI/EwCgAA clMaroon $00B9FFFF 767 332 130 43 39kdtADnc02+bKtGZ/CHsAAA 1 ContextStartedEvent False False 39kdtADnc02+bKtGZ/CHsAAA 39kdtADnc02+bKtGZ/CHsAAA False 39kdtADnc02+bKtGZ/CHsAAA clMaroon $00B9FFFF 930 332 134 43 wSXBI2S1qUa3oFXPfNADHwAA 1 ContextStoppedEvent False False wSXBI2S1qUa3oFXPfNADHwAA wSXBI2S1qUa3oFXPfNADHwAA False wSXBI2S1qUa3oFXPfNADHwAA clMaroon $00B9FFFF 648,144;647,103 gjwIYiPr1EaMhTCS7BZUDwAA qixyM59J202ahpTjlo2iBwAA Q1JMU1sBYk6PfVyrGcXPkgAA False 1.5707963267949 15 gjwIYiPr1EaMhTCS7BZUDwAA False 1.5707963267949 30 gjwIYiPr1EaMhTCS7BZUDwAA False -1.5707963267949 15 gjwIYiPr1EaMhTCS7BZUDwAA clMaroon $00B9FFFF 573,236;616,199 +c42xBJ4M0WMWIBIEi27bgAA Q1JMU1sBYk6PfVyrGcXPkgAA xAJDNKnHMEuwzkklW5BssgAA False 1.5707963267949 15 +c42xBJ4M0WMWIBIEi27bgAA False 1.5707963267949 30 +c42xBJ4M0WMWIBIEi27bgAA False -1.5707963267949 15 +c42xBJ4M0WMWIBIEi27bgAA clMaroon $00B9FFFF 729,236;683,199 eu26nX3pWkS6xF4fY+DQggAA Q1JMU1sBYk6PfVyrGcXPkgAA WhppwMSqCU69QB2sQKgKtgAA False 1.5707963267949 15 eu26nX3pWkS6xF4fY+DQggAA False 1.5707963267949 30 eu26nX3pWkS6xF4fY+DQggAA False -1.5707963267949 15 eu26nX3pWkS6xF4fY+DQggAA clMaroon $00B9FFFF 555,332;688,288 QtF1NmQKMUajA5nD3Fvp1AAA WhppwMSqCU69QB2sQKgKtgAA 9yuSkmGuqEqm4Z/Nmvva5AAA False 1.5707963267949 15 QtF1NmQKMUajA5nD3Fvp1AAA False 1.5707963267949 30 QtF1NmQKMUajA5nD3Fvp1AAA False -1.5707963267949 15 QtF1NmQKMUajA5nD3Fvp1AAA clMaroon $00B9FFFF 685,332;731,291 2IBrvtmIsU6OWCo2eklZCwAA WhppwMSqCU69QB2sQKgKtgAA 5bUbEVcMQESU9rv6m3Kf5gAA False 1.5707963267949 15 2IBrvtmIsU6OWCo2eklZCwAA False 1.5707963267949 30 2IBrvtmIsU6OWCo2eklZCwAA False -1.5707963267949 15 2IBrvtmIsU6OWCo2eklZCwAA clMaroon $00B9FFFF 815,332;784,291 KihW0Xh5w0CtXl7pfSLFjAAA WhppwMSqCU69QB2sQKgKtgAA /Tf9C4RySUauLCNCWiIsrAAA False 1.5707963267949 15 KihW0Xh5w0CtXl7pfSLFjAAA False 1.5707963267949 30 KihW0Xh5w0CtXl7pfSLFjAAA False -1.5707963267949 15 KihW0Xh5w0CtXl7pfSLFjAAA clMaroon $00B9FFFF 941,332;835,291 2vzF0I8epEWJke/b1mQrvwAA WhppwMSqCU69QB2sQKgKtgAA FKAnZfqoPUGKwWWz1BWHvwAA False 1.5707963267949 15 2vzF0I8epEWJke/b1mQrvwAA False 1.5707963267949 30 2vzF0I8epEWJke/b1mQrvwAA False -1.5707963267949 15 2vzF0I8epEWJke/b1mQrvwAA ApplicationEventPublisher nbVJ7vLDkUqPfq7ku+FxPAAA nz2AaPugz0K8xDNgZsvXHAAA 3 clMaroon $00B9FFFF 595 60 198 72 sdkNone le+bpZa5rUGqpmoiG0RftAAA 1 ApplicationEventPublisher <<interface>> False False le+bpZa5rUGqpmoiG0RftAAA le+bpZa5rUGqpmoiG0RftAAA clMaroon $00B9FFFF 635 180 118 45 sdkNone 0y8Zj3msL0+htXOAjlNa7gAA 1 ApplicationContext <<interface>> False False 0y8Zj3msL0+htXOAjlNa7gAA False 0y8Zj3msL0+htXOAjlNa7gAA clMaroon $00B9FFFF 693,180;693,131 OGrXT3XG+kanO2I1fck1wQAA GuLBC/dL2E6Ue5171eUfoQAA vEPXSD5tf0up5bqmfTh3PQAA False 1.5707963267949 15 OGrXT3XG+kanO2I1fck1wQAA False 1.5707963267949 30 OGrXT3XG+kanO2I1fck1wQAA False -1.5707963267949 15 OGrXT3XG+kanO2I1fck1wQAA ApplicationEventMulticaster nbVJ7vLDkUqPfq7ku+FxPAAA bS+gJ2DiPUu+y8wrMcCXkwAA 5 clMaroon $00B9FFFF 516 68 345 137 sdkNone vNk/lP0usEmXuXiziw6gsgAA 1 ApplicationEventMulticaster <<interface>> False False vNk/lP0usEmXuXiziw6gsgAA vNk/lP0usEmXuXiziw6gsgAA clMaroon $00B9FFFF 578 259 218 43 1whQCQJugUSX74p1mPhNTQAA 3 AbstractApplicationEventMulticaster False False 1whQCQJugUSX74p1mPhNTQAA 1whQCQJugUSX74p1mPhNTQAA False 1whQCQJugUSX74p1mPhNTQAA clMaroon $00B9FFFF 584 356 207 43 ERUb/gBJcka7rpIMPllLZQAA 1 SimpleApplicationEventMulticaster False False ERUb/gBJcka7rpIMPllLZQAA ERUb/gBJcka7rpIMPllLZQAA False ERUb/gBJcka7rpIMPllLZQAA clMaroon $00B9FFFF 686,259;687,204 /5yITSQGI0KgAWIAH0ku4gAA 53VAFtHED0WQGcVb3xJ61gAA Vxk3+fx4DkyeA2MTbzOeSAAA False 1.5707963267949 15 /5yITSQGI0KgAWIAH0ku4gAA False 1.5707963267949 30 /5yITSQGI0KgAWIAH0ku4gAA False -1.5707963267949 15 /5yITSQGI0KgAWIAH0ku4gAA clMaroon $00B9FFFF 687,356;686,301 3sthH3dxpEa70/weoKRZXwAA Vxk3+fx4DkyeA2MTbzOeSAAA 2WI2IOAUuEKB9PPpQnFVNAAA False 1.5707963267949 15 3sthH3dxpEa70/weoKRZXwAA False 1.5707963267949 30 3sthH3dxpEa70/weoKRZXwAA False -1.5707963267949 15 3sthH3dxpEa70/weoKRZXwAA EventListener nbVJ7vLDkUqPfq7ku+FxPAAA 7LjT/edFKU2TZmaLfcpNYQAA 20 clMaroon $00B9FFFF 628 52 88 45 sdkNone HotHSCEJJUacPbS+UF8aIgAA 1 EventListener <<interface>> False False HotHSCEJJUacPbS+UF8aIgAA False HotHSCEJJUacPbS+UF8aIgAA clMaroon $00B9FFFF 595 140 155 59 sdkNone w/QeTfObKUW+Wlags0GOSQAA 1 ApplicationListener <<interface>> False False w/QeTfObKUW+Wlags0GOSQAA w/QeTfObKUW+Wlags0GOSQAA clMaroon $00B9FFFF 192 244 240 43 tWn7n0oxwEe2T+UlWS95LQAA 1 ScheduledAnnotationBeanPostProcessor False False tWn7n0oxwEe2T+UlWS95LQAA tWn7n0oxwEe2T+UlWS95LQAA False tWn7n0oxwEe2T+UlWS95LQAA clMaroon $00B9FFFF 499 244 346 72 sdkNone xN4XVzYq4ka9cv/+dtYsiAAA 1 SmartApplicationListener <<interface>> False False xN4XVzYq4ka9cv/+dtYsiAAA xN4XVzYq4ka9cv/+dtYsiAAA clMaroon $00B9FFFF 816 144 86 59 sdkNone NHtPpn7SE0WAntXGhegIOAAA 1 Ordered <<interface>> False False NHtPpn7SE0WAntXGhegIOAAA NHtPpn7SE0WAntXGhegIOAAA clMaroon $00B9FFFF 672,140;671,96 nc8ietuWcUmASxhTcizVeQAA 6fDfE2r2gkevPsFAyFe0twAA 8wRejbmt7kSfF9OXF7IPHgAA False 1.5707963267949 15 nc8ietuWcUmASxhTcizVeQAA False 1.5707963267949 30 nc8ietuWcUmASxhTcizVeQAA False -1.5707963267949 15 nc8ietuWcUmASxhTcizVeQAA clMaroon $00B9FFFF 390,244;595,189 DWNbcOr6dEKHwD0OnJ9j8QAA 8wRejbmt7kSfF9OXF7IPHgAA +U50EPMznUGRc1WfLNM0wgAA False 1.5707963267949 15 DWNbcOr6dEKHwD0OnJ9j8QAA False 1.5707963267949 30 DWNbcOr6dEKHwD0OnJ9j8QAA False -1.5707963267949 15 DWNbcOr6dEKHwD0OnJ9j8QAA clMaroon $00B9FFFF 671,244;672,198 cJjOdws0HUOsM+qWTSmXsAAA 8wRejbmt7kSfF9OXF7IPHgAA g408tfbKHUCu1gTqL1ki7AAA False 1.5707963267949 15 cJjOdws0HUOsM+qWTSmXsAAA False 1.5707963267949 30 cJjOdws0HUOsM+qWTSmXsAAA False -1.5707963267949 15 cJjOdws0HUOsM+qWTSmXsAAA clMaroon $00B9FFFF 733,244;816,197 mgKVKSSLwk2Gv/ARJsU3QAAA 4RS2Jb6YpkaNlVcoCLN2GQAA g408tfbKHUCu1gTqL1ki7AAA False 1.5707963267949 15 mgKVKSSLwk2Gv/ARJsU3QAAA False 1.5707963267949 30 mgKVKSSLwk2Gv/ARJsU3QAAA False -1.5707963267949 15 mgKVKSSLwk2Gv/ARJsU3QAAA clMaroon $00B9FFFF 568 368 208 43 JZp+EhwlfEGcn9ncMFKvYwAA 1 GenericApplicationListenerAdapter False False JZp+EhwlfEGcn9ncMFKvYwAA JZp+EhwlfEGcn9ncMFKvYwAA False JZp+EhwlfEGcn9ncMFKvYwAA clMaroon $00B9FFFF 828 368 141 43 0KNeCXSfQ0Osy6GR/ehiRAAA 1 SourceFilteringListener False False 0KNeCXSfQ0Osy6GR/ehiRAAA 0KNeCXSfQ0Osy6GR/ehiRAAA False 0KNeCXSfQ0Osy6GR/ehiRAAA clMaroon $00B9FFFF 916 244 259 72 sdkNone Zva4WgoxnUqOemuu2LywAAAA 1 GenericApplicationListener <<interface>> False False Zva4WgoxnUqOemuu2LywAAAA Zva4WgoxnUqOemuu2LywAAAA clMaroon $00B9FFFF 916,252;800,228;735,198 SQejy3/yUUqZbazigarrEAAA 8wRejbmt7kSfF9OXF7IPHgAA kFo4HPe0JU62ay2VQQlaUgAA False 1.5707963267949 15 SQejy3/yUUqZbazigarrEAAA False 1.5707963267949 30 SQejy3/yUUqZbazigarrEAAA False -1.5707963267949 15 SQejy3/yUUqZbazigarrEAAA clMaroon $00B9FFFF 983,244;901,197 MR4TSK+hNUO1g1iReeWv8AAA 4RS2Jb6YpkaNlVcoCLN2GQAA kFo4HPe0JU62ay2VQQlaUgAA False 1.5707963267949 15 MR4TSK+hNUO1g1iReeWv8AAA False 1.5707963267949 30 MR4TSK+hNUO1g1iReeWv8AAA False -1.5707963267949 15 MR4TSK+hNUO1g1iReeWv8AAA clMaroon $00B9FFFF 671,368;671,315 60rB+MFsMkyOzT7Foaj1FQAA g408tfbKHUCu1gTqL1ki7AAA iBpyFD4S3Ui0qmkLjspCMgAA False 1.5707963267949 15 60rB+MFsMkyOzT7Foaj1FQAA False 1.5707963267949 30 60rB+MFsMkyOzT7Foaj1FQAA False -1.5707963267949 15 60rB+MFsMkyOzT7Foaj1FQAA clMaroon $00B9FFFF 855,368;745,315 ClhHPSGdyUK9xYmZoBZ09QAA g408tfbKHUCu1gTqL1ki7AAA TP72j2XuzUagWOPiZOZeXwAA False 1.5707963267949 15 ClhHPSGdyUK9xYmZoBZ09QAA False 1.5707963267949 30 ClhHPSGdyUK9xYmZoBZ09QAA False -1.5707963267949 15 ClhHPSGdyUK9xYmZoBZ09QAA clMaroon $00B9FFFF 742,368;922,315 cXeIcb5PG0ynAKPWP69+UwAA kFo4HPe0JU62ay2VQQlaUgAA iBpyFD4S3Ui0qmkLjspCMgAA False 1.5707963267949 15 cXeIcb5PG0ynAKPWP69+UwAA False 1.5707963267949 30 cXeIcb5PG0ynAKPWP69+UwAA False -1.5707963267949 15 cXeIcb5PG0ynAKPWP69+UwAA clMaroon $00B9FFFF 926,368;997,315 GlHIHdQaYk2PNkgJ+1zlxQAA kFo4HPe0JU62ay2VQQlaUgAA TP72j2XuzUagWOPiZOZeXwAA False 1.5707963267949 15 GlHIHdQaYk2PNkgJ+1zlxQAA False 1.5707963267949 30 GlHIHdQaYk2PNkgJ+1zlxQAA False -1.5707963267949 15 GlHIHdQaYk2PNkgJ+1zlxQAA clMaroon $00B9FFFF 1024 368 208 43 85mgvVDsrEWg3MFCJBha/gAA 1 ApplicationListenerMethodAdapter False False 85mgvVDsrEWg3MFCJBha/gAA 85mgvVDsrEWg3MFCJBha/gAA False 85mgvVDsrEWg3MFCJBha/gAA clMaroon $00B9FFFF 1111,368;1072,315 hluULwluMEaTYUxIOH8XqAAA kFo4HPe0JU62ay2VQQlaUgAA 9uhcFxKyZE6Lv7fexlgerwAA False 1.5707963267949 15 hluULwluMEaTYUxIOH8XqAAA False 1.5707963267949 30 hluULwluMEaTYUxIOH8XqAAA False -1.5707963267949 15 hluULwluMEaTYUxIOH8XqAAA Comparator nbVJ7vLDkUqPfq7ku+FxPAAA 2kQUrLXedk+7XKjldJviZQAA 5 clMaroon $00B9FFFF 650 60 85 45 sdkNone 8R1GK9Gcl0aN/Uu/04nQcgAA 1 Comparator <<interface>> False False 8R1GK9Gcl0aN/Uu/04nQcgAA False 8R1GK9Gcl0aN/Uu/04nQcgAA clMaroon $00B9FFFF 637 163 110 43 RhhDhWIZW02tdUHFSm2UXAAA 1 OrderComparator False False RhhDhWIZW02tdUHFSm2UXAAA RhhDhWIZW02tdUHFSm2UXAAA False RhhDhWIZW02tdUHFSm2UXAAA clMaroon $00B9FFFF 588 264 209 43 wf+tR6l62U+LaSOYUtlp2QAA 1 AnnotationAwareOrderComparator False False wf+tR6l62U+LaSOYUtlp2QAA wf+tR6l62U+LaSOYUtlp2QAA False wf+tR6l62U+LaSOYUtlp2QAA clMaroon $00B9FFFF 691,163;692,104 Rs534Ei6Y0ufoFO5kFgqLAAA SjcDrTce7UG7zqF30ytmmQAA 5QM/H32UM0uekEy0CBgJ/wAA False 1.5707963267949 15 Rs534Ei6Y0ufoFO5kFgqLAAA False 1.5707963267949 30 Rs534Ei6Y0ufoFO5kFgqLAAA False -1.5707963267949 15 Rs534Ei6Y0ufoFO5kFgqLAAA clMaroon $00B9FFFF 692,264;691,205 hvmgBsiqOUKGO/o0tZ8zSQAA 5QM/H32UM0uekEy0CBgJ/wAA +qbRdms6wUegWHjwYbylkwAA False 1.5707963267949 15 hvmgBsiqOUKGO/o0tZ8zSQAA False 1.5707963267949 30 hvmgBsiqOUKGO/o0tZ8zSQAA False -1.5707963267949 15 hvmgBsiqOUKGO/o0tZ8zSQAA ContextAnnotationAutowireCandidateResolver nbVJ7vLDkUqPfq7ku+FxPAAA 8OaMeRbbakWXL8b4oOid4AAA 9 clMaroon $00B9FFFF 296 72 449 85 sdkNone fqgr8TXsT0G1c092OaWqDAAA 1 AutowireCandidateResolver <<interface>> False False fqgr8TXsT0G1c092OaWqDAAA fqgr8TXsT0G1c092OaWqDAAA clMaroon $00B9FFFF 824 72 227 59 sdkNone OFapkoq+jkSh9RkSxTL/PgAA 1 BeanFactoryAware <<interface>> False False OFapkoq+jkSh9RkSxTL/PgAA OFapkoq+jkSh9RkSxTL/PgAA clMaroon $00B9FFFF 613 224 275 43 9FAvnokqj0GCHVaBH4lOvgAA 1 GenericTypeAwareAutowireCandidateResolver False False 9FAvnokqj0GCHVaBH4lOvgAA 9FAvnokqj0GCHVaBH4lOvgAA False 9FAvnokqj0GCHVaBH4lOvgAA clMaroon $00B9FFFF 713,224;594,156 K7E/QmKriEGL+e1cNAaRTAAA Dz8xuputi0qXQYcC/YyEeAAA 3BiCHRULuEyymYdEYA3iUQAA False 1.5707963267949 15 K7E/QmKriEGL+e1cNAaRTAAA False 1.5707963267949 30 K7E/QmKriEGL+e1cNAaRTAAA False -1.5707963267949 15 K7E/QmKriEGL+e1cNAaRTAAA clMaroon $00B9FFFF 777,224;899,130 sPfw+0rAdkCdbssoqEI/fgAA AIzJNx/aDEKWKj4dT+9mUwAA 3BiCHRULuEyymYdEYA3iUQAA False 1.5707963267949 15 sPfw+0rAdkCdbssoqEI/fgAA False 1.5707963267949 30 sPfw+0rAdkCdbssoqEI/fgAA False -1.5707963267949 15 sPfw+0rAdkCdbssoqEI/fgAA clMaroon $00B9FFFF 611 316 278 43 mfq7XBl4SEaL0Sgnpar80wAA 1 QualifierAnnotationAutowireCandidateResolver False False mfq7XBl4SEaL0Sgnpar80wAA mfq7XBl4SEaL0Sgnpar80wAA False mfq7XBl4SEaL0Sgnpar80wAA clMaroon $00B9FFFF 612 404 276 43 vvvN8Rafg0STpoHNZxRmNQAA 1 ContextAnnotationAutowireCandidateResolver False False vvvN8Rafg0STpoHNZxRmNQAA vvvN8Rafg0STpoHNZxRmNQAA False vvvN8Rafg0STpoHNZxRmNQAA clMaroon $00B9FFFF 749,316;750,266 udr6TFpdtE6pV0bsMJgoRgAA 3BiCHRULuEyymYdEYA3iUQAA +lqBr0ITm0SjYS2wqHsiEAAA False 1.5707963267949 15 udr6TFpdtE6pV0bsMJgoRgAA False 1.5707963267949 30 udr6TFpdtE6pV0bsMJgoRgAA False -1.5707963267949 15 udr6TFpdtE6pV0bsMJgoRgAA clMaroon $00B9FFFF 749,404;749,358 j7OZ/FjehEyO0ZZDapJlfwAA +lqBr0ITm0SjYS2wqHsiEAAA II/xUxZqbEqqkFrlTyaCfwAA False 1.5707963267949 15 j7OZ/FjehEyO0ZZDapJlfwAA False 1.5707963267949 30 j7OZ/FjehEyO0ZZDapJlfwAA False -1.5707963267949 15 j7OZ/FjehEyO0ZZDapJlfwAA ConfigurationClassPostProcessor nbVJ7vLDkUqPfq7ku+FxPAAA JqV7HDWU/k2IqdFT1M2MdQAA 13 clMaroon $00B9FFFF 596 56 367 59 sdkNone hm4UBSP8KkupBZYdml93SAAA 1 BeanFactoryPostProcessor <<interface>> False False hm4UBSP8KkupBZYdml93SAAA hm4UBSP8KkupBZYdml93SAAA clMaroon $00B9FFFF 608 172 342 59 sdkNone cED84zSD3ESwlIInt3I6QAAA 1 BeanDefinitionRegistryPostProcessor <<interface>> False False cED84zSD3ESwlIInt3I6QAAA cED84zSD3ESwlIInt3I6QAAA clMaroon $00B9FFFF 681 304 196 43 vhLv3MHqVUaEMUMc32ZxowAA 1 ConfigurationClassPostProcessor False False vhLv3MHqVUaEMUMc32ZxowAA vhLv3MHqVUaEMUMc32ZxowAA False vhLv3MHqVUaEMUMc32ZxowAA clMaroon $00B9FFFF 260 172 98 45 sdkNone n6D/sAuOQUeQrhIM2F2uDQAA 1 PriorityOrdered <<interface>> False False n6D/sAuOQUeQrhIM2F2uDQAA False n6D/sAuOQUeQrhIM2F2uDQAA clMaroon $00B9FFFF 410 172 138 45 sdkNone ekgd4T/W6ESRZ+Psi8hoSAAA 1 ResourceLoaderAware <<interface>> False False ekgd4T/W6ESRZ+Psi8hoSAAA False ekgd4T/W6ESRZ+Psi8hoSAAA clMaroon $00B9FFFF 994 172 142 45 sdkNone vKy1CmQQ2kiao5Z+XZsFhQAA 1 BeanClassLoaderAware <<interface>> False False vKy1CmQQ2kiao5Z+XZsFhQAA False vKy1CmQQ2kiao5Z+XZsFhQAA clMaroon $00B9FFFF 1188 172 118 45 sdkNone 5sEi98Ciz0K3X2G7qyR3fQAA 1 EnvironmentAware <<interface>> False False 5sEi98Ciz0K3X2G7qyR3fQAA False 5sEi98Ciz0K3X2G7qyR3fQAA clMaroon $00B9FFFF 778,172;779,114 70iqEhIIO0y5F+aHVkWikwAA Skr81USBU0ushsL2sxBBqQAA wRN6iZCwG0Whj3iPGvOwEQAA False 1.5707963267949 15 70iqEhIIO0y5F+aHVkWikwAA False 1.5707963267949 30 70iqEhIIO0y5F+aHVkWikwAA False -1.5707963267949 15 70iqEhIIO0y5F+aHVkWikwAA clMaroon $00B9FFFF 703,304;357,208 QvpxKThYBU+50Ti94+VR6QAA WT17BQDsiUix5KU9KL7+igAA +93LoKH2zk20vcVU4AiZmAAA False 1.5707963267949 15 QvpxKThYBU+50Ti94+VR6QAA False 1.5707963267949 30 QvpxKThYBU+50Ti94+VR6QAA False -1.5707963267949 15 QvpxKThYBU+50Ti94+VR6QAA clMaroon $00B9FFFF 730,304;528,216 zea8Zdx6UU2aY8sk2CaLXwAA l4EC0QoB3kusBOG/tF3mmwAA +93LoKH2zk20vcVU4AiZmAAA False 1.5707963267949 15 zea8Zdx6UU2aY8sk2CaLXwAA False 1.5707963267949 30 zea8Zdx6UU2aY8sk2CaLXwAA False -1.5707963267949 15 zea8Zdx6UU2aY8sk2CaLXwAA clMaroon $00B9FFFF 778,304;778,230 dOe7asSNQkalXnnMsOZ+ygAA wRN6iZCwG0Whj3iPGvOwEQAA +93LoKH2zk20vcVU4AiZmAAA False 1.5707963267949 15 dOe7asSNQkalXnnMsOZ+ygAA False 1.5707963267949 30 dOe7asSNQkalXnnMsOZ+ygAA False -1.5707963267949 15 dOe7asSNQkalXnnMsOZ+ygAA clMaroon $00B9FFFF 824,304;1016,216 AYe6NPxxfEiJnquhUonwUQAA bT+pVRzty0GYSd3A+SdiAgAA +93LoKH2zk20vcVU4AiZmAAA False 1.5707963267949 15 AYe6NPxxfEiJnquhUonwUQAA False 1.5707963267949 30 AYe6NPxxfEiJnquhUonwUQAA False -1.5707963267949 15 AYe6NPxxfEiJnquhUonwUQAA clMaroon $00B9FFFF 853,304;1188,210 MovSxvWNg0edfJpKAit6DwAA qfjSBATVGkiMMVVQJqiGhAAA +93LoKH2zk20vcVU4AiZmAAA False 1.5707963267949 15 MovSxvWNg0edfJpKAit6DwAA False 1.5707963267949 30 MovSxvWNg0edfJpKAit6DwAA False -1.5707963267949 15 MovSxvWNg0edfJpKAit6DwAA AutowiredAnnotationBeanPostProcessor nbVJ7vLDkUqPfq7ku+FxPAAA Ztao/R6YREycYNBIDiqWlQAA 15 clMaroon $00B9FFFF 633 64 321 72 sdkNone NHfbNf3mHU+CjGOsJ9aPNgAA 1 BeanPostProcessor <<interface>> False False NHfbNf3mHU+CjGOsJ9aPNgAA NHfbNf3mHU+CjGOsJ9aPNgAA clMaroon $00B9FFFF 528 179 531 85 sdkNone nsNQQ6H+jUWE6LyvFPLCZAAA 1 InstantiationAwareBeanPostProcessor <<interface>> False False nsNQQ6H+jUWE6LyvFPLCZAAA nsNQQ6H+jUWE6LyvFPLCZAAA clMaroon $00B9FFFF 607 307 372 85 sdkNone +1xBffipnEeFBAbSFjHSyAAA 1 SmartInstantiationAwareBeanPostProcessor <<interface>> False False +1xBffipnEeFBAbSFjHSyAAA +1xBffipnEeFBAbSFjHSyAAA clMaroon $00B9FFFF 656 420 275 43 qXv615KzP0KWTRYGCEaRSgAA 3 InstantiationAwareBeanPostProcessorAdapter False False qXv615KzP0KWTRYGCEaRSgAA qXv615KzP0KWTRYGCEaRSgAA False qXv615KzP0KWTRYGCEaRSgAA clMaroon $00B9FFFF 673 521 240 43 3wXlQWDgCEeLfcOTDPmrKgAA 1 AutowiredAnnotationBeanPostProcessor False False 3wXlQWDgCEeLfcOTDPmrKgAA 3wXlQWDgCEeLfcOTDPmrKgAA False 3wXlQWDgCEeLfcOTDPmrKgAA clMaroon $00B9FFFF 380 420 216 45 sdkNone aBPMwZ4GK0+UrI9USXvsPAAA 1 MergedBeanDefinitionPostProcessor <<interface>> False False aBPMwZ4GK0+UrI9USXvsPAAA False aBPMwZ4GK0+UrI9USXvsPAAA clMaroon $00B9FFFF 995 420 98 45 sdkNone n6D/sAuOQUeQrhIM2F2uDQAA 1 PriorityOrdered <<interface>> False False n6D/sAuOQUeQrhIM2F2uDQAA False n6D/sAuOQUeQrhIM2F2uDQAA clMaroon $00B9FFFF 1158 420 117 45 sdkNone OFapkoq+jkSh9RkSxTL/PgAA 1 BeanFactoryAware <<interface>> False False OFapkoq+jkSh9RkSxTL/PgAA False OFapkoq+jkSh9RkSxTL/PgAA clMaroon $00B9FFFF 793,179;793,135 yNBto9OxuUK9Z40x3JHmJgAA N0pc9DfhkUqklJc9vcuu5AAA PFLRkyS030OxI/RC5vytJQAA False 1.5707963267949 15 yNBto9OxuUK9Z40x3JHmJgAA False 1.5707963267949 30 yNBto9OxuUK9Z40x3JHmJgAA False -1.5707963267949 15 yNBto9OxuUK9Z40x3JHmJgAA clMaroon $00B9FFFF 792,307;793,263 LrvnsCziNEyPa63SiKqVXwAA PFLRkyS030OxI/RC5vytJQAA MOXNexsjRECENkA6s/2U+gAA False 1.5707963267949 15 LrvnsCziNEyPa63SiKqVXwAA False 1.5707963267949 30 LrvnsCziNEyPa63SiKqVXwAA False -1.5707963267949 15 LrvnsCziNEyPa63SiKqVXwAA clMaroon $00B9FFFF 793,420;793,391 qs5gkxe5OUCyhLpc4xaoUwAA MOXNexsjRECENkA6s/2U+gAA vNyfu3vO50iIFlAHuRlumAAA False 1.5707963267949 15 qs5gkxe5OUCyhLpc4xaoUwAA False 1.5707963267949 30 qs5gkxe5OUCyhLpc4xaoUwAA False -1.5707963267949 15 qs5gkxe5OUCyhLpc4xaoUwAA clMaroon $00B9FFFF 792,521;793,462 lsoNZEGvSkSbPxK9NvRb1QAA vNyfu3vO50iIFlAHuRlumAAA 289ADcZxaE636+TwrGA96gAA False 1.5707963267949 15 lsoNZEGvSkSbPxK9NvRb1QAA False 1.5707963267949 30 lsoNZEGvSkSbPxK9NvRb1QAA False -1.5707963267949 15 lsoNZEGvSkSbPxK9NvRb1QAA clMaroon $00B9FFFF 728,521;554,464 eZzs6kmpZUSFtFqKJ8GiigAA UxikAMap60a8RH+vjn0qsQAA 289ADcZxaE636+TwrGA96gAA False 1.5707963267949 15 eZzs6kmpZUSFtFqKJ8GiigAA False 1.5707963267949 30 eZzs6kmpZUSFtFqKJ8GiigAA False -1.5707963267949 15 eZzs6kmpZUSFtFqKJ8GiigAA clMaroon $00B9FFFF 845,521;995,461 G3HQxdWeUUO1vStDngZlUwAA SY1ABbfXy0KFu1HeK9NXzQAA 289ADcZxaE636+TwrGA96gAA False 1.5707963267949 15 G3HQxdWeUUO1vStDngZlUwAA False 1.5707963267949 30 G3HQxdWeUUO1vStDngZlUwAA False -1.5707963267949 15 G3HQxdWeUUO1vStDngZlUwAA clMaroon $00B9FFFF 881,521;1158,456 YOwCmAEwwk6j/BxRVT9UGQAA 0Xu7KudUckqsuJ3aHS7bpQAA 289ADcZxaE636+TwrGA96gAA False 1.5707963267949 15 YOwCmAEwwk6j/BxRVT9UGQAA False 1.5707963267949 30 YOwCmAEwwk6j/BxRVT9UGQAA False -1.5707963267949 15 YOwCmAEwwk6j/BxRVT9UGQAA CommonAnnotationBeanPostProcessor nbVJ7vLDkUqPfq7ku+FxPAAA rcoyP9F5SkWMwW3senai0QAA 14 clMaroon $00B9FFFF 424 144 319 72 sdkNone UGHrPpgeaEGc/UAM2oyduAAA 1 DestructionAwareBeanPostProcessor <<interface>> False False UGHrPpgeaEGc/UAM2oyduAAA UGHrPpgeaEGc/UAM2oyduAAA clMaroon $00B9FFFF 696 52 119 45 sdkNone NHfbNf3mHU+CjGOsJ9aPNgAA 1 BeanPostProcessor <<interface>> False False NHfbNf3mHU+CjGOsJ9aPNgAA False NHfbNf3mHU+CjGOsJ9aPNgAA clMaroon $00B9FFFF 789 144 216 45 sdkNone aBPMwZ4GK0+UrI9USXvsPAAA 1 MergedBeanDefinitionPostProcessor <<interface>> False False aBPMwZ4GK0+UrI9USXvsPAAA False aBPMwZ4GK0+UrI9USXvsPAAA clMaroon $00B9FFFF 640,144;719,96 EjLsOOz/xUKcfVbyHnC03QAA 7nD5MjbdIUWvFDQCcH5bDQAA DmzMSFVMyUyRmP9L/BG2HAAA False 1.5707963267949 15 EjLsOOz/xUKcfVbyHnC03QAA False 1.5707963267949 30 EjLsOOz/xUKcfVbyHnC03QAA False -1.5707963267949 15 EjLsOOz/xUKcfVbyHnC03QAA clMaroon $00B9FFFF 862,144;789,96 FTWOqQQfBUC/o9aUUmDMjgAA 7nD5MjbdIUWvFDQCcH5bDQAA Tw1lkRunFUmkPcaK1w5hSwAA False 1.5707963267949 15 FTWOqQQfBUC/o9aUUmDMjgAA False 1.5707963267949 30 FTWOqQQfBUC/o9aUUmDMjgAA False -1.5707963267949 15 FTWOqQQfBUC/o9aUUmDMjgAA clMaroon $00B9FFFF 280 144 98 45 sdkNone n6D/sAuOQUeQrhIM2F2uDQAA 1 PriorityOrdered <<interface>> False False n6D/sAuOQUeQrhIM2F2uDQAA False n6D/sAuOQUeQrhIM2F2uDQAA clMaroon $00B9FFFF 1051 144 101 45 sdkNone huAwxPm1MkKY6HVKbN2aKgAA 1 Serializable <<interface>> False False huAwxPm1MkKY6HVKbN2aKgAA False huAwxPm1MkKY6HVKbN2aKgAA clMaroon $00B9FFFF 636 268 247 43 u2NwOmJzEU6bRhoniVGnBQAA 1 InitDestroyAnnotationBeanPostProcessor False False u2NwOmJzEU6bRhoniVGnBQAA u2NwOmJzEU6bRhoniVGnBQAA False u2NwOmJzEU6bRhoniVGnBQAA clMaroon $00B9FFFF 641,268;416,228;359,188 wxdFxnBy1US3MWeE4YfXxgAA fChnz4FPKkm3aeQULmu5+QAA /mjaW5nDY0iKnOA7Cw7R7gAA False 1.5707963267949 15 wxdFxnBy1US3MWeE4YfXxgAA False 1.5707963267949 30 wxdFxnBy1US3MWeE4YfXxgAA False -1.5707963267949 15 wxdFxnBy1US3MWeE4YfXxgAA clMaroon $00B9FFFF 725,268;640,215 HmAf/8WhxEKc4D7gZ8lsBwAA DmzMSFVMyUyRmP9L/BG2HAAA /mjaW5nDY0iKnOA7Cw7R7gAA False 1.5707963267949 15 HmAf/8WhxEKc4D7gZ8lsBwAA False 1.5707963267949 30 HmAf/8WhxEKc4D7gZ8lsBwAA False -1.5707963267949 15 HmAf/8WhxEKc4D7gZ8lsBwAA clMaroon $00B9FFFF 782,268;871,188 IcLyUbNi8UGJLPCIOmMg8wAA Tw1lkRunFUmkPcaK1w5hSwAA /mjaW5nDY0iKnOA7Cw7R7gAA False 1.5707963267949 15 IcLyUbNi8UGJLPCIOmMg8wAA False 1.5707963267949 30 IcLyUbNi8UGJLPCIOmMg8wAA False -1.5707963267949 15 IcLyUbNi8UGJLPCIOmMg8wAA clMaroon $00B9FFFF 817,268;1051,184 VnVpTTQOOkqqM/90A3e+JAAA roI48xhZxECVEqOzeR+bugAA /mjaW5nDY0iKnOA7Cw7R7gAA False 1.5707963267949 15 VnVpTTQOOkqqM/90A3e+JAAA False 1.5707963267949 30 VnVpTTQOOkqqM/90A3e+JAAA False -1.5707963267949 15 VnVpTTQOOkqqM/90A3e+JAAA clMaroon $00B9FFFF 643 360 232 43 VcpFHsTHhkaugHRaoerH7QAA 1 CommonAnnotationBeanPostProcessor False False VcpFHsTHhkaugHRaoerH7QAA VcpFHsTHhkaugHRaoerH7QAA False VcpFHsTHhkaugHRaoerH7QAA clMaroon $00B9FFFF 758,360;759,310 3EX6q5PsVkKKk5Rj3TUG8AAA /mjaW5nDY0iKnOA7Cw7R7gAA dKBgaeAjAkmulFk7+IkqUwAA False 1.5707963267949 15 3EX6q5PsVkKKk5Rj3TUG8AAA False 1.5707963267949 30 3EX6q5PsVkKKk5Rj3TUG8AAA False -1.5707963267949 15 3EX6q5PsVkKKk5Rj3TUG8AAA EventListenerMethodProcessor nbVJ7vLDkUqPfq7ku+FxPAAA kA8sYKBxlk6j6v0iMKqksAAA 5 clMaroon $00B9FFFF 348 100 158 59 sdkNone TH4kfK3NrEOtQztihKYPwgAA 1 SmartInitializingSingleton <<interface>> False False TH4kfK3NrEOtQztihKYPwgAA TH4kfK3NrEOtQztihKYPwgAA clMaroon $00B9FFFF 560 100 324 59 sdkNone 9ZbsQkm820qikDdd98CnzgAA 1 ApplicationContextAware <<interface>> False False 9ZbsQkm820qikDdd98CnzgAA 9ZbsQkm820qikDdd98CnzgAA clMaroon $00B9FFFF 444 220 187 43 /Bdfkv4KhkCOs6NzTEVj8wAA 1 EventListenerMethodProcessor False False /Bdfkv4KhkCOs6NzTEVj8wAA /Bdfkv4KhkCOs6NzTEVj8wAA False /Bdfkv4KhkCOs6NzTEVj8wAA clMaroon $00B9FFFF 516,220;455,158 3tLga58GH0yshSYrEFdnlgAA LyTsgB17iUyJjhRNmcsuhAAA e2E7rqjrv0qSkV9y4mCAQQAA False 1.5707963267949 15 3tLga58GH0yshSYrEFdnlgAA False 1.5707963267949 30 3tLga58GH0yshSYrEFdnlgAA False -1.5707963267949 15 3tLga58GH0yshSYrEFdnlgAA clMaroon $00B9FFFF 571,220;673,158 Gp7BOGiWSUOt/0SF68fSAAAA leHDYdf9dUujVj2nWxQXygAA e2E7rqjrv0qSkV9y4mCAQQAA False 1.5707963267949 15 Gp7BOGiWSUOt/0SF68fSAAAA False 1.5707963267949 30 Gp7BOGiWSUOt/0SF68fSAAAA False -1.5707963267949 15 Gp7BOGiWSUOt/0SF68fSAAAA DefaultEventListenerFactory nbVJ7vLDkUqPfq7ku+FxPAAA ZVCBCsuQ4UO1Q841IUjW4QAA 5 clMaroon $00B9FFFF 360 96 389 72 sdkNone 3DiICyByyUmsFbOp77EKiwAA 1 EventListenerFactory <<interface>> False False 3DiICyByyUmsFbOp77EKiwAA 3DiICyByyUmsFbOp77EKiwAA clMaroon $00B9FFFF 820 96 85 45 sdkNone NHtPpn7SE0WAntXGhegIOAAA 1 Ordered <<interface>> False False NHtPpn7SE0WAntXGhegIOAAA False NHtPpn7SE0WAntXGhegIOAAA clMaroon $00B9FFFF 468 228 172 43 hNwDorTQ70KvLajAI3hJmgAA 1 DefaultEventListenerFactory False False hNwDorTQ70KvLajAI3hJmgAA hNwDorTQ70KvLajAI3hJmgAA False hNwDorTQ70KvLajAI3hJmgAA clMaroon $00B9FFFF 553,228;554,167 0/UYV9FIGkORvujQKJR8DAAA X4hKG5wslkmc+fxtPxGy3AAA NjV2NbD0ok2bYfw3sP2ZyAAA False 1.5707963267949 15 0/UYV9FIGkORvujQKJR8DAAA False 1.5707963267949 30 0/UYV9FIGkORvujQKJR8DAAA False -1.5707963267949 15 0/UYV9FIGkORvujQKJR8DAAA clMaroon $00B9FFFF 639,250;864,252;862,140 tdcdeO3rXk+RSnA7ldpUrQAA MoRtTCDc8UKQkVgyAwAKHwAA NjV2NbD0ok2bYfw3sP2ZyAAA False 1.5707963267949 15 tdcdeO3rXk+RSnA7ldpUrQAA False 1.5707963267949 30 tdcdeO3rXk+RSnA7ldpUrQAA False -1.5707963267949 15 tdcdeO3rXk+RSnA7ldpUrQAA CompositeComponentDefinition nbVJ7vLDkUqPfq7ku+FxPAAA Sb0gmjdwREq4aeAdAqpTgwAA 18 clMaroon $00B9FFFF 532 64 139 59 sdkNone uRGuoiFcFki3s/Kae8CI+AAA 1 BeanMetadataElement <<interface>> False False uRGuoiFcFki3s/Kae8CI+AAA uRGuoiFcFki3s/Kae8CI+AAA clMaroon $00B9FFFF 417 168 142 111 sdkNone DNkE04U5ZkaBr1EkG524yQAA 1 ComponentDefinition <<interface>> False False DNkE04U5ZkaBr1EkG524yQAA DNkE04U5ZkaBr1EkG524yQAA clMaroon $00B9FFFF 399 316 178 43 8Ji/FoLlS0uJqfHhyffBgAAA 3 AbstractComponentDefinition False False 8Ji/FoLlS0uJqfHhyffBgAAA 8Ji/FoLlS0uJqfHhyffBgAAA False 8Ji/FoLlS0uJqfHhyffBgAAA clMaroon $00B9FFFF 236 404 189 43 VyYARnNfOk2usSVx0mDC0AAA 1 CompositeComponentDefinition False False VyYARnNfOk2usSVx0mDC0AAA VyYARnNfOk2usSVx0mDC0AAA False VyYARnNfOk2usSVx0mDC0AAA clMaroon $00B9FFFF 246 476 168 43 x4iTXiH8pkqR5dTq+uR5kQAA 1 AspectComponentDefinition False False x4iTXiH8pkqR5dTq+uR5kQAA x4iTXiH8pkqR5dTq+uR5kQAA False x4iTXiH8pkqR5dTq+uR5kQAA clMaroon $00B9FFFF 494 404 176 43 OPihlUYtnUCGk4ft5GOG4gAA 1 PointcutComponentDefinition False False OPihlUYtnUCGk4ft5GOG4gAA OPihlUYtnUCGk4ft5GOG4gAA False OPihlUYtnUCGk4ft5GOG4gAA clMaroon $00B9FFFF 739 404 172 43 7iSSPpHnmkajbiZZCVtC5AAA 1 AdvisorComponentDefinition False False 7iSSPpHnmkajbiZZCVtC5AAA 7iSSPpHnmkajbiZZCVtC5AAA False 7iSSPpHnmkajbiZZCVtC5AAA clMaroon $00B9FFFF 680 168 165 43 WjdvnZ/gf0O1ZvFn8jMFIwAA 1 BeanDefinitionHolder False False WjdvnZ/gf0O1ZvFn8jMFIwAA WjdvnZ/gf0O1ZvFn8jMFIwAA False WjdvnZ/gf0O1ZvFn8jMFIwAA clMaroon $00B9FFFF 684 316 157 43 7gcWddcdl02T591s+CfniQAA 1 BeanComponentDefinition False False 7gcWddcdl02T591s+CfniQAA 7gcWddcdl02T591s+CfniQAA False 7gcWddcdl02T591s+CfniQAA clMaroon $00B9FFFF 535,168;575,122 O+e3kIHYGkuc9zGvo6xR0AAA WAUDHTQ48kqlXVhZcg0JHAAA yF1PqWv3cEysveg3fe37LwAA False 1.5707963267949 15 O+e3kIHYGkuc9zGvo6xR0AAA False 1.5707963267949 30 O+e3kIHYGkuc9zGvo6xR0AAA False -1.5707963267949 15 O+e3kIHYGkuc9zGvo6xR0AAA clMaroon $00B9FFFF 727,168;650,122 TIbzUNzvckuNlBsaPtCbXwAA WAUDHTQ48kqlXVhZcg0JHAAA AiqV04muX0S6YPM0C6Jy4AAA False 1.5707963267949 15 TIbzUNzvckuNlBsaPtCbXwAA False 1.5707963267949 30 TIbzUNzvckuNlBsaPtCbXwAA False -1.5707963267949 15 TIbzUNzvckuNlBsaPtCbXwAA clMaroon $00B9FFFF 762,316;762,210 IGDPP44X0kOHgdbTKDGsqAAA AiqV04muX0S6YPM0C6Jy4AAA +Q6+1btAUkuwiCZGqay7GAAA False 1.5707963267949 15 IGDPP44X0kOHgdbTKDGsqAAA False 1.5707963267949 30 IGDPP44X0kOHgdbTKDGsqAAA False -1.5707963267949 15 IGDPP44X0kOHgdbTKDGsqAAA clMaroon $00B9FFFF 711,316;558,252 mYaNC6CX4EupKVuxUiyVEQAA yF1PqWv3cEysveg3fe37LwAA +Q6+1btAUkuwiCZGqay7GAAA False 1.5707963267949 15 mYaNC6CX4EupKVuxUiyVEQAA False 1.5707963267949 30 mYaNC6CX4EupKVuxUiyVEQAA False -1.5707963267949 15 mYaNC6CX4EupKVuxUiyVEQAA clMaroon $00B9FFFF 487,316;487,278 LM7I6kV3I0CO9+XYYLzW0QAA yF1PqWv3cEysveg3fe37LwAA KdSfxQyvdUaM69tt089EigAA False 1.5707963267949 15 LM7I6kV3I0CO9+XYYLzW0QAA False 1.5707963267949 30 LM7I6kV3I0CO9+XYYLzW0QAA False -1.5707963267949 15 LM7I6kV3I0CO9+XYYLzW0QAA clMaroon $00B9FFFF 367,404;449,358 ugWA3o5rrUO43663mhn8WQAA KdSfxQyvdUaM69tt089EigAA XFNV/qhWIEKZlEIrrnyP8gAA False 1.5707963267949 15 ugWA3o5rrUO43663mhn8WQAA False 1.5707963267949 30 ugWA3o5rrUO43663mhn8WQAA False -1.5707963267949 15 ugWA3o5rrUO43663mhn8WQAA clMaroon $00B9FFFF 559,404;510,358 b50ZUMFa4EGb/nnJZHxMbQAA KdSfxQyvdUaM69tt089EigAA rjj2vBu+jkG81g9EAwOFagAA False 1.5707963267949 15 b50ZUMFa4EGb/nnJZHxMbQAA False 1.5707963267949 30 b50ZUMFa4EGb/nnJZHxMbQAA False -1.5707963267949 15 b50ZUMFa4EGb/nnJZHxMbQAA clMaroon $00B9FFFF 744,404;568,358 oyBURmSOKUSFlY+liJs+HQAA KdSfxQyvdUaM69tt089EigAA 7CuS6+Azy0Ga0II0zBQI6wAA False 1.5707963267949 15 oyBURmSOKUSFlY+liJs+HQAA False 1.5707963267949 30 oyBURmSOKUSFlY+liJs+HQAA False -1.5707963267949 15 oyBURmSOKUSFlY+liJs+HQAA clMaroon $00B9FFFF 329,476;330,446 k6psYd03TUmlUxtFiH4RmgAA XFNV/qhWIEKZlEIrrnyP8gAA WOgSFoHXf0GbjdkmLFmP7gAA False 1.5707963267949 15 k6psYd03TUmlUxtFiH4RmgAA False 1.5707963267949 30 k6psYd03TUmlUxtFiH4RmgAA False -1.5707963267949 15 k6psYd03TUmlUxtFiH4RmgAA ImportAwareBeanPostProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 45fofLSE0E6GQLhInBA2HgAA 7 clMaroon $00B9FFFF 378 160 119 45 sdkNone NHfbNf3mHU+CjGOsJ9aPNgAA 1 BeanPostProcessor <<interface>> False False NHfbNf3mHU+CjGOsJ9aPNgAA False NHfbNf3mHU+CjGOsJ9aPNgAA clMaroon $00B9FFFF 212 160 117 45 sdkNone OFapkoq+jkSh9RkSxTL/PgAA 1 BeanFactoryAware <<interface>> False False OFapkoq+jkSh9RkSxTL/PgAA False OFapkoq+jkSh9RkSxTL/PgAA clMaroon $00B9FFFF 536 160 98 45 sdkNone n6D/sAuOQUeQrhIM2F2uDQAA 1 PriorityOrdered <<interface>> False False n6D/sAuOQUeQrhIM2F2uDQAA False n6D/sAuOQUeQrhIM2F2uDQAA clMaroon $00B9FFFF 340 264 195 43 9nHedchJSEiVJc2vIY/y6gAA 1 ImportAwareBeanPostProcessor False False 9nHedchJSEiVJc2vIY/y6gAA 9nHedchJSEiVJc2vIY/y6gAA False 9nHedchJSEiVJc2vIY/y6gAA clMaroon $00B9FFFF 437,264;437,204 EJsbJJVRUUqxO/ZrnCX4tQAA SgE2TKJbPUKEoVOTNI9PBAAA Ed6QJ6jBV02PBam85aEksQAA False 1.5707963267949 15 EJsbJJVRUUqxO/ZrnCX4tQAA False 1.5707963267949 30 EJsbJJVRUUqxO/ZrnCX4tQAA False -1.5707963267949 15 EJsbJJVRUUqxO/ZrnCX4tQAA clMaroon $00B9FFFF 467,264;553,204 3NYCue7vJUmE1VLvi2JZxQAA qL+9iX5vQUC55yMdKWkc/wAA Ed6QJ6jBV02PBam85aEksQAA False 1.5707963267949 15 3NYCue7vJUmE1VLvi2JZxQAA False 1.5707963267949 30 3NYCue7vJUmE1VLvi2JZxQAA False -1.5707963267949 15 3NYCue7vJUmE1VLvi2JZxQAA clMaroon $00B9FFFF 403,264;306,204 u5/dcwPhJEyCHfdfpzEpyQAA US/YqO3Do02+lBojcRBo5QAA Ed6QJ6jBV02PBam85aEksQAA False 1.5707963267949 15 u5/dcwPhJEyCHfdfpzEpyQAA False 1.5707963267949 30 u5/dcwPhJEyCHfdfpzEpyQAA False -1.5707963267949 15 u5/dcwPhJEyCHfdfpzEpyQAA BeanNameGenerator nbVJ7vLDkUqPfq7ku+FxPAAA 6ltS0cvXUEelKRcn91rY5QAA 5 clMaroon $00B9FFFF 436 48 393 59 sdkNone xWyORJB65kSUt0NnNG97yAAA 1 BeanNameGenerator <<interface>> False False xWyORJB65kSUt0NnNG97yAAA xWyORJB65kSUt0NnNG97yAAA clMaroon $00B9FFFF 344 172 191 43 +l1pnCSRqk61mnEmCnJFOwAA 1 AnnotationBeanNameGenerator False False +l1pnCSRqk61mnEmCnJFOwAA +l1pnCSRqk61mnEmCnJFOwAA False +l1pnCSRqk61mnEmCnJFOwAA clMaroon $00B9FFFF 728 172 169 43 UP5YcRTu1U2GHVX5kzV4swAA 1 DefaultBeanNameGenerator False False UP5YcRTu1U2GHVX5kzV4swAA UP5YcRTu1U2GHVX5kzV4swAA False UP5YcRTu1U2GHVX5kzV4swAA clMaroon $00B9FFFF 474,172;584,106 9UQw4Jf1eESHvIMK6lOkIQAA IsrocB64+EuDGhkiWsJw7QAA XTQ0MfGMq02M0pOPZ7OCPAAA False 1.5707963267949 15 9UQw4Jf1eESHvIMK6lOkIQAA False 1.5707963267949 30 9UQw4Jf1eESHvIMK6lOkIQAA False -1.5707963267949 15 9UQw4Jf1eESHvIMK6lOkIQAA clMaroon $00B9FFFF 779,172;677,106 ZArcyxsxQ0S6Nj+rBXnTLwAA IsrocB64+EuDGhkiWsJw7QAA V/Rchos9wUquwh43CmAhgwAA False 1.5707963267949 15 ZArcyxsxQ0S6Nj+rBXnTLwAA False 1.5707963267949 30 ZArcyxsxQ0S6Nj+rBXnTLwAA False -1.5707963267949 15 ZArcyxsxQ0S6Nj+rBXnTLwAA ScopeMetadataResolver nbVJ7vLDkUqPfq7ku+FxPAAA tgmFrL3Lxkq6GsJic/Jj6wAA 5 clMaroon $00B9FFFF 600 60 252 59 sdkNone 3WLuor6Dh06Dt1pcAEM1mgAA 1 ScopeMetadataResolver <<interface>> False False 3WLuor6Dh06Dt1pcAEM1mgAA 3WLuor6Dh06Dt1pcAEM1mgAA clMaroon $00B9FFFF 460 172 212 43 sftFdZZ1pEeE8fwucjidcQAA 1 AnnotationScopeMetadataResolver False False sftFdZZ1pEeE8fwucjidcQAA sftFdZZ1pEeE8fwucjidcQAA False sftFdZZ1pEeE8fwucjidcQAA clMaroon $00B9FFFF 780 172 187 43 WItmfWEAgkmkny2yPJS/NAAA 1 Jsr330ScopeMetadataResolver False False WItmfWEAgkmkny2yPJS/NAAA WItmfWEAgkmkny2yPJS/NAAA False WItmfWEAgkmkny2yPJS/NAAA clMaroon $00B9FFFF 597,172;680,118 vzHifqTjpkGs+f8TmwyScwAA A+Y1v2jTdkWVuwwVlCWW9gAA P+XSkNzKI0mPHA4d4djsDgAA False 1.5707963267949 15 vzHifqTjpkGs+f8TmwyScwAA False 1.5707963267949 30 vzHifqTjpkGs+f8TmwyScwAA False -1.5707963267949 15 vzHifqTjpkGs+f8TmwyScwAA clMaroon $00B9FFFF 843,172;766,118 vpjN95CLn0CZbdUfLGG4pgAA A+Y1v2jTdkWVuwwVlCWW9gAA tyq/6LFdMUmObLAptntoGgAA False 1.5707963267949 15 vpjN95CLn0CZbdUfLGG4pgAA False 1.5707963267949 30 vpjN95CLn0CZbdUfLGG4pgAA False -1.5707963267949 15 vpjN95CLn0CZbdUfLGG4pgAA MetadataReader nbVJ7vLDkUqPfq7ku+FxPAAA 8FIrfMJ1EE6mvUEo4xLhLwAA 3 clMaroon $00B9FFFF 631 44 141 85 sdkNone EbmUgx8rQU+Xe2xD3X1OBgAA 1 MetadataReader <<interface>> False False EbmUgx8rQU+Xe2xD3X1OBgAA EbmUgx8rQU+Xe2xD3X1OBgAA clMaroon $00B9FFFF 629 184 144 43 rPA0TQ2bh0CA7hIlS9IZxgAA 1 SimpleMetadataReader False False rPA0TQ2bh0CA7hIlS9IZxgAA rPA0TQ2bh0CA7hIlS9IZxgAA False rPA0TQ2bh0CA7hIlS9IZxgAA clMaroon $00B9FFFF 700,184;701,128 2ycQ6hHRskq6osbQdIOtawAA vtwVwjWlOkO5e543gsji9wAA 5k1uLwonZESfZW8lD/fKAAAA False 1.5707963267949 15 2ycQ6hHRskq6osbQdIOtawAA False 1.5707963267949 30 2ycQ6hHRskq6osbQdIOtawAA False -1.5707963267949 15 2ycQ6hHRskq6osbQdIOtawAA AnnotationMetadataReadingVisitor nbVJ7vLDkUqPfq7ku+FxPAAA lESrCb/kAUS5W67cAZsLEgAA 12 clMaroon $00B9FFFF 458 44 101 43 /w2q4mT/00KKtMRDgL5+UQAA 3 ClassVisitor False False /w2q4mT/00KKtMRDgL5+UQAA /w2q4mT/00KKtMRDgL5+UQAA False /w2q4mT/00KKtMRDgL5+UQAA clMaroon $00B9FFFF 420 332 176 43 QA4wE263HE6kcERUeJxJ/AAA 1 ClassMetadataReadingVisitor False False QA4wE263HE6kcERUeJxJ/AAA QA4wE263HE6kcERUeJxJ/AAA False QA4wE263HE6kcERUeJxJ/AAA clMaroon $00B9FFFF 680 44 138 228 sdkNone itTFNbx7eE257mwWOP0ESQAA 1 ClassMetadata <<interface>> False False itTFNbx7eE257mwWOP0ESQAA itTFNbx7eE257mwWOP0ESQAA clMaroon $00B9FFFF 507,332;508,86 fHDnD+XHWkWlht74W9kiegAA PJz4EDSPn0+0mWCykNfhJwAA KuL26d/KFkS1DAKKjtUhsgAA False 1.5707963267949 15 fHDnD+XHWkWlht74W9kiegAA False 1.5707963267949 30 fHDnD+XHWkWlht74W9kiegAA False -1.5707963267949 15 fHDnD+XHWkWlht74W9kiegAA clMaroon $00B9FFFF 403 436 210 43 BFIycENp70+yPjWWA4p4QAAA 1 AnnotationMetadataReadingVisitor False False BFIycENp70+yPjWWA4p4QAAA BFIycENp70+yPjWWA4p4QAAA False BFIycENp70+yPjWWA4p4QAAA clMaroon $00B9FFFF 903 44 406 111 sdkNone vQi2Y2DRSkeABaZLvrkRKgAA 1 AnnotatedTypeMetadata <<interface>> False False vQi2Y2DRSkeABaZLvrkRKgAA vQi2Y2DRSkeABaZLvrkRKgAA clMaroon $00B9FFFF 977 296 258 124 sdkNone 5VqPrOIs+0iTw3MhhLW/dAAA 1 AnnotationMetadata <<interface>> False False 5VqPrOIs+0iTw3MhhLW/dAAA 5VqPrOIs+0iTw3MhhLW/dAAA clMaroon $00B9FFFF 1105,296;1105,154 oP7KQ7AE4U6j4EDGoFIm6wAA 4ODcOSd6KkKjzME8pv0cKQAA c3sG9JoXRUmufA0nJFUX/QAA False 1.5707963267949 15 oP7KQ7AE4U6j4EDGoFIm6wAA False 1.5707963267949 30 oP7KQ7AE4U6j4EDGoFIm6wAA False -1.5707963267949 15 oP7KQ7AE4U6j4EDGoFIm6wAA clMaroon $00B9FFFF 996,296;817,196 R73QzYeF+kyC/gnMJ22FSwAA BZVl4T4blkicAuDLKZb2ZgAA c3sG9JoXRUmufA0nJFUX/QAA False 1.5707963267949 15 R73QzYeF+kyC/gnMJ22FSwAA False 1.5707963267949 30 R73QzYeF+kyC/gnMJ22FSwAA False -1.5707963267949 15 R73QzYeF+kyC/gnMJ22FSwAA clMaroon $00B9FFFF 612,439;977,378 RowLLV1WNUSRcCRZAcTo1gAA c3sG9JoXRUmufA0nJFUX/QAA qPFLR74SBE6vYxvkAEz4sAAA False 1.5707963267949 15 RowLLV1WNUSRcCRZAcTo1gAA False 1.5707963267949 30 RowLLV1WNUSRcCRZAcTo1gAA False -1.5707963267949 15 RowLLV1WNUSRcCRZAcTo1gAA clMaroon $00B9FFFF 533,332;680,212 VjDZldbs0EOIw6yPcg5/pgAA BZVl4T4blkicAuDLKZb2ZgAA KuL26d/KFkS1DAKKjtUhsgAA False 1.5707963267949 15 VjDZldbs0EOIw6yPcg5/pgAA False 1.5707963267949 30 VjDZldbs0EOIw6yPcg5/pgAA False -1.5707963267949 15 VjDZldbs0EOIw6yPcg5/pgAA clMaroon $00B9FFFF 507,436;507,374 6U9n2QM7i0+jBDCH73m3bwAA KuL26d/KFkS1DAKKjtUhsgAA qPFLR74SBE6vYxvkAEz4sAAA False 1.5707963267949 15 6U9n2QM7i0+jBDCH73m3bwAA False 1.5707963267949 30 6U9n2QM7i0+jBDCH73m3bwAA False -1.5707963267949 15 6U9n2QM7i0+jBDCH73m3bwAA ScannedGenericBeanDefinition nbVJ7vLDkUqPfq7ku+FxPAAA BQg4MGbg50q8BuXoym3LTwAA 19 clMaroon $00B9FFFF 618 195 196 43 8IMLTVNhqku9b1My+RHNXAAA 3 BeanMetadataAttributeAccessor False False 8IMLTVNhqku9b1My+RHNXAAA 8IMLTVNhqku9b1My+RHNXAAA False 8IMLTVNhqku9b1My+RHNXAAA clMaroon $00B9FFFF 646 298 141 43 K/tU5z51IkemB/ISoFQtpQAA 3 AbstractBeanDefinition False False K/tU5z51IkemB/ISoFQtpQAA K/tU5z51IkemB/ISoFQtpQAA False K/tU5z51IkemB/ISoFQtpQAA clMaroon $00B9FFFF 382 195 101 46 sdkNone qKRw/gLxB0KuZGLDMjsLnwAA 1 BeanDefinition <<interface>> False False qKRw/gLxB0KuZGLDMjsLnwAA qKRw/gLxB0KuZGLDMjsLnwAA clMaroon $00B9FFFF 328 44 209 111 sdkNone HaJwu/NEWUGUmsbrnyRE1AAA 1 AttributeAccessor <<interface>> False False HaJwu/NEWUGUmsbrnyRE1AAA HaJwu/NEWUGUmsbrnyRE1AAA clMaroon $00B9FFFF 647 44 139 59 sdkNone uRGuoiFcFki3s/Kae8CI+AAA 1 BeanMetadataElement <<interface>> False False uRGuoiFcFki3s/Kae8CI+AAA uRGuoiFcFki3s/Kae8CI+AAA clMaroon $00B9FFFF 432,195;432,154 fHkRnDij30uCRn5IU5drgwAA /7kuTeMjl0aKqZ2AHhts6QAA ek/9xvBQPk6Wkek8ygn6GQAA False 1.5707963267949 15 fHkRnDij30uCRn5IU5drgwAA False 1.5707963267949 30 fHkRnDij30uCRn5IU5drgwAA False -1.5707963267949 15 fHkRnDij30uCRn5IU5drgwAA clMaroon $00B9FFFF 475,195;659,102 dJqmWQ+lP0u2siOKjOXa6QAA 4Sue5SlC+kO36oaDomC1qQAA ek/9xvBQPk6Wkek8ygn6GQAA False 1.5707963267949 15 dJqmWQ+lP0u2siOKjOXa6QAA False 1.5707963267949 30 dJqmWQ+lP0u2siOKjOXa6QAA False -1.5707963267949 15 dJqmWQ+lP0u2siOKjOXa6QAA clMaroon $00B9FFFF 715,195;716,102 1UvXitN0Mkq7QQJWqJn8fwAA 4Sue5SlC+kO36oaDomC1qQAA PBnaJtiNJ0OXX6wcGQlpeAAA False 1.5707963267949 15 1UvXitN0Mkq7QQJWqJn8fwAA False 1.5707963267949 30 1UvXitN0Mkq7QQJWqJn8fwAA False -1.5707963267949 15 1UvXitN0Mkq7QQJWqJn8fwAA clMaroon $00B9FFFF 716,298;715,237 l7fFEQvFg0aMvT9nwpvoYQAA PBnaJtiNJ0OXX6wcGQlpeAAA 41AiOyVwfEKePmrbmS2TPQAA False 1.5707963267949 15 l7fFEQvFg0aMvT9nwpvoYQAA False 1.5707963267949 30 l7fFEQvFg0aMvT9nwpvoYQAA False -1.5707963267949 15 l7fFEQvFg0aMvT9nwpvoYQAA clMaroon $00B9FFFF 658,298;482,235 YOQVy9I1SkaanqDQbfkiggAA ek/9xvBQPk6Wkek8ygn6GQAA 41AiOyVwfEKePmrbmS2TPQAA False 1.5707963267949 15 YOQVy9I1SkaanqDQbfkiggAA False 1.5707963267949 30 YOQVy9I1SkaanqDQbfkiggAA False -1.5707963267949 15 YOQVy9I1SkaanqDQbfkiggAA clMaroon $00B9FFFF 888 195 85 45 sdkNone iysa9DgagkKQoDrCxAIZgwAA 1 Cloneable <<interface>> False False iysa9DgagkKQoDrCxAIZgwAA False iysa9DgagkKQoDrCxAIZgwAA clMaroon $00B9FFFF 760,298;888,237 B+MT5nlkoUWL3puEUWLPiQAA PgDsOlhFMUOXXTtdHERSYAAA 41AiOyVwfEKePmrbmS2TPQAA False 1.5707963267949 15 B+MT5nlkoUWL3puEUWLPiQAA False 1.5707963267949 30 B+MT5nlkoUWL3puEUWLPiQAA False -1.5707963267949 15 B+MT5nlkoUWL3puEUWLPiQAA clMaroon $00B9FFFF 649 396 135 43 8h2SPQ9gN0+fUrwq9mmVWAAA 1 GenericBeanDefinition False False 8h2SPQ9gN0+fUrwq9mmVWAAA 8h2SPQ9gN0+fUrwq9mmVWAAA False 8h2SPQ9gN0+fUrwq9mmVWAAA clMaroon $00B9FFFF 625 484 183 43 ZCRiCBoX0U+bC/hmIixd+QAA 1 ScannedGenericBeanDefinition False False ZCRiCBoX0U+bC/hmIixd+QAA ZCRiCBoX0U+bC/hmIixd+QAA False ZCRiCBoX0U+bC/hmIixd+QAA clMaroon $00B9FFFF 716,396;716,340 njw96owagU2RtmM+pyDI7QAA 41AiOyVwfEKePmrbmS2TPQAA LY2xZmqBaUSyzSQgbuCWqQAA False 1.5707963267949 15 njw96owagU2RtmM+pyDI7QAA False 1.5707963267949 30 njw96owagU2RtmM+pyDI7QAA False -1.5707963267949 15 njw96owagU2RtmM+pyDI7QAA clMaroon $00B9FFFF 716,484;716,438 9RufzGrTXkK/sOxEZFOgBQAA LY2xZmqBaUSyzSQgbuCWqQAA Dfd5IG9Y10Kye2drO8wcQwAA False 1.5707963267949 15 9RufzGrTXkK/sOxEZFOgBQAA False 1.5707963267949 30 9RufzGrTXkK/sOxEZFOgBQAA False -1.5707963267949 15 9RufzGrTXkK/sOxEZFOgBQAA clMaroon $00B9FFFF 352 336 161 72 sdkNone ZfWRn4cGtECb2rU1HX1moAAA 1 AnnotatedBeanDefinition <<interface>> False False ZfWRn4cGtECb2rU1HX1moAAA ZfWRn4cGtECb2rU1HX1moAAA clMaroon $00B9FFFF 432,336;432,240 IzudCUDX/E6hcPRK7fI1igAA ek/9xvBQPk6Wkek8ygn6GQAA N75hIMOgpU2q0QMSoiBbhgAA False 1.5707963267949 15 IzudCUDX/E6hcPRK7fI1igAA False 1.5707963267949 30 IzudCUDX/E6hcPRK7fI1igAA False -1.5707963267949 15 IzudCUDX/E6hcPRK7fI1igAA clMaroon $00B9FFFF 671,484;508,407 vvwJaojDXEKJqJydNyHPFwAA N75hIMOgpU2q0QMSoiBbhgAA Dfd5IG9Y10Kye2drO8wcQwAA False 1.5707963267949 15 vvwJaojDXEKJqJydNyHPFwAA False 1.5707963267949 30 vvwJaojDXEKJqJydNyHPFwAA False -1.5707963267949 15 vvwJaojDXEKJqJydNyHPFwAA PropertyOverrideBeanDefinitionParser nbVJ7vLDkUqPfq7ku+FxPAAA QhfQdvlne0u3ppvMsezstgAA 9 clMaroon $00B9FFFF 585 84 282 59 sdkNone MbbZMq4jZ0CmSdBbox622wAA 1 BeanDefinitionParser <<interface>> False False MbbZMq4jZ0CmSdBbox622wAA MbbZMq4jZ0CmSdBbox622wAA clMaroon $00B9FFFF 585 190 282 56 TORzrnYDOkuWPjNxnNyj8wAA 3 AbstractBeanDefinitionParser False False TORzrnYDOkuWPjNxnNyj8wAA TORzrnYDOkuWPjNxnNyj8wAA False TORzrnYDOkuWPjNxnNyj8wAA clMaroon $00B9FFFF 566 293 320 56 PEODTGZhw0SY5xzanjJW1AAA 3 AbstractSingleBeanDefinitionParser False False PEODTGZhw0SY5xzanjJW1AAA PEODTGZhw0SY5xzanjJW1AAA False PEODTGZhw0SY5xzanjJW1AAA clMaroon $00B9FFFF 583 396 287 56 oAoJkGf5tE+38JVKmj4XIwAA 3 AbstractPropertyLoadingBeanDefinitionParser False False oAoJkGf5tE+38JVKmj4XIwAA oAoJkGf5tE+38JVKmj4XIwAA False oAoJkGf5tE+38JVKmj4XIwAA clMaroon $00B9FFFF 583 499 287 56 p96AmgmRVE+vPxt2Jg2YGgAA 1 PropertyOverrideBeanDefinitionParser False False p96AmgmRVE+vPxt2Jg2YGgAA p96AmgmRVE+vPxt2Jg2YGgAA False p96AmgmRVE+vPxt2Jg2YGgAA clMaroon $00B9FFFF 725,190;725,142 i7R/ny8QTk2RdmZC7nXOUgAA BHtd+W9DhkyC658zmQIfZAAA Y5nbK+KGVEOEOpU+6VrXzgAA False 1.5707963267949 15 i7R/ny8QTk2RdmZC7nXOUgAA False 1.5707963267949 30 i7R/ny8QTk2RdmZC7nXOUgAA False -1.5707963267949 15 i7R/ny8QTk2RdmZC7nXOUgAA clMaroon $00B9FFFF 725,293;725,245 SBarO1yEwkmFhz0ddO4OgAAA Y5nbK+KGVEOEOpU+6VrXzgAA h+WP75HvZE+TfvSkZwNSvQAA False 1.5707963267949 15 SBarO1yEwkmFhz0ddO4OgAAA False 1.5707963267949 30 SBarO1yEwkmFhz0ddO4OgAAA False -1.5707963267949 15 SBarO1yEwkmFhz0ddO4OgAAA clMaroon $00B9FFFF 726,396;725,348 h630ktK2tUeK8QEQRSUR7gAA h+WP75HvZE+TfvSkZwNSvQAA Gp9lEoXKKEGs9OV8qccxCgAA False 1.5707963267949 15 h630ktK2tUeK8QEQRSUR7gAA False 1.5707963267949 30 h630ktK2tUeK8QEQRSUR7gAA False -1.5707963267949 15 h630ktK2tUeK8QEQRSUR7gAA clMaroon $00B9FFFF 726,499;726,451 aZqHYXeca0uOIqp8c6nueAAA Gp9lEoXKKEGs9OV8qccxCgAA CWWYc31ISEqlcmbO+1pLNQAA False 1.5707963267949 15 aZqHYXeca0uOIqp8c6nueAAA False 1.5707963267949 30 aZqHYXeca0uOIqp8c6nueAAA False -1.5707963267949 15 aZqHYXeca0uOIqp8c6nueAAA PropertyOverrideConfigurer nbVJ7vLDkUqPfq7ku+FxPAAA WsCuA/BAdUKPpV9qqTCLjQAA 9 clMaroon $00B9FFFF 595 84 153 43 HIqcCSDKREG1UtMfjsVM3AAA 3 PropertiesLoaderSupport False False HIqcCSDKREG1UtMfjsVM3AAA HIqcCSDKREG1UtMfjsVM3AAA False HIqcCSDKREG1UtMfjsVM3AAA clMaroon $00B9FFFF 585 260 172 43 JF4DmVc7S0+F0KoB7xDxtwAA 3 PropertyResourceConfigurer False False JF4DmVc7S0+F0KoB7xDxtwAA JF4DmVc7S0+F0KoB7xDxtwAA False JF4DmVc7S0+F0KoB7xDxtwAA clMaroon $00B9FFFF 420 176 162 45 sdkNone hm4UBSP8KkupBZYdml93SAAA 1 BeanFactoryPostProcessor <<interface>> False False hm4UBSP8KkupBZYdml93SAAA False hm4UBSP8KkupBZYdml93SAAA clMaroon $00B9FFFF 776 176 98 45 sdkNone n6D/sAuOQUeQrhIM2F2uDQAA 1 PriorityOrdered <<interface>> False False n6D/sAuOQUeQrhIM2F2uDQAA False n6D/sAuOQUeQrhIM2F2uDQAA clMaroon $00B9FFFF 670,260;671,126 EmVEz1Ziqk6Zzvulycq/pwAA 8ydy80mUUkigDU5/BOIxzAAA cSgVq/EAJkyu6pxn7c0ivwAA False 1.5707963267949 15 EmVEz1Ziqk6Zzvulycq/pwAA False 1.5707963267949 30 EmVEz1Ziqk6Zzvulycq/pwAA False -1.5707963267949 15 EmVEz1Ziqk6Zzvulycq/pwAA clMaroon $00B9FFFF 627,260;545,220 92GiuLMcwkmSaiwctkgvYQAA sY3HCHxE/kGhMrFAk1wYVQAA cSgVq/EAJkyu6pxn7c0ivwAA False 1.5707963267949 15 92GiuLMcwkmSaiwctkgvYQAA False 1.5707963267949 30 92GiuLMcwkmSaiwctkgvYQAA False -1.5707963267949 15 92GiuLMcwkmSaiwctkgvYQAA clMaroon $00B9FFFF 709,260;783,220 H5RTzus3b0WW1hbd2HaOPQAA Qf8Mkx6JjEOW4e1Y4q4OeAAA cSgVq/EAJkyu6pxn7c0ivwAA False 1.5707963267949 15 H5RTzus3b0WW1hbd2HaOPQAA False 1.5707963267949 30 H5RTzus3b0WW1hbd2HaOPQAA False -1.5707963267949 15 H5RTzus3b0WW1hbd2HaOPQAA clMaroon $00B9FFFF 587 368 168 43 niWYRjPRI0uCwcaqldMmMQAA 1 PropertyOverrideConfigurer False False niWYRjPRI0uCwcaqldMmMQAA niWYRjPRI0uCwcaqldMmMQAA False niWYRjPRI0uCwcaqldMmMQAA clMaroon $00B9FFFF 670,368;670,302 EIyUzWO3G0GOKV9xzip+WQAA cSgVq/EAJkyu6pxn7c0ivwAA kUSA2pc53ECUpIGU5IkvmgAA False 1.5707963267949 15 EIyUzWO3G0GOKV9xzip+WQAA False 1.5707963267949 30 EIyUzWO3G0GOKV9xzip+WQAA False -1.5707963267949 15 EIyUzWO3G0GOKV9xzip+WQAA PropertySourcesPlaceholderConfigurer nbVJ7vLDkUqPfq7ku+FxPAAA VW1Y8iA2o0OKwi/YwIoE+wAA 17 clMaroon $00B9FFFF 586 204 153 43 HIqcCSDKREG1UtMfjsVM3AAA 3 PropertiesLoaderSupport False False HIqcCSDKREG1UtMfjsVM3AAA HIqcCSDKREG1UtMfjsVM3AAA False HIqcCSDKREG1UtMfjsVM3AAA clMaroon $00B9FFFF 576 360 172 43 JF4DmVc7S0+F0KoB7xDxtwAA 3 PropertyResourceConfigurer False False JF4DmVc7S0+F0KoB7xDxtwAA JF4DmVc7S0+F0KoB7xDxtwAA False JF4DmVc7S0+F0KoB7xDxtwAA clMaroon $00B9FFFF 661,360;662,246 EmVEz1Ziqk6Zzvulycq/pwAA jhzV5nxdoEWxT2JMVR3AgQAA qI8UKsJpd0+F2YdFBQR9BgAA False 1.5707963267949 15 EmVEz1Ziqk6Zzvulycq/pwAA False 1.5707963267949 30 EmVEz1Ziqk6Zzvulycq/pwAA False -1.5707963267949 15 EmVEz1Ziqk6Zzvulycq/pwAA clMaroon $00B9FFFF 361 204 162 45 sdkNone hm4UBSP8KkupBZYdml93SAAA 1 BeanFactoryPostProcessor <<interface>> False False hm4UBSP8KkupBZYdml93SAAA False hm4UBSP8KkupBZYdml93SAAA clMaroon $00B9FFFF 631,360;472,248 92GiuLMcwkmSaiwctkgvYQAA pnAcCnU6C0qBJUWBrHp71gAA qI8UKsJpd0+F2YdFBQR9BgAA False 1.5707963267949 15 92GiuLMcwkmSaiwctkgvYQAA False 1.5707963267949 30 92GiuLMcwkmSaiwctkgvYQAA False -1.5707963267949 15 92GiuLMcwkmSaiwctkgvYQAA clMaroon $00B9FFFF 831 204 98 45 sdkNone n6D/sAuOQUeQrhIM2F2uDQAA 1 PriorityOrdered <<interface>> False False n6D/sAuOQUeQrhIM2F2uDQAA False n6D/sAuOQUeQrhIM2F2uDQAA clMaroon $00B9FFFF 691,360;848,248 H5RTzus3b0WW1hbd2HaOPQAA dALp4voEkEaXL1s5KFg0ZgAA qI8UKsJpd0+F2YdFBQR9BgAA False 1.5707963267949 15 H5RTzus3b0WW1hbd2HaOPQAA False 1.5707963267949 30 H5RTzus3b0WW1hbd2HaOPQAA False -1.5707963267949 15 H5RTzus3b0WW1hbd2HaOPQAA clMaroon $00B9FFFF 572 468 180 43 eIpUnveYqkCRa7etL7diIgAA 3 PlaceholderConfigurerSupport False False eIpUnveYqkCRa7etL7diIgAA eIpUnveYqkCRa7etL7diIgAA False eIpUnveYqkCRa7etL7diIgAA clMaroon $00B9FFFF 364 360 157 59 sdkNone 4IvL8ppvB0eswla5878HKgAA 1 BeanNameAware <<interface>> False False 4IvL8ppvB0eswla5878HKgAA 4IvL8ppvB0eswla5878HKgAA clMaroon $00B9FFFF 822 360 117 45 sdkNone OFapkoq+jkSh9RkSxTL/PgAA 1 BeanFactoryAware <<interface>> False False OFapkoq+jkSh9RkSxTL/PgAA False OFapkoq+jkSh9RkSxTL/PgAA clMaroon $00B9FFFF 661,468;661,402 voGMqbzLBU6PiXntQa1j9wAA qI8UKsJpd0+F2YdFBQR9BgAA c4CEeVANG0qdD2AqdbQt4gAA False 1.5707963267949 15 voGMqbzLBU6PiXntQa1j9wAA False 1.5707963267949 30 voGMqbzLBU6PiXntQa1j9wAA False -1.5707963267949 15 voGMqbzLBU6PiXntQa1j9wAA clMaroon $00B9FFFF 615,468;506,418 +q4WimsmqEO1pBMVb/zzKAAA tLzBanbWjkyI/OBKWQtUAgAA c4CEeVANG0qdD2AqdbQt4gAA False 1.5707963267949 15 +q4WimsmqEO1pBMVb/zzKAAA False 1.5707963267949 30 +q4WimsmqEO1pBMVb/zzKAAA False -1.5707963267949 15 +q4WimsmqEO1pBMVb/zzKAAA clMaroon $00B9FFFF 704,468;835,404 1gQwnFVO00CDppgTQldutwAA j4Z/PoCOk0uiqb/1qIYVBgAA c4CEeVANG0qdD2AqdbQt4gAA False 1.5707963267949 15 1gQwnFVO00CDppgTQldutwAA False 1.5707963267949 30 1gQwnFVO00CDppgTQldutwAA False -1.5707963267949 15 1gQwnFVO00CDppgTQldutwAA clMaroon $00B9FFFF 547 568 230 43 VpwWB3cTJUSsed2CCE6KyAAA 1 PropertySourcesPlaceholderConfigurer False False VpwWB3cTJUSsed2CCE6KyAAA VpwWB3cTJUSsed2CCE6KyAAA False VpwWB3cTJUSsed2CCE6KyAAA clMaroon $00B9FFFF 821 468 118 45 sdkNone 5sEi98Ciz0K3X2G7qyR3fQAA 1 EnvironmentAware <<interface>> False False 5sEi98Ciz0K3X2G7qyR3fQAA False 5sEi98Ciz0K3X2G7qyR3fQAA clMaroon $00B9FFFF 707,568;830,512 sVYoBNNEY0yPjZNg+I/P5gAA kpgnXWTb6k6DvK+PEb9glwAA /kSpBczQM0GrYfSkhuqmLgAA False 1.5707963267949 15 sVYoBNNEY0yPjZNg+I/P5gAA False 1.5707963267949 30 sVYoBNNEY0yPjZNg+I/P5gAA False -1.5707963267949 15 sVYoBNNEY0yPjZNg+I/P5gAA clMaroon $00B9FFFF 661,568;661,510 j8Z5aYt2M0ehuFJstMbabgAA c4CEeVANG0qdD2AqdbQt4gAA /kSpBczQM0GrYfSkhuqmLgAA False 1.5707963267949 15 j8Z5aYt2M0ehuFJstMbabgAA False 1.5707963267949 30 j8Z5aYt2M0ehuFJstMbabgAA False -1.5707963267949 15 j8Z5aYt2M0ehuFJstMbabgAA AspectJWeavingEnabler nbVJ7vLDkUqPfq7ku+FxPAAA MgVI5p5GR0SqibZlNAFa1QAA 9 clMaroon $00B9FFFF 372 80 162 45 sdkNone hm4UBSP8KkupBZYdml93SAAA 1 BeanFactoryPostProcessor <<interface>> False False hm4UBSP8KkupBZYdml93SAAA False hm4UBSP8KkupBZYdml93SAAA clMaroon $00B9FFFF 588 80 142 45 sdkNone vKy1CmQQ2kiao5Z+XZsFhQAA 1 BeanClassLoaderAware <<interface>> False False vKy1CmQQ2kiao5Z+XZsFhQAA False vKy1CmQQ2kiao5Z+XZsFhQAA clMaroon $00B9FFFF 784 80 145 45 sdkNone knAYppFiDkCaMxJYvaPa5QAA 1 LoadTimeWeaverAware <<interface>> False False knAYppFiDkCaMxJYvaPa5QAA False knAYppFiDkCaMxJYvaPa5QAA clMaroon $00B9FFFF 983 80 85 45 sdkNone NHtPpn7SE0WAntXGhegIOAAA 1 Ordered <<interface>> False False NHtPpn7SE0WAntXGhegIOAAA False NHtPpn7SE0WAntXGhegIOAAA clMaroon $00B9FFFF 660 184 146 43 f5NYp2SUgEGfOrhHvl9aKgAA 1 AspectJWeavingEnabler False False f5NYp2SUgEGfOrhHvl9aKgAA f5NYp2SUgEGfOrhHvl9aKgAA False f5NYp2SUgEGfOrhHvl9aKgAA clMaroon $00B9FFFF 675,184;512,124 EfRuDcIwLE2FccCxj/D7xgAA FJMJjLytoUqdFMGM7BeErAAA evv4+H+qhkuSk0AcVAXQoQAA False 1.5707963267949 15 EfRuDcIwLE2FccCxj/D7xgAA False 1.5707963267949 30 EfRuDcIwLE2FccCxj/D7xgAA False -1.5707963267949 15 EfRuDcIwLE2FccCxj/D7xgAA clMaroon $00B9FFFF 717,184;674,124 eXKTJ0IOJ068AO/d304lPgAA 20ABenJZk0OGFOIzEjyRwQAA evv4+H+qhkuSk0AcVAXQoQAA False 1.5707963267949 15 eXKTJ0IOJ068AO/d304lPgAA False 1.5707963267949 30 eXKTJ0IOJ068AO/d304lPgAA False -1.5707963267949 15 eXKTJ0IOJ068AO/d304lPgAA clMaroon $00B9FFFF 757,184;829,124 RmvXZbMOckKOotKqlzDWUQAA Tx97xq2U7UCEjKufmd6I/wAA evv4+H+qhkuSk0AcVAXQoQAA False 1.5707963267949 15 RmvXZbMOckKOotKqlzDWUQAA False 1.5707963267949 30 RmvXZbMOckKOotKqlzDWUQAA False -1.5707963267949 15 RmvXZbMOckKOotKqlzDWUQAA clMaroon $00B9FFFF 792,184;983,117 a2JNr0/XXUigJC6urdwOlgAA fiY6sQPnWEWZMNXhmwkKvQAA evv4+H+qhkuSk0AcVAXQoQAA False 1.5707963267949 15 a2JNr0/XXUigJC6urdwOlgAA False 1.5707963267949 30 a2JNr0/XXUigJC6urdwOlgAA False -1.5707963267949 15 a2JNr0/XXUigJC6urdwOlgAA AnnotationBeanConfigurerAspect nbVJ7vLDkUqPfq7ku+FxPAAA WSt3TtmJBEW+SI8gKolJzAAA 11 clMaroon $00B9FFFF 508 60 219 43 34W0u1gTD0eUxuv4Pl2FdwAA 3 AbstractDependencyInjectionAspect False False 34W0u1gTD0eUxuv4Pl2FdwAA 34W0u1gTD0eUxuv4Pl2FdwAA False 34W0u1gTD0eUxuv4Pl2FdwAA clMaroon $00B9FFFF 463 140 309 43 FxxWAeyisEOSRwsDMRZ+VgAA 3 AbstractInterfaceDrivenDependencyInjectionAspect False False FxxWAeyisEOSRwsDMRZ+VgAA FxxWAeyisEOSRwsDMRZ+VgAA False FxxWAeyisEOSRwsDMRZ+VgAA clMaroon $00B9FFFF 518 252 199 95 jNVEhqG7PUyFqt2qT16RxwAA 1 AnnotationBeanConfigurerAspect False False jNVEhqG7PUyFqt2qT16RxwAA jNVEhqG7PUyFqt2qT16RxwAA False jNVEhqG7PUyFqt2qT16RxwAA clMaroon $00B9FFFF 308 140 117 45 sdkNone OFapkoq+jkSh9RkSxTL/PgAA 1 BeanFactoryAware <<interface>> False False OFapkoq+jkSh9RkSxTL/PgAA False OFapkoq+jkSh9RkSxTL/PgAA clMaroon $00B9FFFF 810 140 123 59 sdkNone gZvAnMeWCUO2CBaOG8ULXwAA 1 InitializingBean <<interface>> False False gZvAnMeWCUO2CBaOG8ULXwAA gZvAnMeWCUO2CBaOG8ULXwAA clMaroon $00B9FFFF 971 140 99 59 sdkNone Vzw5iM+KfEaYtfY/EIdRdgAA 1 DisposableBean <<interface>> False False Vzw5iM+KfEaYtfY/EIdRdgAA Vzw5iM+KfEaYtfY/EIdRdgAA clMaroon $00B9FFFF 617,140;617,102 fPqniiaY9EuNDpDrThoAtQAA UBoQtbHU6EmNgz9b0UoLxQAA A+zQF4TUXUSXaBy1h5DpNwAA False 1.5707963267949 15 fPqniiaY9EuNDpDrThoAtQAA False 1.5707963267949 30 fPqniiaY9EuNDpDrThoAtQAA False -1.5707963267949 15 fPqniiaY9EuNDpDrThoAtQAA clMaroon $00B9FFFF 617,252;617,182 Gqan3fzyME+Ad0vLB1Eq7AAA A+zQF4TUXUSXaBy1h5DpNwAA GFMtIxGPtUO8StFezkB9xAAA False 1.5707963267949 15 Gqan3fzyME+Ad0vLB1Eq7AAA False 1.5707963267949 30 Gqan3fzyME+Ad0vLB1Eq7AAA False -1.5707963267949 15 Gqan3fzyME+Ad0vLB1Eq7AAA clMaroon $00B9FFFF 531,252;406,184 Ph1BMeAEyk6O8p+28amPMQAA R0Gg+Imv5U+CRyTXTxHHiwAA GFMtIxGPtUO8StFezkB9xAAA False 1.5707963267949 15 Ph1BMeAEyk6O8p+28amPMQAA False 1.5707963267949 30 Ph1BMeAEyk6O8p+28amPMQAA False -1.5707963267949 15 Ph1BMeAEyk6O8p+28amPMQAA clMaroon $00B9FFFF 709,252;814,198 odBzfv1YhUqw9yBfMXwqEgAA Q4MU5pVO8kiYViy3yyTVagAA GFMtIxGPtUO8StFezkB9xAAA False 1.5707963267949 15 odBzfv1YhUqw9yBfMXwqEgAA False 1.5707963267949 30 odBzfv1YhUqw9yBfMXwqEgAA False -1.5707963267949 15 odBzfv1YhUqw9yBfMXwqEgAA clMaroon $00B9FFFF 716,267;971,185 CIZlh8EbDEiPxhBalfGaJQAA yt+/f9otyEO1wqB+mI/dzAAA GFMtIxGPtUO8StFezkB9xAAA False 1.5707963267949 15 CIZlh8EbDEiPxhBalfGaJQAA False 1.5707963267949 30 CIZlh8EbDEiPxhBalfGaJQAA False -1.5707963267949 15 CIZlh8EbDEiPxhBalfGaJQAA LoadTimeWeaver nbVJ7vLDkUqPfq7ku+FxPAAA OblryM5O8E62rEJJ9bduJwAA 23 clMaroon $00B9FFFF 558 48 263 85 sdkNone mSvYA1fuTUOAcBL6Rea0awAA 1 LoadTimeWeaver <<interface>> False False mSvYA1fuTUOAcBL6Rea0awAA mSvYA1fuTUOAcBL6Rea0awAA clMaroon $00B9FFFF 144 184 147 43 xrsEPvOdi0Cl/sfPvSfCkwAA 1 SimpleLoadTimeWeaver False False xrsEPvOdi0Cl/sfPvSfCkwAA xrsEPvOdi0Cl/sfPvSfCkwAA False xrsEPvOdi0Cl/sfPvSfCkwAA clMaroon $00B9FFFF 344 188 152 43 OfXVkQi3BEWlOy7wXrd/NQAA 1 TomcatLoadTimeWeaver False False OfXVkQi3BEWlOy7wXrd/NQAA OfXVkQi3BEWlOy7wXrd/NQAA False OfXVkQi3BEWlOy7wXrd/NQAA clMaroon $00B9FFFF 592 188 195 43 Ohrz327qXkWtommrs6hzHwAA 1 DefaultContextLoadTimeWeaver False False Ohrz327qXkWtommrs6hzHwAA Ohrz327qXkWtommrs6hzHwAA False Ohrz327qXkWtommrs6hzHwAA clMaroon $00B9FFFF 356 48 142 46 sdkNone vKy1CmQQ2kiao5Z+XZsFhQAA 1 BeanClassLoaderAware <<interface>> False False vKy1CmQQ2kiao5Z+XZsFhQAA False vKy1CmQQ2kiao5Z+XZsFhQAA clMaroon $00B9FFFF 881 48 99 45 sdkNone Vzw5iM+KfEaYtfY/EIdRdgAA 1 DisposableBean <<interface>> False False Vzw5iM+KfEaYtfY/EIdRdgAA False Vzw5iM+KfEaYtfY/EIdRdgAA clMaroon $00B9FFFF 816 192 203 43 jIE90llJmUmfm/oFc77qtgAA 1 InstrumentationLoadTimeWeaver False False jIE90llJmUmfm/oFc77qtgAA jIE90llJmUmfm/oFc77qtgAA False jIE90llJmUmfm/oFc77qtgAA clMaroon $00B9FFFF 1056 192 174 43 AoIGeJepwECTx2bJvwN2IAAA 1 WebSphereLoadTimeWeaver False False AoIGeJepwECTx2bJvwN2IAAA AoIGeJepwECTx2bJvwN2IAAA False AoIGeJepwECTx2bJvwN2IAAA clMaroon $00B9FFFF 496 276 141 43 /1KkH5/3UkGhYaKA4RSjpwAA 1 JBossLoadTimeWeaver False False /1KkH5/3UkGhYaKA4RSjpwAA /1KkH5/3UkGhYaKA4RSjpwAA False /1KkH5/3UkGhYaKA4RSjpwAA clMaroon $00B9FFFF 716 276 163 43 rNEz3xC7qkW4cvAGDBWkIQAA 1 WebLogicLoadTimeWeaver False False rNEz3xC7qkW4cvAGDBWkIQAA rNEz3xC7qkW4cvAGDBWkIQAA False rNEz3xC7qkW4cvAGDBWkIQAA clMaroon $00B9FFFF 948 276 161 43 FnbD9UskdEywhQpo0Fj7agAA 1 GlassFishLoadTimeWeaver False False FnbD9UskdEywhQpo0Fj7agAA FnbD9UskdEywhQpo0Fj7agAA False FnbD9UskdEywhQpo0Fj7agAA clMaroon $00B9FFFF 260 276 166 43 kvxytqIpQkqLkLNUSMGmCwAA 1 ReflectiveLoadTimeWeaver False False kvxytqIpQkqLkLNUSMGmCwAA kvxytqIpQkqLkLNUSMGmCwAA False kvxytqIpQkqLkLNUSMGmCwAA clMaroon $00B9FFFF 689,188;689,132 cPHVF6oWKkG0Cp6Fm4O2rQAA 3YKShM2MZUaGcuFYxqHrCAAA ZvlbHsrwhUGSOKEszaz2UAAA False 1.5707963267949 15 cPHVF6oWKkG0Cp6Fm4O2rQAA False 1.5707963267949 30 cPHVF6oWKkG0Cp6Fm4O2rQAA False -1.5707963267949 15 cPHVF6oWKkG0Cp6Fm4O2rQAA clMaroon $00B9FFFF 649,188;469,93 4F+fwLQ6yEC51rw6UFN0TAAA fSADN1jGgEeBAJYlmlV4EAAA ZvlbHsrwhUGSOKEszaz2UAAA False 1.5707963267949 15 4F+fwLQ6yEC51rw6UFN0TAAA False 1.5707963267949 30 4F+fwLQ6yEC51rw6UFN0TAAA False -1.5707963267949 15 4F+fwLQ6yEC51rw6UFN0TAAA clMaroon $00B9FFFF 725,188;892,92 HVbd6JvvWUO/yQ6WovZwzQAA gswqLau96EqdMjkmiytVtQAA ZvlbHsrwhUGSOKEszaz2UAAA False 1.5707963267949 15 HVbd6JvvWUO/yQ6WovZwzQAA False 1.5707963267949 30 HVbd6JvvWUO/yQ6WovZwzQAA False -1.5707963267949 15 HVbd6JvvWUO/yQ6WovZwzQAA clMaroon $00B9FFFF 467,188;594,132 89E3FV2/ykKPYnSewgyCagAA 3YKShM2MZUaGcuFYxqHrCAAA eZJbKR4NV0qFAH9yyRubBgAA False 1.5707963267949 15 89E3FV2/ykKPYnSewgyCagAA False 1.5707963267949 30 89E3FV2/ykKPYnSewgyCagAA False -1.5707963267949 15 89E3FV2/ykKPYnSewgyCagAA clMaroon $00B9FFFF 290,187;558,122 COWpb9SzDE+GgqsE6pG52AAA 3YKShM2MZUaGcuFYxqHrCAAA fVlmaVe+jUWZCnYSXiQUvQAA False 1.5707963267949 15 COWpb9SzDE+GgqsE6pG52AAA False 1.5707963267949 30 COWpb9SzDE+GgqsE6pG52AAA False -1.5707963267949 15 COWpb9SzDE+GgqsE6pG52AAA clMaroon $00B9FFFF 878,192;767,132 CgMiN+kZB0OdhrQ8sgX+XQAA 3YKShM2MZUaGcuFYxqHrCAAA ede7XT+PWE6NkzZsU6jmyQAA False 1.5707963267949 15 CgMiN+kZB0OdhrQ8sgX+XQAA False 1.5707963267949 30 CgMiN+kZB0OdhrQ8sgX+XQAA False -1.5707963267949 15 CgMiN+kZB0OdhrQ8sgX+XQAA clMaroon $00B9FFFF 1065,192;820,126 mKmCgpQAxkiGG1gQVUvqnQAA 3YKShM2MZUaGcuFYxqHrCAAA hI2vdd6dykawxYFciO7DegAA False 1.5707963267949 15 mKmCgpQAxkiGG1gQVUvqnQAA False 1.5707963267949 30 mKmCgpQAxkiGG1gQVUvqnQAA False -1.5707963267949 15 mKmCgpQAxkiGG1gQVUvqnQAA clMaroon $00B9FFFF 578,276;664,132 fLUFpbt7XEOaxu0FtqM06gAA 3YKShM2MZUaGcuFYxqHrCAAA U9wuV6COCk+AS+57ef457wAA False 1.5707963267949 15 fLUFpbt7XEOaxu0FtqM06gAA False 1.5707963267949 30 fLUFpbt7XEOaxu0FtqM06gAA False -1.5707963267949 15 fLUFpbt7XEOaxu0FtqM06gAA clMaroon $00B9FFFF 786,276;711,132 g1oTRuQZu06/CU1457gF7wAA 3YKShM2MZUaGcuFYxqHrCAAA NCf1YjlQAUeN2BQd2pSdOAAA False 1.5707963267949 15 g1oTRuQZu06/CU1457gF7wAA False 1.5707963267949 30 g1oTRuQZu06/CU1457gF7wAA False -1.5707963267949 15 g1oTRuQZu06/CU1457gF7wAA clMaroon $00B9FFFF 994,276;758,132 y9OwZGTQOUCy/s4X2KTXbwAA 3YKShM2MZUaGcuFYxqHrCAAA IYOQPzWYK02KPUx7YI/yiQAA False 1.5707963267949 15 y9OwZGTQOUCy/s4X2KTXbwAA False 1.5707963267949 30 y9OwZGTQOUCy/s4X2KTXbwAA False -1.5707963267949 15 y9OwZGTQOUCy/s4X2KTXbwAA clMaroon $00B9FFFF 377,276;619,132 Dz52Mw4I2E6hY9O4e17QrgAA 3YKShM2MZUaGcuFYxqHrCAAA GPXpjzDfNUqTUZVOgqXAXQAA False 1.5707963267949 15 Dz52Mw4I2E6hY9O4e17QrgAA False 1.5707963267949 30 Dz52Mw4I2E6hY9O4e17QrgAA False -1.5707963267949 15 Dz52Mw4I2E6hY9O4e17QrgAA LoadTimeWeaverAwareProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 7dOznD0rYkOncmk4JWP0PAAA 5 clMaroon $00B9FFFF 517 81 119 45 sdkNone NHfbNf3mHU+CjGOsJ9aPNgAA 1 BeanPostProcessor <<interface>> False False NHfbNf3mHU+CjGOsJ9aPNgAA False NHfbNf3mHU+CjGOsJ9aPNgAA clMaroon $00B9FFFF 746 81 117 45 sdkNone OFapkoq+jkSh9RkSxTL/PgAA 1 BeanFactoryAware <<interface>> False False OFapkoq+jkSh9RkSxTL/PgAA False OFapkoq+jkSh9RkSxTL/PgAA clMaroon $00B9FFFF 592 188 201 43 LJYO9aCHk0ub9JVy3zn8DAAA 1 LoadTimeWeaverAwareProcessor False False LJYO9aCHk0ub9JVy3zn8DAAA LJYO9aCHk0ub9JVy3zn8DAAA False LJYO9aCHk0ub9JVy3zn8DAAA clMaroon $00B9FFFF 669,188;600,125 +j4f2BkOHkW12/xFIV44RQAA B6Aw1g4WeEKGifKIi2Ag8wAA hVPHg+2OX0eCw/dWF8blXgAA False 1.5707963267949 15 +j4f2BkOHkW12/xFIV44RQAA False 1.5707963267949 30 +j4f2BkOHkW12/xFIV44RQAA False -1.5707963267949 15 +j4f2BkOHkW12/xFIV44RQAA clMaroon $00B9FFFF 714,188;781,125 nVSk609yHES4jAATVDDpewAA BqCY0zuGhEOWA81VCFybvgAA hVPHg+2OX0eCw/dWF8blXgAA False 1.5707963267949 15 nVSk609yHES4jAATVDDpewAA False 1.5707963267949 30 nVSk609yHES4jAATVDDpewAA False -1.5707963267949 15 nVSk609yHES4jAATVDDpewAA ClassPreProcessorAgentAdapter nbVJ7vLDkUqPfq7ku+FxPAAA P+Bu6yW2VEahorrkAvrGXAAA 7 clMaroon $00B9FFFF 500 80 129 59 sdkNone RuWGm6XIgUKcD29SetZSXwAA 1 ClassFileTransformer <<interface>> False False RuWGm6XIgUKcD29SetZSXwAA RuWGm6XIgUKcD29SetZSXwAA clMaroon $00B9FFFF 467 218 194 43 N2LrGVOklEOysrIcFWeipAAA 1 ClassPreProcessorAgentAdapter False False N2LrGVOklEOysrIcFWeipAAA N2LrGVOklEOysrIcFWeipAAA False N2LrGVOklEOysrIcFWeipAAA clMaroon $00B9FFFF 563,218;564,138 hR343UR5kEqsVzwbX6xgTgAA SVsGs0wJoU+zyBXHu/hw9QAA Et6RzPipFk2imyQvfP0R5wAA False 1.5707963267949 15 hR343UR5kEqsVzwbX6xgTgAA False 1.5707963267949 30 hR343UR5kEqsVzwbX6xgTgAA False -1.5707963267949 15 hR343UR5kEqsVzwbX6xgTgAA clMaroon $00B9FFFF 736 80 129 72 sdkNone qy/vg1sj2kyj5aXxVKnjlgAA 1 ClassPreProcessor <<interface>> False False qy/vg1sj2kyj5aXxVKnjlgAA qy/vg1sj2kyj5aXxVKnjlgAA clMaroon $00B9FFFF 760 218 80 43 1c5qi68xYUm5xxKPBymcQwAA 1 Aj False False 1c5qi68xYUm5xxKPBymcQwAA 1c5qi68xYUm5xxKPBymcQwAA False 1c5qi68xYUm5xxKPBymcQwAA clMaroon $00B9FFFF 799,218;800,151 0zp21yPDFUOtwUbGU4FrNAAA KiejmKrORE+Q8XonBRdQlAAA GQjRGJlN/keaTsHJt7YtlwAA False 1.5707963267949 15 0zp21yPDFUOtwUbGU4FrNAAA False 1.5707963267949 30 0zp21yPDFUOtwUbGU4FrNAAA False -1.5707963267949 15 0zp21yPDFUOtwUbGU4FrNAAA clMaroon $00B9FFFF 660,239;760,239 yp3GyjE0X0SDo79nZd13fAAA GQjRGJlN/keaTsHJt7YtlwAA Et6RzPipFk2imyQvfP0R5wAA False 1.5707963267949 15 yp3GyjE0X0SDo79nZd13fAAA False 1.5707963267949 30 yp3GyjE0X0SDo79nZd13fAAA False -1.5707963267949 15 yp3GyjE0X0SDo79nZd13fAAA False -0.523598775598299 30 epHead 0JmXmmja/kSGorRt0Y/JgQAA False 0.523598775598299 30 epTail V5Btfhv+B0KaLgIqIlmyFAAA False 0.523598775598299 25 epHead 0JmXmmja/kSGorRt0Y/JgQAA False -0.523598775598299 25 epTail V5Btfhv+B0KaLgIqIlmyFAAA False -0.785398163397448 40 epHead 0JmXmmja/kSGorRt0Y/JgQAA False 0.785398163397448 40 epTail V5Btfhv+B0KaLgIqIlmyFAAA False -1000 -1000 50 8 0JmXmmja/kSGorRt0Y/JgQAA False -1000 -1000 50 8 V5Btfhv+B0KaLgIqIlmyFAAA 259 MessageSource nbVJ7vLDkUqPfq7ku+FxPAAA 3 P5zEUbNQjUGAkByLIMWWrwAA kVeuaWGXi0CUzPCKXRAaegAA Whc4lNlyGUOdhVedFlSi1AAA 2 0Ocn0pEuqEi2aYQ3rlsIPwAA MrF4o3QD60awdIPXXMRJFgAA 3 getMessage N0GyyWJ2P0+EfQhGk1OcUAAA 4 String code WoTlKKfUvU+eb++Fw53kAwAA Object[] args WoTlKKfUvU+eb++Fw53kAwAA String defaultMessage WoTlKKfUvU+eb++Fw53kAwAA Locale locale WoTlKKfUvU+eb++Fw53kAwAA getMessage N0GyyWJ2P0+EfQhGk1OcUAAA 3 String code PLRr/Xyt/0Sz6Rt7RQHJBAAA Object[] args PLRr/Xyt/0Sz6Rt7RQHJBAAA Locale locale PLRr/Xyt/0Sz6Rt7RQHJBAAA getMessage N0GyyWJ2P0+EfQhGk1OcUAAA 2 MessageSourceResolvable resolvable D8JKcqym3Ua9hFlgLVgHMQAA Locale locale D8JKcqym3Ua9hFlgLVgHMQAA ApplicationContext nbVJ7vLDkUqPfq7ku+FxPAAA 6 tOEnNaHFUkie48iRtDEhgAAA JSKk4ALmskeFqtFf4LIckwAA tvmG2+ATXEu2jf/ep/bu1wAA vEPXSD5tf0up5bqmfTh3PQAA xNp1+ArWGUa3myRVaC8NPwAA Fmll1/tcikCaGRIdGXaDrwAA 2 0Ocn0pEuqEi2aYQ3rlsIPwAA OGrXT3XG+kanO2I1fck1wQAA nbVJ7vLDkUqPfq7ku+FxPAAA 0y8Zj3msL0+htXOAjlNa7gAA N0GyyWJ2P0+EfQhGk1OcUAAA 4 cmFee5zZkE+6odw8ocpNjQAA rDmddoCRUUSeQgUl8WCBhQAA 5+Vy+bCdF0mV5W6l+zhpjgAA ZdPzCss5tE2m7/4GOUqAmwAA HierarchicalMessageSource nbVJ7vLDkUqPfq7ku+FxPAAA 3 jCWpb1cIBkCtHVt9LYdr+wAA IOISbdLjWEax4IEtEGG2FQAA HwhHndrLdUuzZC6ZsDNMZgAA 2 F8UGr8IQTEWGA69tMYN7RQAA Jij7ik3mo0urWW7HUWPdXgAA 1 MrF4o3QD60awdIPXXMRJFgAA 2 setParentMessageSource DSG78/UVM06M+X3qbPLI1gAA 1 MessageSource parent 6+q0jK4iYkyiTVK8RsNXBwAA getParentMessageSource DSG78/UVM06M+X3qbPLI1gAA AbstractMessageSource True nbVJ7vLDkUqPfq7ku+FxPAAA 4 74hJgviwvkqYapWaZp0TKQAA BunpJ9ajc0i0MwxYzm/sLQAA sKD4MhDCNkmrwqrOIIfpCQAA gRjaT+WGhEG/kbFq/nv97gAA 1 F8UGr8IQTEWGA69tMYN7RQAA 2 LOhY6ybYhEitJn+IVt2vGwAA HpWR0LY+eEydhp8C8FOpQAAA AbstractResourceBasedMessageSource True nbVJ7vLDkUqPfq7ku+FxPAAA 4 ZB2x0kRIHUeqsrXWOuFY0gAA 3mOPIEbBB0SeKC5fDYmw3wAA zXaSEFHFyEe/jjtZC1b2oQAA NhbmSl5ZoUS4cMz2EMIWhwAA 1 LOhY6ybYhEitJn+IVt2vGwAA 2 koXHm+IC50eDcSO0u98zoQAA toitlf7TLEqeedacAM8I3wAA ReloadableResourceBundleMessageSource nbVJ7vLDkUqPfq7ku+FxPAAA 4 7WOaPLVDskeg/hUE4XqEYQAA aYnWHEYWUkyucSm1tMbGzwAA WlgVgNvR2UyPHCO6rlnFlgAA d3e6fq0E4EapzMoQPjNifAAA 1 koXHm+IC50eDcSO0u98zoQAA ResourceBundleMessageSource nbVJ7vLDkUqPfq7ku+FxPAAA 4 fL/pwY/A1EK4udFQBuI4eAAA lBJukR85Xkuj54M0M1gxKAAA u913ukxkj0uZpzeDYrVc/gAA dBeghjIdQkGO3BZP7Zo/wQAA 1 toitlf7TLEqeedacAM8I3wAA StaticMessageSource nbVJ7vLDkUqPfq7ku+FxPAAA 4 H/bA7qrGF0G7ufP17NMATAAA JLOxV5yf00KU4wgVAg6SmQAA ITqpzeOdOkutdlO9/YH6wAAA kVH4Oq1uk0entWFNE4dnPQAA 1 HpWR0LY+eEydhp8C8FOpQAAA nbVJ7vLDkUqPfq7ku+FxPAAA DSG78/UVM06M+X3qbPLI1gAA N0GyyWJ2P0+EfQhGk1OcUAAA 4 pW2d/pPwVUC6dD2zmOCmywAA nVjOaW3JYU+3g0sifZtuGQAA htXgZdGSgk2lgiKzEYlTVgAA 21YhoToRpE6evZ8QAHuaVQAA nbVJ7vLDkUqPfq7ku+FxPAAA FekxXBbgOkSw/rezJuFNuQAA DSG78/UVM06M+X3qbPLI1gAA 4 ttNNXPrnZ0u0YTwtyG5uKwAA V3R66/DLFUSS8++Ly1us1gAA LCBZB/n7+kqo5UIiTrJjUQAA rahaI7hv506VyCaF/VO7bgAA nbVJ7vLDkUqPfq7ku+FxPAAA oQSAhdZprUuJ4jy1NUjefgAA FekxXBbgOkSw/rezJuFNuQAA 4 z2LgnRidv06RFkkmRa2XkQAA rFwjUQBUzEG/NaQgTeVxGgAA yK453UH57kuW5izL097MMgAA vpHGl0IOrUiPH9IZeNlHOQAA nbVJ7vLDkUqPfq7ku+FxPAAA eOZB4CaViUaWt4Fag3FznwAA FekxXBbgOkSw/rezJuFNuQAA 4 wbSjfkgh/U27jVWY1DcwCwAA MZgR9uAjAkS0UDPqj9drdgAA voiEvmojr02UzIS+hUDazgAA HoOkKi/Mh0+pKWJWkEhtjgAA nbVJ7vLDkUqPfq7ku+FxPAAA XdacIQrrDk+sMUYcwmGtdwAA oQSAhdZprUuJ4jy1NUjefgAA 4 Jv93L+h87UGAeCA2h4WpcQAA ZUrWrF2GjEamxpibFZIxnAAA 7ag/4OXh70a7jD8MAUaNUAAA w7gHfpLbGUm01u/Mar/GHwAA nbVJ7vLDkUqPfq7ku+FxPAAA s+J6UF9WGEu8/4EQz/82JgAA oQSAhdZprUuJ4jy1NUjefgAA 4 ZSC7Np1hEkKpaD+A7JTXrwAA NUZ9X8L0k02OB4c+CrIOWQAA bZcxcP7Ti06xOp9C1jL5ywAA A9IJ1rQqXkycinx5iUtjYwAA DelegatingMessageSource nbVJ7vLDkUqPfq7ku+FxPAAA 4 LkshCXYJW0+5jV4ZKto5fAAA /rE5p7t0tEyiM04D92aSDAAA CUidhxr/aU6CqRFOg4YARwAA MUIme25f4EuMn3ejdM9mMQAA 1 Jij7ik3mo0urWW7HUWPdXgAA nbVJ7vLDkUqPfq7ku+FxPAAA x2yGQa1uNUqSR4mVUxOWnAAA DSG78/UVM06M+X3qbPLI1gAA 4 aIIr5bbJCkOpXn1s1PZNNQAA ctuqwb0HrkGVHWIYHYAu2AAA 5by5PLh0FEyiXTuLu/Md2QAA jsAC9Xc0LUip85N4XDORPwAA EventObject nbVJ7vLDkUqPfq7ku+FxPAAA 4 qixyM59J202ahpTjlo2iBwAA a6lN5VxT00W4EBFYOVpsvwAA 3ULEwzgGakWkqLVRAlyqMQAA PMEcBcCSz0msNslgpcc8owAA 1 gjwIYiPr1EaMhTCS7BZUDwAA 1 getSource XoegHkPPlU2b3omMBVA+1wAA ApplicationEvent True nbVJ7vLDkUqPfq7ku+FxPAAA 4 Q1JMU1sBYk6PfVyrGcXPkgAA P0gBky4CFUuLlfkzbmbBawAA ea1C5B/6g02PrP2blsnzDgAA CinCqIJP6E2Zy93JOfUyJQAA 1 gjwIYiPr1EaMhTCS7BZUDwAA 2 +c42xBJ4M0WMWIBIEi27bgAA eu26nX3pWkS6xF4fY+DQggAA 1 getTimestamp TWUnzp936E2mO+5RtbUpzAAA ApplicationContextEvent True nbVJ7vLDkUqPfq7ku+FxPAAA 4 WhppwMSqCU69QB2sQKgKtgAA I/kPkeoebke87qkwVzU8NAAA X1IXFecXmEyh3b2PrGt11wAA srplj8bFdEWwJ/F8/LeyqAAA 1 eu26nX3pWkS6xF4fY+DQggAA 4 QtF1NmQKMUajA5nD3Fvp1AAA 2IBrvtmIsU6OWCo2eklZCwAA KihW0Xh5w0CtXl7pfSLFjAAA 2vzF0I8epEWJke/b1mQrvwAA 1 getApplicationContext ubulBBsBxEy4iQKNCsPNAwAA PayloadApplicationEvent nbVJ7vLDkUqPfq7ku+FxPAAA 4 xAJDNKnHMEuwzkklW5BssgAA QfxDCTaFpEGMQpcyHRWvhAAA EvzooQbCMEakGVIni8SoBwAA z5r3wQjIskqD2qBS/ld6TQAA 1 +c42xBJ4M0WMWIBIEi27bgAA 1 getPayload 0qZp6aJp7E6Olj7ITfl/SAAA ContextClosedEvent nbVJ7vLDkUqPfq7ku+FxPAAA 4 9yuSkmGuqEqm4Z/Nmvva5AAA dHrnxRfspk+9Hx0BnEQ2DwAA dbhKk8BBsEWKoCt/tUOF2QAA /kHtVIaP+EedOiqCQE0gBwAA 1 QtF1NmQKMUajA5nD3Fvp1AAA ContextRefreshedEvent nbVJ7vLDkUqPfq7ku+FxPAAA 4 5bUbEVcMQESU9rv6m3Kf5gAA TXcsn48bm0KTjAvPivKWBgAA FCfoCUY280SfuWTEvlZnKwAA xw/jBW8JDk+0L1SvwdgkjgAA 1 2IBrvtmIsU6OWCo2eklZCwAA ContextStartedEvent nbVJ7vLDkUqPfq7ku+FxPAAA 4 /Tf9C4RySUauLCNCWiIsrAAA EdlVrM0Ql0eqAVwR7m+cowAA 57AQCBdKAki7MwAD3ndnfwAA YSBrrRqxoUCCYRZrUyDOZgAA 1 KihW0Xh5w0CtXl7pfSLFjAAA ContextStoppedEvent nbVJ7vLDkUqPfq7ku+FxPAAA 4 FKAnZfqoPUGKwWWz1BWHvwAA qkTrBpoeGUmFNN4yjCYxlwAA NRyWZhFEZkmy7QiEpB32BQAA 5K+1vC3kck6oz+1r05+ZhQAA 1 2vzF0I8epEWJke/b1mQrvwAA nbVJ7vLDkUqPfq7ku+FxPAAA TWUnzp936E2mO+5RtbUpzAAA XoegHkPPlU2b3omMBVA+1wAA 4 l2lC4FmWY0SWBKEw0+qPCAAA GxFVEkZ42UKbMxf87YRPKQAA HITkq4Hq30Su/bxWMugYeQAA tlAqvaU5m0Gb4FD5iyuTigAA nbVJ7vLDkUqPfq7ku+FxPAAA 0qZp6aJp7E6Olj7ITfl/SAAA TWUnzp936E2mO+5RtbUpzAAA 4 ll+pU/HuK0+oPNthomX+2QAA GcfpQhQVC0CUIHlEAOpBdgAA Tn3iaRwKB0K8WsFwh4fyPAAA 7D8mCMbJEkyU0/PbFx5qmwAA nbVJ7vLDkUqPfq7ku+FxPAAA ubulBBsBxEy4iQKNCsPNAwAA TWUnzp936E2mO+5RtbUpzAAA 4 04NpME1VKE63MuxIf2EkeAAA AEjrqSBj+kShNF7a/S0LjwAA zWe52i/jQUWrWQ5HSbAcIwAA 2WbvozU1R0uAUNbbqwE+RAAA nbVJ7vLDkUqPfq7ku+FxPAAA 5gePSHxIvUqh4Vq+53wX+QAA ubulBBsBxEy4iQKNCsPNAwAA 4 UjRWjHhcv0eDC5C858rDGwAA x+iRJavkqkSEZMTehDtutwAA VcKa0SOBe0SOHYcY5cKggQAA 5iyGsRKxrUyWR3kCZ+z1HgAA nbVJ7vLDkUqPfq7ku+FxPAAA pf4bpK9lxU6eU/krI/EwCgAA ubulBBsBxEy4iQKNCsPNAwAA 4 D2DOTfNp9kuxcn60VQrRXgAA XaZNrz5BeEm1Mw0e8K6UQgAA WaEfEKgGv0m/Qr1okp5j7wAA hZJOo61Ou0qo/tpLwPKmQgAA nbVJ7vLDkUqPfq7ku+FxPAAA 39kdtADnc02+bKtGZ/CHsAAA ubulBBsBxEy4iQKNCsPNAwAA 4 8tdk7OJ18kCazUdEInw9yQAA q/ZB7a/17EmyEZLiBB05lgAA 8LB4n8lbBkGwPOktxcIutwAA W3xFWqmH60qiBw+RaL03MgAA nbVJ7vLDkUqPfq7ku+FxPAAA wSXBI2S1qUa3oFXPfNADHwAA ubulBBsBxEy4iQKNCsPNAwAA 4 I5uy5jAGeEO4HBjW/C/ezAAA V3GjTSuIcUqyWzeoTOiXoQAA hJLNad/GjESAAlcEKRaNIAAA OPOVwtdrq0SjtDTmHsiLWgAA ApplicationEventPublisher nbVJ7vLDkUqPfq7ku+FxPAAA 3 GuLBC/dL2E6Ue5171eUfoQAA px8aRwuYEEGMTTvqFHeQDAAA 4UkroYpOmkiFeSkURR0MrgAA 1 OGrXT3XG+kanO2I1fck1wQAA 2 publishEvent le+bpZa5rUGqpmoiG0RftAAA 1 ApplicationEvent event 47EVa0cQDkuC5Fj6P8GxBgAA publishEvent le+bpZa5rUGqpmoiG0RftAAA 1 Object event +CkbgL6TfkmYSfqyAbIZcwAA ApplicationContex nbVJ7vLDkUqPfq7ku+FxPAAA nbVJ7vLDkUqPfq7ku+FxPAAA 0y8Zj3msL0+htXOAjlNa7gAA le+bpZa5rUGqpmoiG0RftAAA 4 A8oJZCAoiEKPnOm9OV0cnAAA Fl88kFhu7kq1DNr3c0fjmQAA /Zsr7sOzTkSxpgkYybRuQgAA tlIJ21xSaU+N0IyK4CdO6wAA ApplicationEventMulticaster nbVJ7vLDkUqPfq7ku+FxPAAA 3 53VAFtHED0WQGcVb3xJ61gAA Og/dd0rIu0qSbfHFlrSjDwAA Kz/vE7FGNk+qL2I0M/XdHAAA 1 /5yITSQGI0KgAWIAH0ku4gAA 7 addApplicationListener vNk/lP0usEmXuXiziw6gsgAA 1 ApplicationListener<?> listener WYAPIdvkjkm0mjdSJMYTdwAA addApplicationListenerBean vNk/lP0usEmXuXiziw6gsgAA 1 String listenerBeanName D0QMR0zA5EmyDW4UI57/OgAA removeApplicationListener vNk/lP0usEmXuXiziw6gsgAA 1 ApplicationListener<?> listener yqi9L+sqmkec+HmLxrV3kAAA removeApplicationListenerBean vNk/lP0usEmXuXiziw6gsgAA 1 String listenerBeanName gu12v2EITE604ONwtn8o7wAA removeAllListeners vNk/lP0usEmXuXiziw6gsgAA multicastEvent vNk/lP0usEmXuXiziw6gsgAA 1 ApplicationEvent event +HwEcYhopEGJFhC1dNJZKgAA multicastEvent vNk/lP0usEmXuXiziw6gsgAA 2 ApplicationEvent event TzNk8Uy6w0u0rokgOxKUGAAA ResolvableType eventType TzNk8Uy6w0u0rokgOxKUGAAA AbstractApplicationEventMulticaster True nbVJ7vLDkUqPfq7ku+FxPAAA 4 Vxk3+fx4DkyeA2MTbzOeSAAA mg/4cphq40mjV55YR3d7sQAA JsZQeSgyxUGiKCDrwbSjfAAA SBnXdbPhtU6FThZRDYtn9QAA 1 /5yITSQGI0KgAWIAH0ku4gAA 1 3sthH3dxpEa70/weoKRZXwAA SimpleApplicationEventMulticaster nbVJ7vLDkUqPfq7ku+FxPAAA 4 2WI2IOAUuEKB9PPpQnFVNAAA xSa2sDtqj0iawJWfrSyxYgAA PpEgkfl6m020YBwlSb4y9wAA pQ7gyr2Ey0i2MC2NORwDAgAA 1 3sthH3dxpEa70/weoKRZXwAA nbVJ7vLDkUqPfq7ku+FxPAAA 1whQCQJugUSX74p1mPhNTQAA vNk/lP0usEmXuXiziw6gsgAA 4 VUPNR2MIKkKD1IBYi1ayUAAA sT8eImgCNECh8+jAbHBS0QAA 5IL8ufMVfk2BTqXmzlAR6gAA 7Fp6nVkBEUGr8b9yTg2baAAA nbVJ7vLDkUqPfq7ku+FxPAAA ERUb/gBJcka7rpIMPllLZQAA 1whQCQJugUSX74p1mPhNTQAA 4 rA1ZH9jF8EukI2HFP6W/7gAA EMSjtR2ZSkuw2tr8pkO93AAA uScBwYRwQk+dTIxshE12EwAA aTJjUsxPGkyfJ++6/0R44gAA EventListener nbVJ7vLDkUqPfq7ku+FxPAAA 3 6fDfE2r2gkevPsFAyFe0twAA Qyzc2dcsM0aY+17vaIaIWAAA BpK73XerIU+s6ncsKBDzsQAA 1 nc8ietuWcUmASxhTcizVeQAA ApplicationListener nbVJ7vLDkUqPfq7ku+FxPAAA 3 8wRejbmt7kSfF9OXF7IPHgAA pdSRxQFQnkaebDHrETyYUgAA NpTezOKQcke0CKvaW+IuAgAA 1 DWNbcOr6dEKHwD0OnJ9j8QAA 1 nc8ietuWcUmASxhTcizVeQAA 2 cJjOdws0HUOsM+qWTSmXsAAA SQejy3/yUUqZbazigarrEAAA 1 onApplicationEvent w/QeTfObKUW+Wlags0GOSQAA 1 E event VPlzQHJnBk2XrTFymMshSgAA ScheduledAnnotationBeanPostProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 4 +U50EPMznUGRc1WfLNM0wgAA Ma7wj4Ng/EuSuh+2IrtdUQAA Mtjijvaw3EOZkY7qZoia2gAA flsV28Oos0e1fuypo1IJOQAA 1 DWNbcOr6dEKHwD0OnJ9j8QAA SmartApplicationListener nbVJ7vLDkUqPfq7ku+FxPAAA 3 g408tfbKHUCu1gTqL1ki7AAA Ov0M3R/+30izzXJM1ZSR2QAA 0A3hYb97rke2pg/if8d4uAAA 2 60rB+MFsMkyOzT7Foaj1FQAA ClhHPSGdyUK9xYmZoBZ09QAA 2 cJjOdws0HUOsM+qWTSmXsAAA mgKVKSSLwk2Gv/ARJsU3QAAA 2 supportsEventType xN4XVzYq4ka9cv/+dtYsiAAA 1 Class<? extends ApplicationEvent> eventType 8Y4vadQYOEWNGJ5PzLKTEgAA upportsSourceType xN4XVzYq4ka9cv/+dtYsiAAA 1 Class<?> sourceType nVjXc9acaEKicT2UMj9pBwAA Ordered nbVJ7vLDkUqPfq7ku+FxPAAA 9 4RS2Jb6YpkaNlVcoCLN2GQAA Jfe4202UvEKeDT0TM706OQAA 1nQOZgKtc0OLuEAwTdkODgAA MoRtTCDc8UKQkVgyAwAKHwAA kQYa00o2wEmHVfcpPTUCrAAA +jQveyeTfUuMl1mVLgTLvgAA fiY6sQPnWEWZMNXhmwkKvQAA VLjiFe8xx02Zdctc0p7l/gAA 4BdlLM4nzEaVNoF6rc2WWAAA 2 tdcdeO3rXk+RSnA7ldpUrQAA a2JNr0/XXUigJC6urdwOlgAA 2 mgKVKSSLwk2Gv/ARJsU3QAAA MR4TSK+hNUO1g1iReeWv8AAA 1 getOrder NHtPpn7SE0WAntXGhegIOAAA nbVJ7vLDkUqPfq7ku+FxPAAA w/QeTfObKUW+Wlags0GOSQAA HotHSCEJJUacPbS+UF8aIgAA 4 NZjVXnjt/kmbw6eoGlaFlwAA KmIVtQwMOUee0Sv5IabKGwAA YTwpz2ijuUSr0Tt9ptJJxwAA cap6A4qiIUCtotll5EscpwAA nbVJ7vLDkUqPfq7ku+FxPAAA tWn7n0oxwEe2T+UlWS95LQAA w/QeTfObKUW+Wlags0GOSQAA 4 euGDGiJf/EWZClwND/5+UgAA d3hVoOQEYEeTPwckHFz1SwAA h46HdTKxtUqywHlR9vMzjgAA L4WiN5qO40S36xyuzJmGtAAA nbVJ7vLDkUqPfq7ku+FxPAAA xN4XVzYq4ka9cv/+dtYsiAAA w/QeTfObKUW+Wlags0GOSQAA 4 pOf5brbIRkmC7I6Beh3QwwAA s6+WdAefD06yABEgP8Zi/QAA 7vKESSWJJkSNKtcnRXM5uQAA 6EJcP6mV1kqmi1H+U+BWQQAA nbVJ7vLDkUqPfq7ku+FxPAAA xN4XVzYq4ka9cv/+dtYsiAAA NHtPpn7SE0WAntXGhegIOAAA 4 DQd0iM5EtE+SbLIJPVxLZAAA b6q0ltNyE02qwp3U7ziUTwAA b9D5NfALI0Ca3xUgfBy98gAA YSqeTelHzkiWmoJlslu0pwAA GenericApplicationListenerAdapter nbVJ7vLDkUqPfq7ku+FxPAAA 4 iBpyFD4S3Ui0qmkLjspCMgAA LpSSt63bWkCi5XvB9ZvgYQAA NVTjn6K7fkuS1K2NvCQ0aQAA HPEiRlDMv02KbjlVp2jjGQAA 2 60rB+MFsMkyOzT7Foaj1FQAA cXeIcb5PG0ynAKPWP69+UwAA SourceFilteringListener nbVJ7vLDkUqPfq7ku+FxPAAA 4 TP72j2XuzUagWOPiZOZeXwAA IhxX2d+99UqqdHwM92cqtwAA yfBOtRvm3kCHvpTt2d5BxQAA D95QaW1cb0ux5Q0/YhqzuwAA 2 ClhHPSGdyUK9xYmZoBZ09QAA GlHIHdQaYk2PNkgJ+1zlxQAA GenericApplicationListener nbVJ7vLDkUqPfq7ku+FxPAAA 3 kFo4HPe0JU62ay2VQQlaUgAA OvS61LuUXUC9O6SmAU4CeAAA lwuz29g3MUGioT4KOJo6KAAA 3 cXeIcb5PG0ynAKPWP69+UwAA GlHIHdQaYk2PNkgJ+1zlxQAA hluULwluMEaTYUxIOH8XqAAA 2 SQejy3/yUUqZbazigarrEAAA MR4TSK+hNUO1g1iReeWv8AAA 2 supportsEventType(ResolvableType eventType) Zva4WgoxnUqOemuu2LywAAAA supportsSourceType Zva4WgoxnUqOemuu2LywAAAA 1 Class<?> sourceType NFD3BRU6R0OdAV/kJyYOFAAA nbVJ7vLDkUqPfq7ku+FxPAAA Zva4WgoxnUqOemuu2LywAAAA w/QeTfObKUW+Wlags0GOSQAA 4 wRX7y4mOYkqcJCUMd612UwAA 3FUuVB6TI0ioAUpZ7i0frQAA XI212nEVGE6ikAsia0Ms+wAA av2gTtCCPUmsT/J9XgyBCgAA nbVJ7vLDkUqPfq7ku+FxPAAA Zva4WgoxnUqOemuu2LywAAAA NHtPpn7SE0WAntXGhegIOAAA 4 j9ARP1SYQ0SUZ1UjKxtgAQAA aW8UVX2QikKmiFQFqDOUAwAA Le95IXKgi0ayeANjoCr/OQAA QL9D7PNtAU2kFvAb5wwp/QAA nbVJ7vLDkUqPfq7ku+FxPAAA JZp+EhwlfEGcn9ncMFKvYwAA xN4XVzYq4ka9cv/+dtYsiAAA 4 jPrXMHItk0i1/9HCkjkEkAAA 1kmU7E4mc0GKve+QhcMAGQAA O32Jmh3U0kWXjynd/iIWBAAA 8aHktMlngUiFKDVWTSvhbAAA nbVJ7vLDkUqPfq7ku+FxPAAA 0KNeCXSfQ0Osy6GR/ehiRAAA xN4XVzYq4ka9cv/+dtYsiAAA 4 TfNWMcQTlUOXR6/p9eswpwAA 0HqyiXQ7BUGn0mb6OoWODAAA GQNkBTb+ZUSev1VkTvwNFAAA AjXa3aAsEEOda8vKYAOEAAAA nbVJ7vLDkUqPfq7ku+FxPAAA JZp+EhwlfEGcn9ncMFKvYwAA Zva4WgoxnUqOemuu2LywAAAA 4 fs+rkT0xbEOB0DeErPnWDwAA +wgnYHqL+EiJYvjQTyO0SQAA N3ZWwK+JLEWFs4WTZLzaUAAA YsgaHgjjGkq2+bzqB/e8IgAA nbVJ7vLDkUqPfq7ku+FxPAAA 0KNeCXSfQ0Osy6GR/ehiRAAA Zva4WgoxnUqOemuu2LywAAAA 4 QLkhb64HmESKvBrZmKuf3gAA NlwxsB9lmEWbX7s7CWgqBQAA 6WWPbPQ9tUmLbYxwwObrWgAA BYu6itClAEyUF4Kq0BRnLQAA ApplicationListenerMethodAdapter nbVJ7vLDkUqPfq7ku+FxPAAA 4 9uhcFxKyZE6Lv7fexlgerwAA B8NAZm32pUGofRtwQEhSRQAA ILYxSZFzbUSG4oOArazagQAA caQN3Hpah0CgkvkKqCjoHQAA 1 hluULwluMEaTYUxIOH8XqAAA nbVJ7vLDkUqPfq7ku+FxPAAA 85mgvVDsrEWg3MFCJBha/gAA Zva4WgoxnUqOemuu2LywAAAA 4 d6ViWNTw/EiR4vPmJ4pl1wAA mYyQi0vXPkGG2PlqD8Lw6wAA AGO/UPsK70qLB5oW+wGUFQAA kN88x+vvU0SzKdeGUYPKCgAA Comparator nbVJ7vLDkUqPfq7ku+FxPAAA 3 SjcDrTce7UG7zqF30ytmmQAA twc4GRsWGU+ZP6fNfI+OzwAA /TuNFk/LoU2Cta1dBpaqZAAA 1 Rs534Ei6Y0ufoFO5kFgqLAAA OrderComparator nbVJ7vLDkUqPfq7ku+FxPAAA 4 5QM/H32UM0uekEy0CBgJ/wAA Wdwblk7kUE2HrjY57o/obgAA 3k7Ud9G4P0KYMcAatxCIoQAA O3YAlbarmkKdEEWyVbE8ugAA 1 Rs534Ei6Y0ufoFO5kFgqLAAA 1 hvmgBsiqOUKGO/o0tZ8zSQAA AnnotationAwareOrderComparator nbVJ7vLDkUqPfq7ku+FxPAAA 4 +qbRdms6wUegWHjwYbylkwAA FEY3I6BIrEy+UGIpElMAXwAA v6t5ZuycekyOHeC1C+80xAAA QYfSLsbB40KtRP/aFB1bFAAA 1 hvmgBsiqOUKGO/o0tZ8zSQAA nbVJ7vLDkUqPfq7ku+FxPAAA RhhDhWIZW02tdUHFSm2UXAAA 8R1GK9Gcl0aN/Uu/04nQcgAA 4 ep8/6NDrTUqzVbaOkefRRwAA MQlMRnlFt0SDidsMCUMRFAAA kdqDdAmm70CJRBCwePVwtgAA HeGWfbXTZ0OZIm5ftigxXgAA nbVJ7vLDkUqPfq7ku+FxPAAA wf+tR6l62U+LaSOYUtlp2QAA RhhDhWIZW02tdUHFSm2UXAAA 4 mGdoePBx00uW2nntj13qpQAA gp4WgT3RsEqqREsrkMP6+QAA xgGpvuX/f0uPnWHQsp4jSgAA /e7IeSnlHUqv3RdpRE0T7QAA AutowireCandidateResolver nbVJ7vLDkUqPfq7ku+FxPAAA 3 Dz8xuputi0qXQYcC/YyEeAAA f0PbThIMPECOdSPh7NWUCgAA qWtRPNwm1UKBxzWySnCy1AAA 1 K7E/QmKriEGL+e1cNAaRTAAA 3 isAutowireCandidate fqgr8TXsT0G1c092OaWqDAAA 2 BeanDefinitionHolder bdHolder A5HFhamrwUmMnQCVfrDIAQAA DependencyDescriptor descriptor A5HFhamrwUmMnQCVfrDIAQAA getSuggestedValue fqgr8TXsT0G1c092OaWqDAAA 1 DependencyDescriptor descriptor OkMNjLxq+k2rndXlA/XEswAA getLazyResolutionProxyIfNecessary fqgr8TXsT0G1c092OaWqDAAA 2 DependencyDescriptor descriptor waExVJe0XUKtEH2j5zf4awAA String beanName waExVJe0XUKtEH2j5zf4awAA BeanFactoryAware nbVJ7vLDkUqPfq7ku+FxPAAA 18 AIzJNx/aDEKWKj4dT+9mUwAA B78FAzWFzEWZeY3MFScmQQAA 0x10BXCNNEO5NOS0q2PmKwAA 0Xu7KudUckqsuJ3aHS7bpQAA qaOwCYPHfEekv8K0ERXUWgAA muDWy5v+X0e7yuveY5cwFwAA US/YqO3Do02+lBojcRBo5QAA QfhFAwEQdEq5OdE6Se0hgwAA PAzH6Re+mUuIKbI4caEbpwAA j4Z/PoCOk0uiqb/1qIYVBgAA qxJm06Y6D0mJz89gqxfpvgAA cxwNSWeNt02NJCnq09hoKAAA R0Gg+Imv5U+CRyTXTxHHiwAA poksrdzx90OohQQODMirHwAA a8fukmeklEiBPLXJy4AxTAAA BqCY0zuGhEOWA81VCFybvgAA PifbYLg/9kW2zCt27gcLHgAA abktgRM4JkWHKz+utWIyJQAA 6 sPfw+0rAdkCdbssoqEI/fgAA YOwCmAEwwk6j/BxRVT9UGQAA u5/dcwPhJEyCHfdfpzEpyQAA 1gQwnFVO00CDppgTQldutwAA Ph1BMeAEyk6O8p+28amPMQAA nVSk609yHES4jAATVDDpewAA 1 setBeanFactory OFapkoq+jkSh9RkSxTL/PgAA 1 BeanFactory beanFactory iBs6Bwa+S0KGfEhxR18aHAAA GenericTypeAwareAutowireCandidateResolver nbVJ7vLDkUqPfq7ku+FxPAAA 4 3BiCHRULuEyymYdEYA3iUQAA deOSbVIpP0CqzPppw01xRwAA xQEutET2b0O2SPjaV1AK7AAA eGaCNtQMkEOP9qSZM2+0KwAA 2 K7E/QmKriEGL+e1cNAaRTAAA sPfw+0rAdkCdbssoqEI/fgAA 1 udr6TFpdtE6pV0bsMJgoRgAA nbVJ7vLDkUqPfq7ku+FxPAAA 9FAvnokqj0GCHVaBH4lOvgAA fqgr8TXsT0G1c092OaWqDAAA 4 VSNJ7nfhkEKBqFW0xokm8QAA 5jXDRKA+FUS+pQNX49fpVQAA jfR79CTpb0qNzH4LBTxpDQAA HEU70QXcE0a2UyjLpHwAOAAA nbVJ7vLDkUqPfq7ku+FxPAAA 9FAvnokqj0GCHVaBH4lOvgAA OFapkoq+jkSh9RkSxTL/PgAA 4 I9bWeFquA0WEGF2GKNtqVgAA MRRTu46AV0mjMD1ENigMSwAA wUTM0UYAJ0C9L2+2AjzM2QAA AcD5MrHwd0yyYBT+TZTAgwAA QualifierAnnotationAutowireCandidateResolver nbVJ7vLDkUqPfq7ku+FxPAAA 4 +lqBr0ITm0SjYS2wqHsiEAAA /8UEabRyYkGA50VvQqoSZgAA xClEo005a0+QYQseK2o2EgAA 26jMBCHhkEyX0XPec9zkvAAA 1 udr6TFpdtE6pV0bsMJgoRgAA 1 j7OZ/FjehEyO0ZZDapJlfwAA ContextAnnotationAutowireCandidateResolver nbVJ7vLDkUqPfq7ku+FxPAAA 4 II/xUxZqbEqqkFrlTyaCfwAA MtxCJbx3z02uM8Ph8YdrhwAA X1gPU2F4wUGOViGBeVT93QAA pLH3UCxJGk+6tBF20W8qeAAA 1 j7OZ/FjehEyO0ZZDapJlfwAA nbVJ7vLDkUqPfq7ku+FxPAAA mfq7XBl4SEaL0Sgnpar80wAA 9FAvnokqj0GCHVaBH4lOvgAA 4 eInPy/HXn0SBFRk5NUDKkwAA lvKOadXSDUygTF5jN4Y7oQAA VNb9QR8xdkqxu7WXvjA+ewAA v0nRLmUCeUym21QTQr47NAAA nbVJ7vLDkUqPfq7ku+FxPAAA vvvN8Rafg0STpoHNZxRmNQAA mfq7XBl4SEaL0Sgnpar80wAA 4 T0dzQkpsAESf1VjyX+mpDgAA dApPGwYG80yW0qu54IWQ+AAA BqqC/1/YxUGL66H0mQ7ByQAA p5cVBvOd40yd9GfwNEeC+AAA BeanFactoryPostProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 12 Skr81USBU0ushsL2sxBBqQAA PiUitf/ojky2IMQcMLyj/gAA 7wQl0i84okmDTnmHsaFlSAAA sY3HCHxE/kGhMrFAk1wYVQAA XwI0hKWeeUamNdWQ4umnigAA cckXopr2O0Wb7VBv/rAJEwAA pnAcCnU6C0qBJUWBrHp71gAA vAubGQFvY0+36XmzdI++hwAA mwQ1PY3IsUiIChPKENy/MQAA FJMJjLytoUqdFMGM7BeErAAA ixzLLE4Hyk2NlBdnRgKivwAA 736S34yoek2V1roZ0pnBiwAA 2 92GiuLMcwkmSaiwctkgvYQAA EfRuDcIwLE2FccCxj/D7xgAA 1 70iqEhIIO0y5F+aHVkWikwAA 1 postProcessBeanFactory hm4UBSP8KkupBZYdml93SAAA 1 ConfigurableListableBeanFactory beanFactory rVmJCKvw802UHs10ksDfsQAA BeanDefinitionRegistryPostProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 3 wRN6iZCwG0Whj3iPGvOwEQAA 1VYRo0rQLkiDdmZlCW+1mAAA xXyjQ7CsLk+OIPox3XLZHwAA 1 dOe7asSNQkalXnnMsOZ+ygAA 1 70iqEhIIO0y5F+aHVkWikwAA 1 postProcessBeanDefinitionRegistry cED84zSD3ESwlIInt3I6QAAA 1 BeanDefinitionRegistry registry gKyMm7foqUuCesR0GeGE1QAA ConfigurationClassPostProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 4 +93LoKH2zk20vcVU4AiZmAAA 5jPHWt1pz0GdOJ5bucaT2AAA 6wEqPhZuwkawPCFUanbCKQAA xeIz6FnGmkWwB14/jv9cBwAA 5 QvpxKThYBU+50Ti94+VR6QAA zea8Zdx6UU2aY8sk2CaLXwAA dOe7asSNQkalXnnMsOZ+ygAA AYe6NPxxfEiJnquhUonwUQAA MovSxvWNg0edfJpKAit6DwAA PriorityOrdered nbVJ7vLDkUqPfq7ku+FxPAAA 18 WT17BQDsiUix5KU9KL7+igAA 5qG7b8E1SE6f2ccQbh9yNQAA dSWH5sfhu0iW+D90q1f15wAA SY1ABbfXy0KFu1HeK9NXzQAA ZgcGNLTq0E6fG5zh6gWk/AAA mWInPCP5cU21GdkMe2o3DAAA fChnz4FPKkm3aeQULmu5+QAA 2tReei5iiEin1F7UzWmNtwAA zs4UkLjPIkauJJwh0+zM6AAA qL+9iX5vQUC55yMdKWkc/wAA txnAxb/8xkOprMpg+bsfdwAA geuCgV2/TEyESwkZSSP9FAAA Qf8Mkx6JjEOW4e1Y4q4OeAAA YM89r38J1kaOSR/L5U+UNgAA IhbM4tL1E0yAF8bi+HrXqQAA dALp4voEkEaXL1s5KFg0ZgAA dq7RS9OVlk2Z2N4dKxcgLAAA aM0VAVEKSUm693RwsujnxgAA 5 QvpxKThYBU+50Ti94+VR6QAA G3HQxdWeUUO1vStDngZlUwAA wxdFxnBy1US3MWeE4YfXxgAA 3NYCue7vJUmE1VLvi2JZxQAA H5RTzus3b0WW1hbd2HaOPQAA ResourceLoaderAware nbVJ7vLDkUqPfq7ku+FxPAAA 3 l4EC0QoB3kusBOG/tF3mmwAA +ytjuaVNz0yLR0kxVN59kwAA Utz+V1LjekKdhSCLQ31H/QAA 1 zea8Zdx6UU2aY8sk2CaLXwAA BeanClassLoaderAware nbVJ7vLDkUqPfq7ku+FxPAAA 9 bT+pVRzty0GYSd3A+SdiAgAA /yyUmu6gF0CY9VI3uVoYLQAA //dmBvFjpU28ug+cjGVtHgAA 20ABenJZk0OGFOIzEjyRwQAA cmuPsD6VOUWKPgAIG8wPcAAA aWIYiMGlS0WMPH2IBcVtyQAA fSADN1jGgEeBAJYlmlV4EAAA 2wUmqBzd3Uuhxcca3CpHUgAA wECLmeX/dES0HgKOaVCiaQAA 3 AYe6NPxxfEiJnquhUonwUQAA eXKTJ0IOJ068AO/d304lPgAA 4F+fwLQ6yEC51rw6UFN0TAAA EnvironmentAware nbVJ7vLDkUqPfq7ku+FxPAAA 6 qfjSBATVGkiMMVVQJqiGhAAA YbzAaojfmkCEJRtEst/jBQAA 5inTFVnXx0S6BxlsYhltOQAA kpgnXWTb6k6DvK+PEb9glwAA OANqDyvOiE2YwvP1OfnY0AAA cVtaOoBnr0GBbeMxw9x4AAAA 2 MovSxvWNg0edfJpKAit6DwAA sVYoBNNEY0yPjZNg+I/P5gAA nbVJ7vLDkUqPfq7ku+FxPAAA cED84zSD3ESwlIInt3I6QAAA hm4UBSP8KkupBZYdml93SAAA 4 34cmPozodEi/NaDQKCam1QAA FPph70tvaUad6qSdrtFDEgAA AzTMiC2t8UiiUoSMOsAnIAAA xOccu5vME0Gyc5PutWGrWAAA nbVJ7vLDkUqPfq7ku+FxPAAA vhLv3MHqVUaEMUMc32ZxowAA n6D/sAuOQUeQrhIM2F2uDQAA 4 0eUvO2KiMkWUT8ocDNr8jQAA i9KaAkQyfE2C07SNtQVwLAAA KXbEjgF44ka4SiDV1VXR6QAA mR8sBEQDMEChgcuVLNw60gAA nbVJ7vLDkUqPfq7ku+FxPAAA vhLv3MHqVUaEMUMc32ZxowAA ekgd4T/W6ESRZ+Psi8hoSAAA 4 tH7epnO5UUK9GerUe6Or2gAA SH3ugUocXEG7B/Lgn5/yyAAA DXYQ5H91hk2pD7SjRIRmjQAA Aw2i2UaIOE+EtROnk+baEQAA nbVJ7vLDkUqPfq7ku+FxPAAA vhLv3MHqVUaEMUMc32ZxowAA cED84zSD3ESwlIInt3I6QAAA 4 MvKC6VHAWkWIy5Sy4zZm5gAA S/gENZ5LxkKQ672ji5JfzAAA sykVhonNfEGTGyqO7/4j0wAA +hoSGfRwOkO4tmru4gGYOwAA nbVJ7vLDkUqPfq7ku+FxPAAA vhLv3MHqVUaEMUMc32ZxowAA vKy1CmQQ2kiao5Z+XZsFhQAA 4 hDyInWePxEyORbNxVFPIaQAA kuFNYUpQpUmgXMTJHOuWZgAA yBvOycgjI0CiynyCnoidoQAA QVRUAt+ORE6EGxA804PoAwAA nbVJ7vLDkUqPfq7ku+FxPAAA vhLv3MHqVUaEMUMc32ZxowAA 5sEi98Ciz0K3X2G7qyR3fQAA 4 ZTiAxTMceUKUdGwgTHFNTgAA 5oINMgOScUWg3yj27UU8rAAA VzkR3k/L6EW4/NuzflzQFgAA pYsalo6ilUmymOFbULxWNQAA BeanPostProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 12 N0pc9DfhkUqklJc9vcuu5AAA DdRCCWocG0uqBVOQGHqXXQAA PqLUjdpNfEyrmBTrA72bHwAA 7nD5MjbdIUWvFDQCcH5bDQAA UVwEkFBPqUy2ONsT2KSiSQAA aPYYr6+6Aku3hgxHDzKggwAA SgE2TKJbPUKEoVOTNI9PBAAA tmDdRH2uWUGI0fGXm2kEkwAA mLxkuCMdeUKEK96w3PPCXQAA B6Aw1g4WeEKGifKIi2Ag8wAA nGrTjBYuVEqMiufka3ZjigAA iNnmAMhmQka55LFhFnJPQQAA 2 EJsbJJVRUUqxO/ZrnCX4tQAA +j4f2BkOHkW12/xFIV44RQAA 3 yNBto9OxuUK9Z40x3JHmJgAA EjLsOOz/xUKcfVbyHnC03QAA FTWOqQQfBUC/o9aUUmDMjgAA 2 postProcessBeforeInitialization NHfbNf3mHU+CjGOsJ9aPNgAA 2 Object bean sq/ljPrBlUWVRdVtjwVGlgAA String beanName sq/ljPrBlUWVRdVtjwVGlgAA postProcessAfterInitialization NHfbNf3mHU+CjGOsJ9aPNgAA 2 Object bean zgQUfSfAWEiIoz2TTxwFiAAA String beanName zgQUfSfAWEiIoz2TTxwFiAAA InstantiationAwareBeanPostProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 3 PFLRkyS030OxI/RC5vytJQAA Id70UdRwgUSvdiN+YNrQIAAA 97tkRebLN0GkALwr9hx0OQAA 1 yNBto9OxuUK9Z40x3JHmJgAA 1 LrvnsCziNEyPa63SiKqVXwAA 3 postProcessBeforeInstantiation nsNQQ6H+jUWE6LyvFPLCZAAA 2 Class<?> beanClass 4jz1QAK7ek6mDRfWo6AhqgAA String beanName 4jz1QAK7ek6mDRfWo6AhqgAA postProcessAfterInstantiation nsNQQ6H+jUWE6LyvFPLCZAAA 2 Object bean iY834eGXMk+UgKVYQAur+AAA String beanName iY834eGXMk+UgKVYQAur+AAA postProcessPropertyValues nsNQQ6H+jUWE6LyvFPLCZAAA 4 PropertyValues pvs GtKz0OuvbkeHe24+gMYrZAAA PropertyDescriptor[] pds GtKz0OuvbkeHe24+gMYrZAAA Object bean GtKz0OuvbkeHe24+gMYrZAAA String beanName GtKz0OuvbkeHe24+gMYrZAAA SmartInstantiationAwareBeanPostProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 3 MOXNexsjRECENkA6s/2U+gAA RiMu8oLMHUu6eOHBRLfhkAAA vRh0jCwZNUuuEcrTNz+WggAA 1 qs5gkxe5OUCyhLpc4xaoUwAA 1 LrvnsCziNEyPa63SiKqVXwAA 3 predictBeanType +1xBffipnEeFBAbSFjHSyAAA 2 Class<?> beanClass lxFvhf2GP0e3UPQkdwlLRAAA String beanName lxFvhf2GP0e3UPQkdwlLRAAA determineCandidateConstructors +1xBffipnEeFBAbSFjHSyAAA 2 Class<?> beanClass 73Fz1dxGIUKhb5Tw3tNC0QAA String beanName 73Fz1dxGIUKhb5Tw3tNC0QAA getEarlyBeanReference +1xBffipnEeFBAbSFjHSyAAA 2 Object bean CpstCFfG+EeGw2XzjAYhjwAA String beanName CpstCFfG+EeGw2XzjAYhjwAA InstantiationAwareBeanPostProcessorAdapter True nbVJ7vLDkUqPfq7ku+FxPAAA 4 vNyfu3vO50iIFlAHuRlumAAA jkwisP6JR0yVkAIf3sFb5gAA eP7scMbpZECslkHz3Yw34AAA bkoemYCjFk2ejnBLjfORWAAA 1 qs5gkxe5OUCyhLpc4xaoUwAA 1 lsoNZEGvSkSbPxK9NvRb1QAA AutowiredAnnotationBeanPostProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 4 289ADcZxaE636+TwrGA96gAA bb8xLr97qEipqh0oefctqAAA YdsmCd5NPUC5RGGz7KV6qAAA 88fmBmlThEqQtojIAr5ZiwAA 3 eZzs6kmpZUSFtFqKJ8GiigAA G3HQxdWeUUO1vStDngZlUwAA YOwCmAEwwk6j/BxRVT9UGQAA 1 lsoNZEGvSkSbPxK9NvRb1QAA MergedBeanDefinitionPostProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 6 UxikAMap60a8RH+vjn0qsQAA tFzNDfA1AUiYGK3ClopFoAAA H2j8wfmtC0iUwJi5iyLaYQAA Tw1lkRunFUmkPcaK1w5hSwAA ym3F+IYBDUCzAEEVemxMcQAA g705CCgmwEGhpDCjzj2JHQAA 2 eZzs6kmpZUSFtFqKJ8GiigAA IcLyUbNi8UGJLPCIOmMg8wAA 1 FTWOqQQfBUC/o9aUUmDMjgAA nbVJ7vLDkUqPfq7ku+FxPAAA nsNQQ6H+jUWE6LyvFPLCZAAA NHfbNf3mHU+CjGOsJ9aPNgAA 4 ZX5QAa/zJEWtSNzBTvNotAAA dZ2JtqxoN0uS7smG2AIvZQAA YdunbugPtUa4DXmjO9OdHwAA tRRGUlQvFUuHoenqwduPowAA nbVJ7vLDkUqPfq7ku+FxPAAA +1xBffipnEeFBAbSFjHSyAAA nsNQQ6H+jUWE6LyvFPLCZAAA 4 T/oW/GmXuEqvIWgtnKxiXwAA Gmc0bS9MKk+3lE8U3wJaIQAA ChSlot43n0yJwAZplDJYLwAA +h1T7eHZp0uTQeVB/ssMPAAA nbVJ7vLDkUqPfq7ku+FxPAAA qXv615KzP0KWTRYGCEaRSgAA +1xBffipnEeFBAbSFjHSyAAA 4 tPuezwTuKEWYcFDio0D9swAA MkaFyZon+U+Uor/Yoe4WmgAA sw+bWCoCwk+FfgaowV44lwAA 6Wt8wzfZoUKDIQbqMhcFcwAA nbVJ7vLDkUqPfq7ku+FxPAAA 3wXlQWDgCEeLfcOTDPmrKgAA qXv615KzP0KWTRYGCEaRSgAA 4 Xyqe0QKmVUa8DnoL3emStAAA Zfg+gF16ikKYmidqfKrMqwAA EZY1V5OyfESOnpY8LiKgcAAA Te0tSXIEVEuFRBS/y0sS6AAA nbVJ7vLDkUqPfq7ku+FxPAAA 3wXlQWDgCEeLfcOTDPmrKgAA aBPMwZ4GK0+UrI9USXvsPAAA 4 bU3MjQXyA0iullGUo1McnQAA 8XVTkue21UKyYHO99MlqZAAA I43LCKvZh0+FumbMDwfjHgAA b/ty8m8z+0+Ew2++ewNkqwAA nbVJ7vLDkUqPfq7ku+FxPAAA 3wXlQWDgCEeLfcOTDPmrKgAA n6D/sAuOQUeQrhIM2F2uDQAA 4 EegbSnfJpk2D57OI1NR0QQAA Qth2CAjmukq4pu9KqP1vegAA FmLtip8pJkyHN1k/TDdxvwAA dpSXX06HFEyyUM4p9jduiwAA nbVJ7vLDkUqPfq7ku+FxPAAA 3wXlQWDgCEeLfcOTDPmrKgAA OFapkoq+jkSh9RkSxTL/PgAA 4 Ve1tWTFc2Uq7k5GboqeIWQAA 8ykWW87Pf0advb7aVdBomwAA u6gU8ZOyTk6M8l/5UPiWjAAA wz3CJR3CK0ecRRB4mwdfugAA DestructionAwareBeanPostProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 3 DmzMSFVMyUyRmP9L/BG2HAAA gdul50tawU+0o1RQk/iEYAAA 9oxxJvDw7E+4paIhJmDjUgAA 1 HmAf/8WhxEKc4D7gZ8lsBwAA 1 EjLsOOz/xUKcfVbyHnC03QAA 2 postProcessBeforeDestruction UGHrPpgeaEGc/UAM2oyduAAA 2 Object bean utnfcHNEEk+iSvPY3Hj00wAA String beanName utnfcHNEEk+iSvPY3Hj00wAA requiresDestruction UGHrPpgeaEGc/UAM2oyduAAA 1 Object bean 69awgmm3SUGt72PgP9GiIQAA nbVJ7vLDkUqPfq7ku+FxPAAA UGHrPpgeaEGc/UAM2oyduAAA NHfbNf3mHU+CjGOsJ9aPNgAA 4 Xn5WMu0O30+St5sZtIgECwAA 4C6dFS8FZ0+jieX17iDBLgAA ajK31KkkIkiw9u/1U8MAygAA 6xK9pC2TXEO1Gw+4z9RwjQAA nbVJ7vLDkUqPfq7ku+FxPAAA aBPMwZ4GK0+UrI9USXvsPAAA NHfbNf3mHU+CjGOsJ9aPNgAA 4 nY2k/AAMpEmkRg64fB6lLAAA OnuwtIKABUaEH6YXjTVrngAA 3wQEji1izE+NLwFLyVAYFgAA wXSU46UZGU+hiyNYfKkCMwAA Serializable nbVJ7vLDkUqPfq7ku+FxPAAA 3 roI48xhZxECVEqOzeR+bugAA q2pTxdjQqUWanV74u01bigAA Od1RvueGQkmWKGhR4ZBOzgAA 1 VnVpTTQOOkqqM/90A3e+JAAA InitDestroyAnnotationBeanPostProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 4 /mjaW5nDY0iKnOA7Cw7R7gAA 4vZEzHqJLE6dk+ox/sNLWQAA mlOQPkvv6kCPEznNNBVmeQAA CaxHD5SLFUOqSmksmXzQzgAA 4 wxdFxnBy1US3MWeE4YfXxgAA HmAf/8WhxEKc4D7gZ8lsBwAA IcLyUbNi8UGJLPCIOmMg8wAA VnVpTTQOOkqqM/90A3e+JAAA 1 3EX6q5PsVkKKk5Rj3TUG8AAA nbVJ7vLDkUqPfq7ku+FxPAAA u2NwOmJzEU6bRhoniVGnBQAA n6D/sAuOQUeQrhIM2F2uDQAA 4 TS/tw549KEi3E8xvcxBjBQAA vTPhRsg+/0SjHbembSj2JAAA UrjRz7CDH0qCcjtHMqPVVAAA EYmW5KCuE0qp2PpIQaZVZgAA nbVJ7vLDkUqPfq7ku+FxPAAA u2NwOmJzEU6bRhoniVGnBQAA UGHrPpgeaEGc/UAM2oyduAAA 4 A9VJXqdx4EOaIsrnJz/9UAAA eFfm1Ua4xUuxULPehv+mywAA 6YAU5XMfeku5PWlC+emcEQAA JG2fjfj1jkuP4aU0ZWaMLgAA nbVJ7vLDkUqPfq7ku+FxPAAA u2NwOmJzEU6bRhoniVGnBQAA aBPMwZ4GK0+UrI9USXvsPAAA 4 FIIFcR7LBUa0KKzd7c+uQgAA 2e2edbv9JUanjqYHG4mAdgAA m6nz5uqn/0eu2uDGCSQ+swAA hyyCYl+XnEODgf4Jri65DAAA nbVJ7vLDkUqPfq7ku+FxPAAA u2NwOmJzEU6bRhoniVGnBQAA huAwxPm1MkKY6HVKbN2aKgAA 4 7h4ZBAV/10SU9XvzYteEyQAA cfYyrEDOL0K01gp/AnhSzAAA qcllpqSB5UuWSiMKRZiP/wAA J+0Nanp8Lk2292Ka2dlmBQAA CommonAnnotationBeanPostProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 4 dKBgaeAjAkmulFk7+IkqUwAA qEaSrqj1QEKKdzRK3yoWPAAA OzPclGiZvUyEP1UVsiv1RQAA nRE/OVvKlEWEdWv2m5r6GgAA 1 3EX6q5PsVkKKk5Rj3TUG8AAA nbVJ7vLDkUqPfq7ku+FxPAAA VcpFHsTHhkaugHRaoerH7QAA u2NwOmJzEU6bRhoniVGnBQAA 4 aGB9+hg/eU+MomGWFC6zmwAA 7SnzRucAWUqpT0ixB7sA/gAA vTPbALiPk0Ci2vPlaYbQKgAA 4raPJxLpikebRTayzj0XZwAA SmartInitializingSingleton nbVJ7vLDkUqPfq7ku+FxPAAA 3 LyTsgB17iUyJjhRNmcsuhAAA YWlCgBiS20KmsLlvcOJefAAA L0defEsrKEKYEccHdnCuVAAA 1 3tLga58GH0yshSYrEFdnlgAA 1 afterSingletonsInstantiated TH4kfK3NrEOtQztihKYPwgAA ApplicationContextAware nbVJ7vLDkUqPfq7ku+FxPAAA 3 leHDYdf9dUujVj2nWxQXygAA OY2n64F/WUmq8cw66LzmlQAA no2XzOSQIES1Wjl1zFs2uwAA 1 Gp7BOGiWSUOt/0SF68fSAAAA 1 setApplicationContext(ApplicationContext applicationContext) 9ZbsQkm820qikDdd98CnzgAA EventListenerMethodProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 4 e2E7rqjrv0qSkV9y4mCAQQAA RAw71w/kpEuCfiSBt5lDzAAA QlpGUHTEk0ONUqChhdH9WgAA 8GXqRUBleECiC4ZTwMZd0AAA 2 3tLga58GH0yshSYrEFdnlgAA Gp7BOGiWSUOt/0SF68fSAAAA nbVJ7vLDkUqPfq7ku+FxPAAA /Bdfkv4KhkCOs6NzTEVj8wAA TH4kfK3NrEOtQztihKYPwgAA 4 6RdrpgKdi0GhRewwosMB0QAA vh3bhuODkkmpxjckS33k9wAA jyQJ2NhUQUeiX/N2zXcU/AAA HTdfr9q2M0aHh2NytS81ZwAA nbVJ7vLDkUqPfq7ku+FxPAAA /Bdfkv4KhkCOs6NzTEVj8wAA 9ZbsQkm820qikDdd98CnzgAA 4 SP/vJqNsJkynb9MnSVuyhgAA hjKwT1ewPkWqfcyrUhWN0wAA HtyhA3kvY02f7U2KBiVZpAAA CSVRJzZR7EOLTwoup+PEFwAA EventListenerFactory nbVJ7vLDkUqPfq7ku+FxPAAA 3 X4hKG5wslkmc+fxtPxGy3AAA gO7x0twE4UKnT3YmCrLXBgAA l/8BnOzVu0CD+1pdrdWDoAAA 1 0/UYV9FIGkORvujQKJR8DAAA 2 supportsMethod 3DiICyByyUmsFbOp77EKiwAA 1 Method method LpxZFtUYYkGdoB9QP7nGqwAA createApplicationListener 3DiICyByyUmsFbOp77EKiwAA 3 String beanName ini2TIoSd0G+ww0c+O4o2wAA Class<?> type ini2TIoSd0G+ww0c+O4o2wAA Method method ini2TIoSd0G+ww0c+O4o2wAA DefaultEventListenerFactory nbVJ7vLDkUqPfq7ku+FxPAAA 4 NjV2NbD0ok2bYfw3sP2ZyAAA RIPE9odGBkO+NAjPJVTZqwAA XQA7L6qnD0CW7TjqIKeM7gAA HkHxvTuq4EKaJr5nBqTk4QAA 2 0/UYV9FIGkORvujQKJR8DAAA tdcdeO3rXk+RSnA7ldpUrQAA nbVJ7vLDkUqPfq7ku+FxPAAA hNwDorTQ70KvLajAI3hJmgAA 3DiICyByyUmsFbOp77EKiwAA 4 3sTXm0/MKUyQ0JehmRcL2QAA 3QrdBFAyBE2Imq1l0yUiqAAA 0KJhTLZjY0Gp2ub7l79xDwAA tXY+wBvzVEKxFQA2ys8z9AAA nbVJ7vLDkUqPfq7ku+FxPAAA hNwDorTQ70KvLajAI3hJmgAA NHtPpn7SE0WAntXGhegIOAAA 4 MHJCEXtoFUKkFiroqovnPAAA 27sQA1F6dUGTZ+7JtHlupgAA tLkw/knlV0m+H4Caq86R1gAA LHtFdkT+M0qvrSwpR1vvoQAA BeanMetadataElement nbVJ7vLDkUqPfq7ku+FxPAAA 6 WAUDHTQ48kqlXVhZcg0JHAAA 5kOmTeIR30i0xNUA1AoYAQAA ZqI1fCdNm0iBRsTzMJW0zQAA 4Sue5SlC+kO36oaDomC1qQAA EHHD9t3sb0e5x9MLMom0uwAA z2/1Phusi0Ov1euboL1ZmgAA 2 TIbzUNzvckuNlBsaPtCbXwAA 1UvXitN0Mkq7QQJWqJn8fwAA 2 O+e3kIHYGkuc9zGvo6xR0AAA dJqmWQ+lP0u2siOKjOXa6QAA 1 getSource uRGuoiFcFki3s/Kae8CI+AAA ComponentDefinition nbVJ7vLDkUqPfq7ku+FxPAAA 3 yF1PqWv3cEysveg3fe37LwAA fpV8AHHPcUOLdTD1pXSOmgAA +ggq4InutEi6dUMDsbFyegAA 2 mYaNC6CX4EupKVuxUiyVEQAA LM7I6kV3I0CO9+XYYLzW0QAA 1 O+e3kIHYGkuc9zGvo6xR0AAA 5 getName DNkE04U5ZkaBr1EkG524yQAA getDescription DNkE04U5ZkaBr1EkG524yQAA getBeanDefinitions DNkE04U5ZkaBr1EkG524yQAA getInnerBeanDefinitions DNkE04U5ZkaBr1EkG524yQAA getBeanReferences DNkE04U5ZkaBr1EkG524yQAA AbstractComponentDefinition True nbVJ7vLDkUqPfq7ku+FxPAAA 4 KdSfxQyvdUaM69tt089EigAA hR6saU7ntk29HtZIi3BWIgAA g3eSu0M/mU+ADgHLmtw7TwAA BDLI1bCpQkye+Quu8gl59AAA 1 LM7I6kV3I0CO9+XYYLzW0QAA 3 ugWA3o5rrUO43663mhn8WQAA b50ZUMFa4EGb/nnJZHxMbQAA oyBURmSOKUSFlY+liJs+HQAA CompositeComponentDefinition nbVJ7vLDkUqPfq7ku+FxPAAA 4 XFNV/qhWIEKZlEIrrnyP8gAA ZzTEohsYxEKRD+Dl6IMvswAA +crfGqSziE6OAXRWhBPq9AAA dBqr6C9gIEOaTrCkFdCoeAAA 1 ugWA3o5rrUO43663mhn8WQAA 1 k6psYd03TUmlUxtFiH4RmgAA AspectComponentDefinition nbVJ7vLDkUqPfq7ku+FxPAAA 4 WOgSFoHXf0GbjdkmLFmP7gAA K+rVndb/ikmba9sZ/WFKZwAA qwC1hMIDqkSiVxO0xuceVAAA wgVH906lM0qR+fm38DQ+tAAA 1 k6psYd03TUmlUxtFiH4RmgAA PointcutComponentDefinition nbVJ7vLDkUqPfq7ku+FxPAAA 4 rjj2vBu+jkG81g9EAwOFagAA 1vxf4Xh2N0WrEkZk1xsJnwAA fG1t63A6dU+EYttX7/eBaQAA 6qUEhLWc4kiVEbxmmWUzAgAA 1 b50ZUMFa4EGb/nnJZHxMbQAA AdvisorComponentDefinition nbVJ7vLDkUqPfq7ku+FxPAAA 4 7CuS6+Azy0Ga0II0zBQI6wAA HRBKwnou8Ua0TWeE2fXb1gAA 5yBuxwaQkUSOLEpUjUhh4wAA WPmIcSF8wEC7gEAzMITABAAA 1 oyBURmSOKUSFlY+liJs+HQAA BeanDefinitionHolder nbVJ7vLDkUqPfq7ku+FxPAAA 4 AiqV04muX0S6YPM0C6Jy4AAA /3y1H5MjrUqpxBojG796GwAA NLzswUbiMkeVxeLK000ujwAA oAnqrsThDk6ObzKXv6f00AAA 1 TIbzUNzvckuNlBsaPtCbXwAA 1 IGDPP44X0kOHgdbTKDGsqAAA BeanComponentDefinition nbVJ7vLDkUqPfq7ku+FxPAAA 4 +Q6+1btAUkuwiCZGqay7GAAA rnzHzhCosEe/eBc0JnP/NwAA 3fY2fHbGokyIzHfOHbTNvgAA 0gtJtrdRiUCn4hfSlTHjAwAA 1 mYaNC6CX4EupKVuxUiyVEQAA 1 IGDPP44X0kOHgdbTKDGsqAAA nbVJ7vLDkUqPfq7ku+FxPAAA DNkE04U5ZkaBr1EkG524yQAA uRGuoiFcFki3s/Kae8CI+AAA 4 LgbApT4jhUKWFfDC/CwqwgAA dJC7huzeH0S1Rakz/I7DrAAA 75NUeSvXHkOQg8gueQWx/wAA kT9tpjLYLkiFr+uskNloggAA nbVJ7vLDkUqPfq7ku+FxPAAA WjdvnZ/gf0O1ZvFn8jMFIwAA uRGuoiFcFki3s/Kae8CI+AAA 4 KcyuCRJBlUGVt4UwrKKbgwAA NEvEFLQyckK7P50Ss+mfMAAA c20RkyGa20ujw6bZrBtr9wAA pX8RrgoZ8kOcn14zQBKspgAA nbVJ7vLDkUqPfq7ku+FxPAAA 7gcWddcdl02T591s+CfniQAA WjdvnZ/gf0O1ZvFn8jMFIwAA 4 BcHB2R5j2UiQ4oQOQ5uwOAAA fBwAvMuVr0CQwFIN8cXhFAAA C5hST65xk0WroHt87oEipQAA UbRUE35GMk+UniodBHaBMwAA nbVJ7vLDkUqPfq7ku+FxPAAA 7gcWddcdl02T591s+CfniQAA DNkE04U5ZkaBr1EkG524yQAA 4 4tV3V6PaKk+C5kT2p0CBGwAA Id31mjkxkkKDsJttttBs/wAA Q20CAHytC0OX+hXBLvFGwwAA KTuB5TPtMkiP/SigTNbTTAAA nbVJ7vLDkUqPfq7ku+FxPAAA 8Ji/FoLlS0uJqfHhyffBgAAA DNkE04U5ZkaBr1EkG524yQAA 4 FfVeX2rxZ02hF2shGJhDtAAA tz0ZW5nStESgWu77Z8DU8wAA IX+aDiJRvEqIPkhqlU1qsAAA AeIix2/xuk6QQUzudcsYrAAA nbVJ7vLDkUqPfq7ku+FxPAAA VyYARnNfOk2usSVx0mDC0AAA 8Ji/FoLlS0uJqfHhyffBgAAA 4 ZluvzjuJ8Ua9Ce2+6xfSdAAA rdeBNYxUGkWSPdDW5Gh4iQAA 2GNgTEwWQUGAutzjh+BNVgAA AqsgoY6J60ax5oGIK8nEoQAA nbVJ7vLDkUqPfq7ku+FxPAAA OPihlUYtnUCGk4ft5GOG4gAA 8Ji/FoLlS0uJqfHhyffBgAAA 4 bNmf+QtyzEusor7eKalyyAAA 30nQkRpWrkimffeRmand3QAA rMNFSynAikmpj8oZEAxnOgAA lpndMKcQl02+0mfJ0pX+HwAA nbVJ7vLDkUqPfq7ku+FxPAAA 7iSSPpHnmkajbiZZCVtC5AAA 8Ji/FoLlS0uJqfHhyffBgAAA 4 U74tt3tiQk2/ZT2/tLORKwAA /lOrjxjeKkesA8OPWlc89AAA ExpN2gopv02HAyhZo+gDigAA FT/eBnSlkkK2UDKNpLo4cgAA nbVJ7vLDkUqPfq7ku+FxPAAA x4iTXiH8pkqR5dTq+uR5kQAA VyYARnNfOk2usSVx0mDC0AAA 4 3Uya08TB/EOWA3Dl7NJ3wQAA OnL+lDSOxky/rLJHGVreLAAA J6N9vAe8P0qUx/Q3qkgLNwAA SK9G1FqVEUS6Nhy5zWjFZQAA ImportAwareBeanPostProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 4 Ed6QJ6jBV02PBam85aEksQAA 1u4V4E98ckWyJbOg1v/cxwAA 1xtyhThUq0qcycS/kmHMlQAA r5CrRXvQskq9d8IJOvWGVwAA 3 EJsbJJVRUUqxO/ZrnCX4tQAA 3NYCue7vJUmE1VLvi2JZxQAA u5/dcwPhJEyCHfdfpzEpyQAA nbVJ7vLDkUqPfq7ku+FxPAAA 9nHedchJSEiVJc2vIY/y6gAA NHfbNf3mHU+CjGOsJ9aPNgAA 4 QoM/O18HkUm7Kv5wM88o2gAA mn4y7xTOm026ybAZt/O4AgAA SVUmQ7hEB0+MndRPs3z60QAA cptPBqTjXEm4Ko8kQrGflgAA nbVJ7vLDkUqPfq7ku+FxPAAA 9nHedchJSEiVJc2vIY/y6gAA n6D/sAuOQUeQrhIM2F2uDQAA 4 pM4yC7XjZky0h4LpX1AGyAAA 1+lmLsLV2EuAb9sGomzxSQAA sZl+fTD5Pk+nVta9mScH1gAA LnV67tcL4U658SkQc8sWqQAA nbVJ7vLDkUqPfq7ku+FxPAAA 9nHedchJSEiVJc2vIY/y6gAA OFapkoq+jkSh9RkSxTL/PgAA 4 Nrch2NU/+UauHlp3DzbkCwAA 4z1BowDvCE2TRIk+OgfXLQAA IrtAPBKsX0K4tDg1Ei5StQAA V5iHudZh8EGFk8IJC8s1rQAA BeanNameGenerator nbVJ7vLDkUqPfq7ku+FxPAAA 3 IsrocB64+EuDGhkiWsJw7QAA /tbvAiLyp0O+sbgDsWsRWAAA u2qTmbGav0KpJ0uI/ORvCgAA 2 9UQw4Jf1eESHvIMK6lOkIQAA ZArcyxsxQ0S6Nj+rBXnTLwAA 1 generateBeanName xWyORJB65kSUt0NnNG97yAAA 2 BeanDefinition definition viYbgIMx5kCVj4Gjr16MgwAA BeanDefinitionRegistry registry viYbgIMx5kCVj4Gjr16MgwAA AnnotationBeanNameGenerator nbVJ7vLDkUqPfq7ku+FxPAAA 4 XTQ0MfGMq02M0pOPZ7OCPAAA XvDyRLQq90ymIdQEbKrO6AAA uYgjCviEm06hXjBOMcCRHAAA mbeb3BAKaEagyArRMGStcAAA 1 9UQw4Jf1eESHvIMK6lOkIQAA DefaultBeanNameGenerator nbVJ7vLDkUqPfq7ku+FxPAAA 4 V/Rchos9wUquwh43CmAhgwAA 4HAYo1dAf0Cf9ZJL+N8lkwAA YGMx1igI00qmHKuSah/y0gAA fBWtqiH9qUa2zx77Fj+LEgAA 1 ZArcyxsxQ0S6Nj+rBXnTLwAA nbVJ7vLDkUqPfq7ku+FxPAAA +l1pnCSRqk61mnEmCnJFOwAA xWyORJB65kSUt0NnNG97yAAA 4 AwXCyVA6T0eHz8fNmupw5AAA DQ5DPUWTr0SpLHK0e2WK+QAA sbseVRICbEGvHrkbfHS7tAAA KgW/bFj0tkePkZ/i4MkTOAAA nbVJ7vLDkUqPfq7ku+FxPAAA UP5YcRTu1U2GHVX5kzV4swAA xWyORJB65kSUt0NnNG97yAAA 4 8Drrhq78Kky2khtzjOsAjgAA CvYUuSU+/EmxM/XSlVE7NQAA eoTrbXMhf0Orqg/jK3AOuQAA i0LcN8DQDEy/s5m6JsgxUwAA ScopeMetadataResolver nbVJ7vLDkUqPfq7ku+FxPAAA 3 A+Y1v2jTdkWVuwwVlCWW9gAA 36nrOHzPMUKDVlhv9n3mZQAA GCmxan3qVU6QkuYiNrQ8igAA 2 vzHifqTjpkGs+f8TmwyScwAA vpjN95CLn0CZbdUfLGG4pgAA 1 resolveScopeMetadata 3WLuor6Dh06Dt1pcAEM1mgAA 1 BeanDefinition definition QZgkMILwXUCJtRaizXNWYAAA AnnotationScopeMetadataResolver nbVJ7vLDkUqPfq7ku+FxPAAA 4 P+XSkNzKI0mPHA4d4djsDgAA qYz4rWUozkuod/tbQSEt2gAA 7dOabD1V5U6nVtUs+UUMMgAA r/0YbKToHkOVDDFu4SswhQAA 1 vzHifqTjpkGs+f8TmwyScwAA Jsr330ScopeMetadataResolver nbVJ7vLDkUqPfq7ku+FxPAAA 4 tyq/6LFdMUmObLAptntoGgAA NQS2RViLfU+n4J3KOmdsJAAA /cSmkAPLWUqTE1hiMrnLbQAA cTi8sHYCaEqX0PqYbIwb/AAA 1 vpjN95CLn0CZbdUfLGG4pgAA nbVJ7vLDkUqPfq7ku+FxPAAA sftFdZZ1pEeE8fwucjidcQAA 3WLuor6Dh06Dt1pcAEM1mgAA 4 k8ZkgkykqUKrzgo+P7fI/gAA gQpZmLY+7EuEFUFduQjUVwAA 06UxOBHQDkCy4plAu2NsggAA cKzZOpeN+ECy1C77FVV/QAAA nbVJ7vLDkUqPfq7ku+FxPAAA WItmfWEAgkmkny2yPJS/NAAA 3WLuor6Dh06Dt1pcAEM1mgAA 4 TPKxbG9VYkOOc5OKyAKmVAAA 3yVwtiSpEkaiNowLykGnuAAA 2qq7mLrQCESaCkCJpHh2YwAA 8vnAT3YIx0ioOiBtACkYGAAA MetadataReader nbVJ7vLDkUqPfq7ku+FxPAAA 3 vtwVwjWlOkO5e543gsji9wAA s4GfAH4cLECJ/VQCEq/brwAA fuw0htJtXU6hZf+5SIGy8AAA 1 2ycQ6hHRskq6osbQdIOtawAA 3 getResource EbmUgx8rQU+Xe2xD3X1OBgAA getClassMetadata EbmUgx8rQU+Xe2xD3X1OBgAA getAnnotationMetadata EbmUgx8rQU+Xe2xD3X1OBgAA SimpleMetadataReader vkProtected nbVJ7vLDkUqPfq7ku+FxPAAA 4 5k1uLwonZESfZW8lD/fKAAAA EeIpxL8Xc0OQZ0fZgeY2wAAA yeLm1QfYfE63my/GsKIKEQAA VDA0xmArWk2UUVDPziXglgAA 1 2ycQ6hHRskq6osbQdIOtawAA nbVJ7vLDkUqPfq7ku+FxPAAA rPA0TQ2bh0CA7hIlS9IZxgAA EbmUgx8rQU+Xe2xD3X1OBgAA 4 BIulhzt8AkWYNn44e0pyDgAA uHEqG5aFnE+HdODgxv9BIAAA k4LLP2HnKkKq4o0sFtczggAA Dk+8sbc5G0iOZvgi3guZQQAA ClassVisitor True nbVJ7vLDkUqPfq7ku+FxPAAA 4 PJz4EDSPn0+0mWCykNfhJwAA sPgZv5d17EOI0aJmyHfp4wAA d9sT85g8hkiBUhio5w4WPQAA Hcy6+qzI006x4aGF6+Z8SAAA 1 fHDnD+XHWkWlht74W9kiegAA ClassMetadataReadingVisitor nbVJ7vLDkUqPfq7ku+FxPAAA 4 KuL26d/KFkS1DAKKjtUhsgAA CbWiDxg0d0mfuL5bZBrvwAAA yFN0xYJyOUKeIeMLf2jnXgAA q6P/MjCmjECqTc2K7RzMbAAA 2 0JPcp/4Ankit9HL43FgVugAA VjDZldbs0EOIw6yPcg5/pgAA 1 fHDnD+XHWkWlht74W9kiegAA 1 6U9n2QM7i0+jBDCH73m3bwAA nbVJ7vLDkUqPfq7ku+FxPAAA ClassMetadata nbVJ7vLDkUqPfq7ku+FxPAAA 3 BZVl4T4blkicAuDLKZb2ZgAA ZgjphQCkAk23XE1SbEmpqgAA pewOy8U9jkS5NdYMs/8YpQAA 2 0JPcp/4Ankit9HL43FgVugAA VjDZldbs0EOIw6yPcg5/pgAA 1 R73QzYeF+kyC/gnMJ22FSwAA 14 getClassName itTFNbx7eE257mwWOP0ESQAA isInterface itTFNbx7eE257mwWOP0ESQAA isAnnotation itTFNbx7eE257mwWOP0ESQAA isAbstract itTFNbx7eE257mwWOP0ESQAA isConcrete itTFNbx7eE257mwWOP0ESQAA isFinal itTFNbx7eE257mwWOP0ESQAA isIndependent itTFNbx7eE257mwWOP0ESQAA hasEnclosingClass itTFNbx7eE257mwWOP0ESQAA Operation1 itTFNbx7eE257mwWOP0ESQAA getEnclosingClassName itTFNbx7eE257mwWOP0ESQAA hasSuperClass itTFNbx7eE257mwWOP0ESQAA getSuperClassName itTFNbx7eE257mwWOP0ESQAA getInterfaceNames itTFNbx7eE257mwWOP0ESQAA getMemberClassNames itTFNbx7eE257mwWOP0ESQAA nbVJ7vLDkUqPfq7ku+FxPAAA QA4wE263HE6kcERUeJxJ/AAA /w2q4mT/00KKtMRDgL5+UQAA 4 Eo1TMadZtkaiSYXNULkG3AAA m+aPoHRpVUWOwLTpTTEXDwAA 8Y98BWxV3kmMGFIhH0vsUgAA 7NQS8107u0GL+vnwmrJqXwAA nbVJ7vLDkUqPfq7ku+FxPAAA QA4wE263HE6kcERUeJxJ/AAA itTFNbx7eE257mwWOP0ESQAA AnnotationMetadataReadingVisitor nbVJ7vLDkUqPfq7ku+FxPAAA 4 qPFLR74SBE6vYxvkAEz4sAAA PrvVpSgI20i6DDcuMbVPkgAA gkoIri8IHkKqL5GRTI8iwgAA 69HP/Mvl10WTia9T9sJ21QAA 1 RowLLV1WNUSRcCRZAcTo1gAA 1 6U9n2QM7i0+jBDCH73m3bwAA AnnotatedTypeMetadata nbVJ7vLDkUqPfq7ku+FxPAAA 3 4ODcOSd6KkKjzME8pv0cKQAA CRS2FiBfW0S6bg0UhpMqOgAA jyLWe/6ZxUmfoKmPPWv2TwAA 1 oP7KQ7AE4U6j4EDGoFIm6wAA 5 isAnnotated vQi2Y2DRSkeABaZLvrkRKgAA 1 String annotationName CQmEUNx67U6rNGXZwITpdAAA getAnnotationAttributes vQi2Y2DRSkeABaZLvrkRKgAA 1 String annotationName RU2C982WbkCj0fp8/tevagAA getAnnotationAttributes vQi2Y2DRSkeABaZLvrkRKgAA 2 String annotationName 2/WOXtHSWEK5UKUYs5IgiAAA boolean classValuesAsString 2/WOXtHSWEK5UKUYs5IgiAAA getAllAnnotationAttributes vQi2Y2DRSkeABaZLvrkRKgAA 1 String annotationName 8UjowbN3hEy7gLcsCr914QAA getAllAnnotationAttributes vQi2Y2DRSkeABaZLvrkRKgAA 2 String annotationName 9G/wOlRV7kausl/fAUiVWgAA boolean classValuesAsString 9G/wOlRV7kausl/fAUiVWgAA AnnotationMetadata nbVJ7vLDkUqPfq7ku+FxPAAA 3 c3sG9JoXRUmufA0nJFUX/QAA COY+l/A01E+K3SgHlQc4ygAA XFH3TaBL/UmKY0DQ3hlWZgAA 1 RowLLV1WNUSRcCRZAcTo1gAA 2 oP7KQ7AE4U6j4EDGoFIm6wAA R73QzYeF+kyC/gnMJ22FSwAA 6 getAnnotationTypes 5VqPrOIs+0iTw3MhhLW/dAAA getMetaAnnotationTypes 5VqPrOIs+0iTw3MhhLW/dAAA 1 String annotationName 5FDVn75CKESJpnVka79xZAAA hasAnnotation 5VqPrOIs+0iTw3MhhLW/dAAA 1 String annotationName NkN9EjszR0605B8Ngo0y+gAA hasMetaAnnotation 5VqPrOIs+0iTw3MhhLW/dAAA 1 String metaAnnotationName +Hrhs68CzUCCS97Bd4LPlgAA hasAnnotatedMethods 5VqPrOIs+0iTw3MhhLW/dAAA 1 String annotationName FxpquxeOIEaRFM/GQgRIQgAA getAnnotatedMethods 5VqPrOIs+0iTw3MhhLW/dAAA 1 String annotationName J0KaFfXLxUG6wXFu3vOXRAAA nbVJ7vLDkUqPfq7ku+FxPAAA 5VqPrOIs+0iTw3MhhLW/dAAA vQi2Y2DRSkeABaZLvrkRKgAA 4 1rH//ezMokmD5X6/KI8llgAA 45jLT84yFEqXSfJHPi9xkwAA kIedygnHk0WgnhFspATvYAAA qCrkZ9XTk0CBLDKhW1kq+gAA nbVJ7vLDkUqPfq7ku+FxPAAA 5VqPrOIs+0iTw3MhhLW/dAAA itTFNbx7eE257mwWOP0ESQAA 4 Knu3RwdIXEaeFY0wFaVPJwAA Fp9xyt6MQU+y0mTMHpEVzgAA TFJmTZIvq0+EmlUBr2Ly8wAA 2S4od8D+zEmhb3zVPn6VtgAA nbVJ7vLDkUqPfq7ku+FxPAAA BFIycENp70+yPjWWA4p4QAAA 5VqPrOIs+0iTw3MhhLW/dAAA 4 dC0F0PEM+024gKGO4zH04QAA R0SSpij0ukKzDu5qR9GamwAA 7qsySVDM1EapsSi6hIKMVQAA iyuNL80VSkeDVRlJMkZQOQAA nbVJ7vLDkUqPfq7ku+FxPAAA QA4wE263HE6kcERUeJxJ/AAA itTFNbx7eE257mwWOP0ESQAA 4 aGiK06SrZ0GQ8SCg7aFYVAAA Bj6RFS5TC0+0Uzp3nQ1ksgAA FRZMm1KXn0S4tPvUJuzHGgAA fQ0FptfOAEaH0XE5IfQqKgAA nbVJ7vLDkUqPfq7ku+FxPAAA BFIycENp70+yPjWWA4p4QAAA QA4wE263HE6kcERUeJxJ/AAA 4 sTwXxrmDuEWSrfaQYM0G7wAA I50Va6rkDEqynVUNJ3fTDQAA lfDUXnCUJkiSK1LILgpeMgAA zNLgQAzjUk6xc7d1ciB+fwAA BeanMetadataAttributeAccessor True nbVJ7vLDkUqPfq7ku+FxPAAA 4 PBnaJtiNJ0OXX6wcGQlpeAAA /K3ceSEeX0eYpmWA1zSjkAAA gu3z3N3Rok6j31icWpG1iAAA p5tNpA8tp0qZjWBFWFNH9gAA 1 1UvXitN0Mkq7QQJWqJn8fwAA 1 l7fFEQvFg0aMvT9nwpvoYQAA AbstractBeanDefinition True nbVJ7vLDkUqPfq7ku+FxPAAA 4 41AiOyVwfEKePmrbmS2TPQAA F2s4LQs1y0GpGZySk5VBKwAA d0DABPpUl0mlhZMMkR87NgAA 5q+1rFvAjkOFDEl+LpGgsAAA 2 YOQVy9I1SkaanqDQbfkiggAA B+MT5nlkoUWL3puEUWLPiQAA 1 l7fFEQvFg0aMvT9nwpvoYQAA 1 njw96owagU2RtmM+pyDI7QAA BeanDefinition nbVJ7vLDkUqPfq7ku+FxPAAA 3 ek/9xvBQPk6Wkek8ygn6GQAA DgqHib4ty0iOibYihUR+7QAA 6OLU6gtG60yS6YvA9P6w8gAA 1 YOQVy9I1SkaanqDQbfkiggAA 2 fHkRnDij30uCRn5IU5drgwAA dJqmWQ+lP0u2siOKjOXa6QAA 1 IzudCUDX/E6hcPRK7fI1igAA AttributeAccessor nbVJ7vLDkUqPfq7ku+FxPAAA 3 /7kuTeMjl0aKqZ2AHhts6QAA ZtgYXfX4Z06A6DPLqx9INgAA mhGmM8MK2k6MUU9izABiowAA 1 fHkRnDij30uCRn5IU5drgwAA 5 setAttribute HaJwu/NEWUGUmsbrnyRE1AAA 2 String name 34b7Pn4uGkG8jcSVxyvTwwAA Object value 34b7Pn4uGkG8jcSVxyvTwwAA getAttribute HaJwu/NEWUGUmsbrnyRE1AAA 1 String name 96j42oJyWkeTlnyQl4YaSAAA removeAttribute HaJwu/NEWUGUmsbrnyRE1AAA 1 String name WyIeHRp7skeibg3PlXJvyQAA hasAttribute HaJwu/NEWUGUmsbrnyRE1AAA 1 String name BPt1LdCREE6AuIeoq9mMkwAA attributeNames HaJwu/NEWUGUmsbrnyRE1AAA nbVJ7vLDkUqPfq7ku+FxPAAA qKRw/gLxB0KuZGLDMjsLnwAA HaJwu/NEWUGUmsbrnyRE1AAA 4 aP/nTinliEqROrkN3dR6AAAA x+JYQHfeJkOvx2/BX/vC3wAA 0Rbhf4gsXEu0DutR8wp7CQAA 35zBdwa7lk+nyYtywVflygAA nbVJ7vLDkUqPfq7ku+FxPAAA qKRw/gLxB0KuZGLDMjsLnwAA uRGuoiFcFki3s/Kae8CI+AAA 4 VO83Q5ye6Ue/saen89d/yAAA TArm5ZhkjUS9AB86cvRDcwAA 8ziqMlBSx0KgrPxgxB4niAAA N2+Llu27i0WICz0KMkxShQAA nbVJ7vLDkUqPfq7ku+FxPAAA 8IMLTVNhqku9b1My+RHNXAAA uRGuoiFcFki3s/Kae8CI+AAA 4 MeiqRplPvUKforj58na44AAA G7yGQWAJ8kyYcTZoreLv7wAA cINibml4B0SwnMJWCbKR6QAA hi63BNRi7kOfF06KUmAohQAA nbVJ7vLDkUqPfq7ku+FxPAAA K/tU5z51IkemB/ISoFQtpQAA 8IMLTVNhqku9b1My+RHNXAAA 4 /q3BCb4B4EiPMh0o4yucNgAA cafzvCUFlUeCBtFAIBVPOAAA Splex4tVxE2AMmyYCCQ6vAAA MxAbFE2UcU6s8ogSIy+UBgAA nbVJ7vLDkUqPfq7ku+FxPAAA K/tU5z51IkemB/ISoFQtpQAA qKRw/gLxB0KuZGLDMjsLnwAA 4 jpbLiOqtU0WoxG6ER0uQ9gAA socdA2e0RUWnNvu6vNb+8AAA 7DOqQFQca0mo0FYACmEeUwAA dBF1ICMw1EajR5L56SHXAwAA Cloneable nbVJ7vLDkUqPfq7ku+FxPAAA 3 PgDsOlhFMUOXXTtdHERSYAAA 6bZHhYHgk0OPzUt14QrYKwAA 7xalez7NP0yJCv2jNrnAwgAA 1 B+MT5nlkoUWL3puEUWLPiQAA nbVJ7vLDkUqPfq7ku+FxPAAA K/tU5z51IkemB/ISoFQtpQAA iysa9DgagkKQoDrCxAIZgwAA 4 rFg/GNgBuU2fSLB8flCXwAAA L6DyHB4/sUascx/msBx5IAAA OdQbGSRBZ0qrvP01zLM3iQAA e89GHxdcdU2VQjHce8Ea3gAA GenericBeanDefinition nbVJ7vLDkUqPfq7ku+FxPAAA 4 LY2xZmqBaUSyzSQgbuCWqQAA xNTmSaLFQEe3V9SHiQA1NgAA ZpxPaFoCt0aB0qcA9X93gAAA avcZiQPoiEmLLzlVHkjstgAA 1 njw96owagU2RtmM+pyDI7QAA 1 9RufzGrTXkK/sOxEZFOgBQAA ScannedGenericBeanDefinition nbVJ7vLDkUqPfq7ku+FxPAAA 4 Dfd5IG9Y10Kye2drO8wcQwAA beJoLcCsSE2tTRbxXSia3AAA XekQawq9T0Witar/timWcgAA 8M8UiTDiz0OsRCA5iDYnoAAA 1 vvwJaojDXEKJqJydNyHPFwAA 1 9RufzGrTXkK/sOxEZFOgBQAA nbVJ7vLDkUqPfq7ku+FxPAAA 8h2SPQ9gN0+fUrwq9mmVWAAA K/tU5z51IkemB/ISoFQtpQAA 4 tpahr8Y8aUWl0lq/xaEOQQAA 4DbgVHe2NUC56l1vKfjR6wAA oAjyBv7bDEqJNlWKHS4xGAAA ELufDbHQVkGCnFYP5NFkIAAA nbVJ7vLDkUqPfq7ku+FxPAAA ZCRiCBoX0U+bC/hmIixd+QAA 8h2SPQ9gN0+fUrwq9mmVWAAA 4 1cpSn4DXJ06Om/9I8exTnAAA NYGqNTjBUU6+1Wr+l+q9GgAA Wb6PZ6DKo0yViqzVDw8YhwAA Om4yqu34Y0Kn1qUFPALwGQAA AnnotatedBeanDefinition nbVJ7vLDkUqPfq7ku+FxPAAA 3 N75hIMOgpU2q0QMSoiBbhgAA JDnl0l99hEKE16lM4MJK8QAA p0FRciH0p0SR0u9n6T5NSQAA 1 vvwJaojDXEKJqJydNyHPFwAA 1 IzudCUDX/E6hcPRK7fI1igAA 2 getMetadata ZfWRn4cGtECb2rU1HX1moAAA getFactoryMethodMetadata ZfWRn4cGtECb2rU1HX1moAAA nbVJ7vLDkUqPfq7ku+FxPAAA ZfWRn4cGtECb2rU1HX1moAAA qKRw/gLxB0KuZGLDMjsLnwAA 4 7ld2dUutdUOsyEufGZR+MQAA VANFMAGA30GqNpoaBk/+3QAA p0Ywo2J6okiPjWrz6DwOoAAA wSQRrv7dDEu0VuMdOCPVMwAA nbVJ7vLDkUqPfq7ku+FxPAAA ZCRiCBoX0U+bC/hmIixd+QAA ZfWRn4cGtECb2rU1HX1moAAA 4 TDQfVjucREOAAKQUux/jagAA 5mdPCdneVkaN+0Gdi5y8PQAA CHi+/LTnLEurnPGFpbj7QAAA DgKUeBqdCE6P5A6j11ymCAAA BeanDefinitionParser nbVJ7vLDkUqPfq7ku+FxPAAA 3 BHtd+W9DhkyC658zmQIfZAAA cs6ZGlhSeUa69djJrVUv1gAA DT9pi/kdkUmbMnVfGCOaHgAA 1 i7R/ny8QTk2RdmZC7nXOUgAA 1 parse MbbZMq4jZ0CmSdBbox622wAA 2 Element element I8noXFuVp0m87b0cUisLMgAA ParserContext parserContext I8noXFuVp0m87b0cUisLMgAA AbstractBeanDefinitionParser True nbVJ7vLDkUqPfq7ku+FxPAAA 4 Y5nbK+KGVEOEOpU+6VrXzgAA b7sqXdmIRUandeExeLFfVAAA NMRAWabSc0uLu03snBxn4AAA 6R5LYN7+v0idGOeJ5hB+xQAA 1 i7R/ny8QTk2RdmZC7nXOUgAA 1 SBarO1yEwkmFhz0ddO4OgAAA 1 parse TORzrnYDOkuWPjNxnNyj8wAA 2 Element element cl6OF9t/VEKuszhKZGbchgAA ParserContext parserContext cl6OF9t/VEKuszhKZGbchgAA AbstractSingleBeanDefinitionParser True nbVJ7vLDkUqPfq7ku+FxPAAA 4 h+WP75HvZE+TfvSkZwNSvQAA jhsKK4hD+EepoTSGBfJ/KQAA gyiyb0cLDE2C1PIXTG8zRwAA OD7qJZveO0a6StCz6EZt1gAA 1 SBarO1yEwkmFhz0ddO4OgAAA 1 h630ktK2tUeK8QEQRSUR7gAA 1 parseInternal vkProtected PEODTGZhw0SY5xzanjJW1AAA 2 Element element bpABQVWzpkiK9YosmguO6gAA ParserContext parserContext bpABQVWzpkiK9YosmguO6gAA AbstractPropertyLoadingBeanDefinitionParser True nbVJ7vLDkUqPfq7ku+FxPAAA 4 Gp9lEoXKKEGs9OV8qccxCgAA CJcJIiD/tkWakvV8iNKtIgAA KWNu54JYtkurPbdWz+nVrwAA shZyDYmABk2zo8HjlV0lVgAA 1 h630ktK2tUeK8QEQRSUR7gAA 1 aZqHYXeca0uOIqp8c6nueAAA 1 doParse vkProtected oAoJkGf5tE+38JVKmj4XIwAA 2 Element element aYCUvxzcck2Cu7XthfqJ2QAA BeanDefinitionBuilder builder aYCUvxzcck2Cu7XthfqJ2QAA PropertyOverrideBeanDefinitionParser vkPackage nbVJ7vLDkUqPfq7ku+FxPAAA 4 CWWYc31ISEqlcmbO+1pLNQAA jYVdBQtQ3kCmuga/9sojrAAA kwE63KdWz0uNaanDlVQWnAAA kE64NcikjEGAInJgjHzTnAAA 1 aZqHYXeca0uOIqp8c6nueAAA 1 doParse vkProtected p96AmgmRVE+vPxt2Jg2YGgAA 2 Element element dCTXGPIwH06mpvIvcDKCHwAA BeanDefinitionBuilder builder dCTXGPIwH06mpvIvcDKCHwAA nbVJ7vLDkUqPfq7ku+FxPAAA TORzrnYDOkuWPjNxnNyj8wAA MbbZMq4jZ0CmSdBbox622wAA 4 vCDfauQgu06D1MJZrSsu0wAA d1cL9THAEEmF9oC0ud9IgAAA Wz5rZnu3DkGHsIApWA4ZSwAA LC4+paGYJki5w46rYqxrgQAA nbVJ7vLDkUqPfq7ku+FxPAAA PEODTGZhw0SY5xzanjJW1AAA TORzrnYDOkuWPjNxnNyj8wAA 4 Po9YK4fs40+gasIuV5FzfAAA S9yCpFihYEmtTglAKpm/AwAA iyGbmNK5UEawtSKstg3A5AAA AIhrxU4fW0Ciz234GScz/wAA nbVJ7vLDkUqPfq7ku+FxPAAA oAoJkGf5tE+38JVKmj4XIwAA PEODTGZhw0SY5xzanjJW1AAA 4 7wgVRRctwU6PlJudXBHtqQAA tmH8pDbEmEqI26mi/e49+wAA ZZtiM8f880CEkQ27KId+IwAA LQRPpob5pkivYQTw1CMWiAAA nbVJ7vLDkUqPfq7ku+FxPAAA p96AmgmRVE+vPxt2Jg2YGgAA oAoJkGf5tE+38JVKmj4XIwAA 4 VeglYLKt3kChlGreziXlqwAA t/p6mGteo029NCNN3aSimgAA lX9xTZ6JKU2v3VkHT7pHfgAA agkq6E/7A0SoEMbCz2iZZQAA PropertiesLoaderSupport True nbVJ7vLDkUqPfq7ku+FxPAAA 8 8ydy80mUUkigDU5/BOIxzAAA VjpH3aBfF0u844y3Krce7AAA ayPfRuUDqk2hBv6V9rwv9gAA m8NtzK9hzUG3Dp1DARl48wAA jhzV5nxdoEWxT2JMVR3AgQAA QRoninso2UaUmg3hCfuMnwAA vxvWi4z7r0OKyOLej49IewAA H7dAnzt2906BOAECWK4BeAAA 1 EmVEz1Ziqk6Zzvulycq/pwAA PropertyResourceConfigurer True nbVJ7vLDkUqPfq7ku+FxPAAA 8 cSgVq/EAJkyu6pxn7c0ivwAA xS1FZviBfUWYHM/w6HSxhAAA ggl6aX4Ty0yr2kRTekUNswAA fWdcKZts+0O41aau0oF/1AAA qI8UKsJpd0+F2YdFBQR9BgAA v5aK1ACx60+rwLQiu3rTZAAA FNqDVW1jIE+lVVa18qzzKAAA NpBKaaOGuEaA3QBYtl/6dwAA 2 92GiuLMcwkmSaiwctkgvYQAA H5RTzus3b0WW1hbd2HaOPQAA 1 EmVEz1Ziqk6Zzvulycq/pwAA 2 EIyUzWO3G0GOKV9xzip+WQAA voGMqbzLBU6PiXntQa1j9wAA nbVJ7vLDkUqPfq7ku+FxPAAA JF4DmVc7S0+F0KoB7xDxtwAA HIqcCSDKREG1UtMfjsVM3AAA 8 rbDnSPZOnUyIQrlN+I6d4wAA pycQJDf3u06j3bZWIya+EQAA 92AIyrs4nEW373YJpijFcwAA PvZ7qF9JcUi45HDVFbLAhgAA gfoubPcolkCljlL+udyY6QAA LppMJOBY8UKlaGhuZMO0PgAA gV3O8gA9B0y0r2MVjDUwYwAA 15cqyROFvkyk/3CX5MHPGAAA nbVJ7vLDkUqPfq7ku+FxPAAA JF4DmVc7S0+F0KoB7xDxtwAA hm4UBSP8KkupBZYdml93SAAA 8 +0Cs3g1NpUOuNSJAyboSWQAA 7IrpDuQjokurU63ify1N5QAA 2MN+iorLJUWEmrJgcrFHeAAA iD3ZfqA+RUKTxp7iW1m68gAA 5Onf/XIiVECLANPKAw/IoQAA KdhhPbIR8EuNKBV3+RQKSwAA kICP4rvd3k6QOlGdrrlJcAAA 4t3bFWiyo0yDREp/ICJ21QAA nbVJ7vLDkUqPfq7ku+FxPAAA JF4DmVc7S0+F0KoB7xDxtwAA n6D/sAuOQUeQrhIM2F2uDQAA 8 6sczth0G6UO58X1trdN+QgAA RDTJ/Pgw+kK2atQbIBtQYAAA I5KfOF3QJU+thEmrYCPnjAAA WCWWAQzyDUWnSIYcsvU4HgAA oT+7OZaqU0qoj4LA6E7MpwAA UJctpQyLFkOnVTtVruQlSQAA /Y9TskYJBUudvBWyZspWiAAA V7SvJu5gGUe4lHaXR/RnEgAA PropertyOverrideConfigurer nbVJ7vLDkUqPfq7ku+FxPAAA 4 kUSA2pc53ECUpIGU5IkvmgAA wbLNR+vwkUumn+tTKhtJPgAA myci/1YlwEqbELX2KJxKwgAA vaoSI/ENzEudPPwjpYiTzAAA 1 EIyUzWO3G0GOKV9xzip+WQAA nbVJ7vLDkUqPfq7ku+FxPAAA niWYRjPRI0uCwcaqldMmMQAA JF4DmVc7S0+F0KoB7xDxtwAA 4 FrvGMInRQkCyB4+tjHYWkgAA 80z5D9b/RE+Q/NM08dir5AAA jd4rOIUKp0+/l9mYGTfACAAA Df7AqwCds0OvDheCdOxzAQAA PlaceholderConfigurerSupport True nbVJ7vLDkUqPfq7ku+FxPAAA 4 c4CEeVANG0qdD2AqdbQt4gAA Xbo8Tl78Ik2u3ogjnTMUGwAA LABFikQun062Pe3jQcsA6AAA DQjug0FBCkWYkOcz5AOGKgAA 2 +q4WimsmqEO1pBMVb/zzKAAA 1gQwnFVO00CDppgTQldutwAA 1 voGMqbzLBU6PiXntQa1j9wAA 1 j8Z5aYt2M0ehuFJstMbabgAA BeanNameAware nbVJ7vLDkUqPfq7ku+FxPAAA 3 tLzBanbWjkyI/OBKWQtUAgAA 8unSOCJirUC0NDT2tF0I7QAA Ax3Xub11XE2saJC9zpH4cAAA 1 +q4WimsmqEO1pBMVb/zzKAAA 1 setBeanName(String name) 4IvL8ppvB0eswla5878HKgAA nbVJ7vLDkUqPfq7ku+FxPAAA eIpUnveYqkCRa7etL7diIgAA JF4DmVc7S0+F0KoB7xDxtwAA 4 CSrGz4E7+EGCMPrf8stDxgAA rer7rraK4EmYx8smIi48aQAA RDWzL7QNNEe/0fZiJuInfwAA J0VvDenRaEaWAve+1aV05QAA nbVJ7vLDkUqPfq7ku+FxPAAA eIpUnveYqkCRa7etL7diIgAA 4IvL8ppvB0eswla5878HKgAA 4 GnC6eAPYrEq0r0HHSTpJJQAA mxjCmkhMFESuIb/9P4FTTQAA KvsItE/PTEK8orfvuoeWiAAA 4MH5XzU4GU2QAWiioKBvVQAA nbVJ7vLDkUqPfq7ku+FxPAAA eIpUnveYqkCRa7etL7diIgAA OFapkoq+jkSh9RkSxTL/PgAA 4 O7dCVM1OQEqQMlG1OWjTogAA h+lfGRKtvka2AFl9TvkOjgAA ZbCrpH0XsEmEQXWG4Xfj2AAA wDaXpx87Tkyq0O9OU+mmKQAA PropertySourcesPlaceholderConfigurer nbVJ7vLDkUqPfq7ku+FxPAAA 4 /kSpBczQM0GrYfSkhuqmLgAA iJA7DyuS4Ui2dnDXdJIOwQAA VU4cAWd+UEOIqxb3jlYtfQAA FzfHeNI+zUOvUF0y9qZmTQAA 1 sVYoBNNEY0yPjZNg+I/P5gAA 1 j8Z5aYt2M0ehuFJstMbabgAA nbVJ7vLDkUqPfq7ku+FxPAAA VpwWB3cTJUSsed2CCE6KyAAA 5sEi98Ciz0K3X2G7qyR3fQAA 4 cZgdKmbSlkGY46+NoWCY8wAA PZFYwGKI/02vZokteeN29AAA 8RwwcW8SpUOMrfx27B+mwgAA FP10Oxvtl0+yLMbatoRiBwAA nbVJ7vLDkUqPfq7ku+FxPAAA VpwWB3cTJUSsed2CCE6KyAAA eIpUnveYqkCRa7etL7diIgAA 4 U5j6SKBeVkqlK3F6cHiBhQAA +nwVeQYY4UW2+hee3H2ORAAA rz2MwXwPNkKlHpjDUBb80AAA GlEU7x20fkqmmgT6ojPAewAA LoadTimeWeaverAware nbVJ7vLDkUqPfq7ku+FxPAAA 3 Tx97xq2U7UCEjKufmd6I/wAA Y+UZLXF3nUe9hRJPSjQj1AAA VAPHjczteEWH1MgIcAv8KAAA 1 RmvXZbMOckKOotKqlzDWUQAA AspectJWeavingEnabler nbVJ7vLDkUqPfq7ku+FxPAAA 4 evv4+H+qhkuSk0AcVAXQoQAA QiWxnEjn0UaVRPE+KqEhfAAA kDvn6uObu0u5OcVIntYgbQAA Rk2Bx/7YI0aX8O3MPcEu8QAA 4 EfRuDcIwLE2FccCxj/D7xgAA eXKTJ0IOJ068AO/d304lPgAA RmvXZbMOckKOotKqlzDWUQAA a2JNr0/XXUigJC6urdwOlgAA nbVJ7vLDkUqPfq7ku+FxPAAA f5NYp2SUgEGfOrhHvl9aKgAA hm4UBSP8KkupBZYdml93SAAA 4 M+C4YACB/kiWupwVz6c+vQAA gInWKd/D0UOfUm80HrKPsgAA GgmXy52+l0SBrX6Sb4atqQAA AUYBFr1OFE23NWLEBuQyNQAA nbVJ7vLDkUqPfq7ku+FxPAAA f5NYp2SUgEGfOrhHvl9aKgAA vKy1CmQQ2kiao5Z+XZsFhQAA 4 9oWiIc50iEuUweR7LCmTIAAA FQh1twhxUUOA6d+fpONwBAAA 4SyXwGX+l0OSy5EdbWSOcgAA s/43P/vAokq/GcicZfV2CwAA nbVJ7vLDkUqPfq7ku+FxPAAA f5NYp2SUgEGfOrhHvl9aKgAA knAYppFiDkCaMxJYvaPa5QAA 4 d6aU5xFoZEeg+ehGzxmzBAAA rMBgF2KkU0yO65zBOpky2AAA MvBHo8qWxE68yJx6ovjSrwAA s4EYdCv3fUGEjE+AxVcEOQAA nbVJ7vLDkUqPfq7ku+FxPAAA f5NYp2SUgEGfOrhHvl9aKgAA NHtPpn7SE0WAntXGhegIOAAA 4 giLiT2U5QkqAUv3FkLLowQAA Wf9P4/+pbk+w7iziJVzTSgAA XoweqgkP6kqlJHv6EKf1hAAA lYiET32sOkKsSz+YsTnuHgAA AbstractDependencyInjectionAspect True nbVJ7vLDkUqPfq7ku+FxPAAA 4 UBoQtbHU6EmNgz9b0UoLxQAA NszxYkbfX02ZB+R5EUdJCwAA DFQZVyRRpkyYcQ4unRIblQAA SfYDD8IouESm3UkvgjpUtgAA 1 fPqniiaY9EuNDpDrThoAtQAA AbstractInterfaceDrivenDependencyInjectionAspect True nbVJ7vLDkUqPfq7ku+FxPAAA 4 A+zQF4TUXUSXaBy1h5DpNwAA bM1fkcR7A0aDG3EYDamh7gAA bz4qlCN1Rke9yYY6K05KnwAA em4GA68a60aa/w+7PBnKEgAA 1 fPqniiaY9EuNDpDrThoAtQAA 1 Gqan3fzyME+Ad0vLB1Eq7AAA AnnotationBeanConfigurerAspect nbVJ7vLDkUqPfq7ku+FxPAAA 4 GFMtIxGPtUO8StFezkB9xAAA UZglGzQL6EmP7+4FW6+QagAA 8Vxb4jSWnkCcACz08UiaZQAA RPFbYERslE22wNSHzlg+OwAA 3 Ph1BMeAEyk6O8p+28amPMQAA odBzfv1YhUqw9yBfMXwqEgAA CIZlh8EbDEiPxhBalfGaJQAA 1 Gqan3fzyME+Ad0vLB1Eq7AAA 3 configureBean jNVEhqG7PUyFqt2qT16RxwAA 1 Object bean 5t4+JhwiP0mE3rs+l5885AAA aspectOf jNVEhqG7PUyFqt2qT16RxwAA hasAspect jNVEhqG7PUyFqt2qT16RxwAA 1 beanConfigurerSupport vkPrivate jNVEhqG7PUyFqt2qT16RxwAA InitializingBean nbVJ7vLDkUqPfq7ku+FxPAAA 3 Q4MU5pVO8kiYViy3yyTVagAA dV/eSJIRKkK4sF40yxATawAA MVmK3MTiqU+ivAf3MXXXHgAA 1 odBzfv1YhUqw9yBfMXwqEgAA 1 afterPropertiesSet() gZvAnMeWCUO2CBaOG8ULXwAA DisposableBean nbVJ7vLDkUqPfq7ku+FxPAAA 6 yt+/f9otyEO1wqB+mI/dzAAA /sTqGn5JzkWpCwix17HR4gAA We09NGja0E68Seh3eCmubgAA gswqLau96EqdMjkmiytVtQAA /kPt39LgO0uNVv4L6guJ2QAA nSflRTamf02a7wwkF3fyXQAA 2 CIZlh8EbDEiPxhBalfGaJQAA HVbd6JvvWUO/yQ6WovZwzQAA 1 destroy Vzw5iM+KfEaYtfY/EIdRdgAA nbVJ7vLDkUqPfq7ku+FxPAAA FxxWAeyisEOSRwsDMRZ+VgAA 34W0u1gTD0eUxuv4Pl2FdwAA 4 fiF1Y4l+RU6G2hKYhBZ2jwAA a+mduKvWaE+dSW8bUx3ZfQAA 7rhdzC3HgU2nyhXnhn57RgAA pOZ1XU3CyEC4YiW+brLRGwAA nbVJ7vLDkUqPfq7ku+FxPAAA jNVEhqG7PUyFqt2qT16RxwAA FxxWAeyisEOSRwsDMRZ+VgAA 4 gPGyMfkQO0q9nMhzrwM3mQAA n57xBooapEOtxZacozMQywAA KDVaZi2wpUWToOLw9fULZgAA A7MvW0OyD0+N9vwZgmjd2gAA nbVJ7vLDkUqPfq7ku+FxPAAA jNVEhqG7PUyFqt2qT16RxwAA OFapkoq+jkSh9RkSxTL/PgAA 4 nLymAFBfLEWiLIrSc6l5tQAA Qj+mtzHvrU+R+oXDEywMnQAA 1knpskP340qkyVgsPGq4uAAA Hazaf48joUKD5aTlAAYLBgAA nbVJ7vLDkUqPfq7ku+FxPAAA jNVEhqG7PUyFqt2qT16RxwAA gZvAnMeWCUO2CBaOG8ULXwAA 4 822u7dX1okGq3LpDfLzMkQAA bWgNrqdSRka2MyYfXBDRJwAA HyoaSxybXkene35rOOXjdgAA nnIFaE8L4k6LIVJk4yHFuQAA nbVJ7vLDkUqPfq7ku+FxPAAA jNVEhqG7PUyFqt2qT16RxwAA Vzw5iM+KfEaYtfY/EIdRdgAA 4 n5PA4dO4bEuEcodKb/Cl7gAA 0NeQIEIRnUePkQA6h15KowAA fs8oXwhb90G4GvdNTyAcAgAA cZ76YITeqEeI14Y90iB2qAAA LoadTimeWeaver nbVJ7vLDkUqPfq7ku+FxPAAA 3 3YKShM2MZUaGcuFYxqHrCAAA 3d2jEr/4VEqdlr34iouipgAA +afYVfGivEGD6efLLqH5BQAA 9 cPHVF6oWKkG0Cp6Fm4O2rQAA 89E3FV2/ykKPYnSewgyCagAA COWpb9SzDE+GgqsE6pG52AAA CgMiN+kZB0OdhrQ8sgX+XQAA mKmCgpQAxkiGG1gQVUvqnQAA fLUFpbt7XEOaxu0FtqM06gAA g1oTRuQZu06/CU1457gF7wAA y9OwZGTQOUCy/s4X2KTXbwAA Dz52Mw4I2E6hY9O4e17QrgAA 3 addTransformer mSvYA1fuTUOAcBL6Rea0awAA 1 ClassFileTransformer transformer +bydyzoQTkuaEUlHkWHrpAAA getInstrumentableClassLoader mSvYA1fuTUOAcBL6Rea0awAA getThrowawayClassLoader mSvYA1fuTUOAcBL6Rea0awAA SimpleLoadTimeWeaver nbVJ7vLDkUqPfq7ku+FxPAAA 4 fVlmaVe+jUWZCnYSXiQUvQAA tNd+/09G3kecRcEuVIX5+wAA xuEQ55+KLkimp/A1EtbQjgAA a14WplTE80KjltnC5wYKtwAA 1 COWpb9SzDE+GgqsE6pG52AAA TomcatLoadTimeWeaver nbVJ7vLDkUqPfq7ku+FxPAAA 4 eZJbKR4NV0qFAH9yyRubBgAA iuwEzlrZOUeOof7WFCDGSQAA 1IsVBjODtkqEdDeOeR0r0QAA fWbi/zDkBUariRTpJJfRywAA 1 89E3FV2/ykKPYnSewgyCagAA DefaultContextLoadTimeWeaver nbVJ7vLDkUqPfq7ku+FxPAAA 4 ZvlbHsrwhUGSOKEszaz2UAAA ZGHyVQKO70elJ1kdt5BwXQAA QtZUhHTq80+k7QwzU/IAyAAA 6q/+LAWgYUKJR0jHjjZV8AAA 3 cPHVF6oWKkG0Cp6Fm4O2rQAA 4F+fwLQ6yEC51rw6UFN0TAAA HVbd6JvvWUO/yQ6WovZwzQAA InstrumentationLoadTimeWeaver nbVJ7vLDkUqPfq7ku+FxPAAA 4 ede7XT+PWE6NkzZsU6jmyQAA cw6tdLo+d0yhAjJ6iNYCgQAA hO6RWW7nj0GApV6Uzj9vIQAA WEIImLkUc06hCc/Manr3SwAA 1 CgMiN+kZB0OdhrQ8sgX+XQAA WebSphereLoadTimeWeaver nbVJ7vLDkUqPfq7ku+FxPAAA 4 hI2vdd6dykawxYFciO7DegAA IGCuU1n5u0K+WPAW4rEEGgAA 6hZn4aaB+UCwMkDoMOlnwAAA K2wHifDLEE+5HVdl61CeOgAA 1 mKmCgpQAxkiGG1gQVUvqnQAA JBossLoadTimeWeaver nbVJ7vLDkUqPfq7ku+FxPAAA 4 U9wuV6COCk+AS+57ef457wAA wfK0Q4UatkaU09Bl/1U0qgAA DL7ZWOsP9U2D0Cj9zunUygAA kSVy/8nhI0OgtE8ualVkpQAA 1 fLUFpbt7XEOaxu0FtqM06gAA WebLogicLoadTimeWeaver nbVJ7vLDkUqPfq7ku+FxPAAA 4 NCf1YjlQAUeN2BQd2pSdOAAA FP7RrBAFkE6n921uQkyYegAA Uv6UGWJgnU2PD4tsjh2gtQAA lRC8+Msx60WZHI+ry++uEQAA 1 g1oTRuQZu06/CU1457gF7wAA GlassFishLoadTimeWeaver nbVJ7vLDkUqPfq7ku+FxPAAA 4 IYOQPzWYK02KPUx7YI/yiQAA GRYO715ghk2kQDZV9EaEYAAA BGyExLvQx0i5Ot3xTagffAAA qzGNEqn6zkSHqQ5m3hDPLAAA 1 y9OwZGTQOUCy/s4X2KTXbwAA ReflectiveLoadTimeWeaver nbVJ7vLDkUqPfq7ku+FxPAAA 4 GPXpjzDfNUqTUZVOgqXAXQAA 8tb861b1zUCVhGaw6CNUywAA X0iSJsm1KUqxrUbJAhEDkQAA jH9OK3/oCUGehFn3XK/JjgAA 2 LCzp1hViKU+mkQ9+X5n1yQAA Dz52Mw4I2E6hY9O4e17QrgAA nbVJ7vLDkUqPfq7ku+FxPAAA Ohrz327qXkWtommrs6hzHwAA mSvYA1fuTUOAcBL6Rea0awAA 4 kYtkZDViqkuiaE0CyOfLBAAA uMARZ9Zjz0y4qpOp/TmnSwAA +TqubsZR7kifJgfk3Qg21wAA tKmG+rru902cQBSjfLrW9AAA nbVJ7vLDkUqPfq7ku+FxPAAA Ohrz327qXkWtommrs6hzHwAA vKy1CmQQ2kiao5Z+XZsFhQAA 4 yD8Y2EDBVEeAR+hxnNA5oQAA HbRQLfGag0iC9HQzsEEYcAAA fDwihoeE5UKUZdMCp5sB3AAA 4COwITdzzEawXYhQSYOG3gAA nbVJ7vLDkUqPfq7ku+FxPAAA Ohrz327qXkWtommrs6hzHwAA Vzw5iM+KfEaYtfY/EIdRdgAA 4 WFl/RuJxkUeom0oU3hPFbQAA tTw69wLxZUmM2TeAOV+WggAA Nay/WeFmfEue6WaZtQjbYgAA 8kAbS1AcP0+/KOgZPaZEGQAA nbVJ7vLDkUqPfq7ku+FxPAAA OfXVkQi3BEWlOy7wXrd/NQAA mSvYA1fuTUOAcBL6Rea0awAA 4 En2lxM3x90q4AopXqb4Y3QAA ouIWlbjX80G49KXkxhCaxwAA Gs8bVb9TA06CvhHt9MgklwAA elzoDUXrl0Knu6ZTz9EUUQAA 1 LCzp1hViKU+mkQ9+X5n1yQAA nbVJ7vLDkUqPfq7ku+FxPAAA xrsEPvOdi0Cl/sfPvSfCkwAA mSvYA1fuTUOAcBL6Rea0awAA 4 zn+74E0oPk6YbkIfRouaAwAA J71qM60cgkeyw8K4uKJeKQAA eusRNHj2m0Oh+Ae2wqu5TgAA o+jyri9vrUGa42LY4tzVMwAA nbVJ7vLDkUqPfq7ku+FxPAAA jIE90llJmUmfm/oFc77qtgAA mSvYA1fuTUOAcBL6Rea0awAA 4 PIN5EsvZuEWam5vYWPg+0wAA P4ubPC5Hn0Osg9srhFe/mgAA 8LaM1+orPUWdPFiZLOxoXgAA G5pmc0RL0kS0OAlKBdCPPwAA nbVJ7vLDkUqPfq7ku+FxPAAA AoIGeJepwECTx2bJvwN2IAAA mSvYA1fuTUOAcBL6Rea0awAA 4 9OsjupBOgk+csRN4M6xymgAA n1PxuOhn5U2Ifmi7xSriTAAA GcKsojXREkC5iy22IRWbEAAA ZFfuo1tacUK5ftvIh+otTQAA nbVJ7vLDkUqPfq7ku+FxPAAA kvxytqIpQkqLkLNUSMGmCwAA 89E3FV2/ykKPYnSewgyCagAA nbVJ7vLDkUqPfq7ku+FxPAAA /1KkH5/3UkGhYaKA4RSjpwAA mSvYA1fuTUOAcBL6Rea0awAA 4 xBs3Y7qR30yczakOgHPfsAAA 6e/BbU5dS0CoxCk8s0WZwAAA fxgdDds0nUajQ6ozFh//ZgAA 9jmjiIRg0UmavEXf7P1szwAA nbVJ7vLDkUqPfq7ku+FxPAAA rNEz3xC7qkW4cvAGDBWkIQAA mSvYA1fuTUOAcBL6Rea0awAA 4 H2EZoAeCOEiBBcqjVa9lNgAA AF2r9prbB0uK5HFq3NTfLwAA phBBHjRDZU2lLX3D4XREJQAA FT/1+w/YN0aIb3XNZwyNogAA nbVJ7vLDkUqPfq7ku+FxPAAA FnbD9UskdEywhQpo0Fj7agAA mSvYA1fuTUOAcBL6Rea0awAA 4 JfKsV5IfEEucU5HyHyht3AAA GYuFbGrWIEKacStMoXAn9gAA DCIBQcyghE6fXx3u3f6/nQAA yjq2lB4C4E2m27xm9EbuCgAA nbVJ7vLDkUqPfq7ku+FxPAAA kvxytqIpQkqLkLNUSMGmCwAA mSvYA1fuTUOAcBL6Rea0awAA 4 YQmenemauEm0/SG6nPNjPQAA WtWXl9KZDkaqyuw2PjxLMwAA Xx4l3QfH+UWvgd8tgnO8qwAA MwcauJiiNEasQDEYj2IbtwAA LoadTimeWeaverAwareProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 4 hVPHg+2OX0eCw/dWF8blXgAA eoMNXXYQjE+zgpSbRCfPLgAA /fLxT0n+vE65c+njzvbttwAA R7J6ghs3WUmFRfq7pc2cuAAA 2 +j4f2BkOHkW12/xFIV44RQAA nVSk609yHES4jAATVDDpewAA nbVJ7vLDkUqPfq7ku+FxPAAA LJYO9aCHk0ub9JVy3zn8DAAA NHfbNf3mHU+CjGOsJ9aPNgAA 4 NF3I8tjqAEmgEn+cKXgs1AAA OiZdNctcdUu1FQiA7sF5+AAA Jn6PPmOj2UeayLiuEjvfVAAA eta/E0aFk0u4xCbe+iX27AAA nbVJ7vLDkUqPfq7ku+FxPAAA LJYO9aCHk0ub9JVy3zn8DAAA OFapkoq+jkSh9RkSxTL/PgAA 4 kBqqUqA46ESCbAzE74BcCgAA G/1s8JwsEEqtb83i+k4BowAA V6Sk6dsz+UKm3rzWYj1JJQAA YkHciJYTkEmx61XcFTWo9wAA ClassFileTransformer nbVJ7vLDkUqPfq7ku+FxPAAA 3 SVsGs0wJoU+zyBXHu/hw9QAA G24vJHADqk2hiHij57QxTgAA /75BAanB1U2geYUXI9VlswAA 1 hR343UR5kEqsVzwbX6xgTgAA 1 transform RuWGm6XIgUKcD29SetZSXwAA 1 ... +5H4vmQmvkOTZjcRIzy+0gAA ClassPreProcessorAgentAdapter nbVJ7vLDkUqPfq7ku+FxPAAA 4 Et6RzPipFk2imyQvfP0R5wAA bKFwoMcrFUqci7SgrVuOXAAA TEuHSHiSOEGM5YtEn0YS4AAA nmHfqap+QUKI7o7VR+LNCgAA 1 hR343UR5kEqsVzwbX6xgTgAA 1 V5Btfhv+B0KaLgIqIlmyFAAA nbVJ7vLDkUqPfq7ku+FxPAAA N2LrGVOklEOysrIcFWeipAAA RuWGm6XIgUKcD29SetZSXwAA 4 nS+2d84oxEeBdT1WDHBGTAAA e+EAbRW5PEasCEpWZExMMQAA ae9IfsDTekKBYy9YhESfYAAA F60cIts4cEaWiHAnOBJYcAAA ClassPreProcessor nbVJ7vLDkUqPfq7ku+FxPAAA 3 KiejmKrORE+Q8XonBRdQlAAA wnxsfwfQ+E+RWuKY2c8I9QAA +pxBExw96E+0nAkMyFWb1QAA 1 0zp21yPDFUOtwUbGU4FrNAAA 2 initialize() qy/vg1sj2kyj5aXxVKnjlgAA preProcess qy/vg1sj2kyj5aXxVKnjlgAA 1 ... GkWkmd/nfkeAymwH1Wig+QAA Aj nbVJ7vLDkUqPfq7ku+FxPAAA 4 GQjRGJlN/keaTsHJt7YtlwAA Gp1PANUFAkeAwXYy1YRDfwAA 73xQoKchikmndr1Ap3d4lQAA rpgOggbUJ0ez4EVcckq/4gAA 1 0zp21yPDFUOtwUbGU4FrNAAA 1 0JmXmmja/kSGorRt0Y/JgQAA nbVJ7vLDkUqPfq7ku+FxPAAA 1c5qi68xYUm5xxKPBymcQwAA qy/vg1sj2kyj5aXxVKnjlgAA 4 Jp21p+BWykqzjSyIvziW9wAA ZZuN36z2ZUeb/1m4GroP9QAA e6oMNhqeqkC7bEELjez53wAA SXv1BBhU1UCVD3NSea/26gAA nbVJ7vLDkUqPfq7ku+FxPAAA 4 h/xBfBf5GkeoJFrFEZN1LAAA q48LqspBREij3ey01SztPAAA AGxY2xVegUC8zKEj/32MhgAA 73s98Y66Tk2Ge8EQSSD4aAAA 2 yp3GyjE0X0SDo79nZd13fAAA N2LrGVOklEOysrIcFWeipAAA 4 DGvN6S36ik+Yupg3vPDgMgAA L59+XJ+kRUSGiPUGbs5HdwAA K7Z22+YPwkSL7UXA7tbIWwAA koMQkLNkfEO5oXMgl/KW9QAA akComposite yp3GyjE0X0SDo79nZd13fAAA 1c5qi68xYUm5xxKPBymcQwAA 4 +/zbZGrmQ0CEC+HWmLwB3AAA 6cEiIuB5Y0WiDXXZVA5hXwAA 8en2iOLG8UCwAIqyTicPAQAA Mzb5suPfXki3n79K2XmEkgAA aop OB1ywkeJUU2zhj8yqaXuowAA 17 DefaultBeanFactoryPointcutAdvisor bXKXzrBC40m5Z1l+vw7pdAAA AzzTeAEAUk+T30IbmgoSHgAA 15 clMaroon $00B9FFFF 504 56 101 72 sdkNone yLcRy0LQDEaYZHd42I4LjgAA 1 Advisor <<interface>> False False yLcRy0LQDEaYZHd42I4LjgAA yLcRy0LQDEaYZHd42I4LjgAA clMaroon $00B9FFFF 504 176 100 59 sdkNone 5G2NEGmEq0SBJ9fguruyNAAA 1 PointcutAdvisor <<interface>> False False 5G2NEGmEq0SBJ9fguruyNAAA 5G2NEGmEq0SBJ9fguruyNAAA clMaroon $00B9FFFF 480 284 149 43 JnHy9+h+mEifVnNmvaAOAAAA 3 AbstractPointcutAdvisor False False JnHy9+h+mEifVnNmvaAOAAAA JnHy9+h+mEifVnNmvaAOAAAA False JnHy9+h+mEifVnNmvaAOAAAA clMaroon $00B9FFFF 352 176 85 59 sdkNone 0jYMhT28b0SC56izQqnCfwAA 1 Ordered <<interface>> False False 0jYMhT28b0SC56izQqnCfwAA 0jYMhT28b0SC56izQqnCfwAA clMaroon $00B9FFFF 652 176 86 45 sdkNone tzRhqojrpU+yzYGfd3vnNwAA 1 Serializable <<interface>> False False tzRhqojrpU+yzYGfd3vnNwAA False tzRhqojrpU+yzYGfd3vnNwAA clMaroon $00B9FFFF 444 372 220 43 7t0JMf8qFUuTKG9JVFon9wAA 3 AbstractBeanFactoryPointcutAdvisor False False 7t0JMf8qFUuTKG9JVFon9wAA 7t0JMf8qFUuTKG9JVFon9wAA False 7t0JMf8qFUuTKG9JVFon9wAA clMaroon $00B9FFFF 708 284 117 45 sdkNone dYy1t9mys0aRncWZtZhhIAAA 1 BeanFactoryAware <<interface>> False False dYy1t9mys0aRncWZtZhhIAAA False dYy1t9mys0aRncWZtZhhIAAA clMaroon $00B9FFFF 448 469 212 43 2T4+CMh0c0GydnKTjbqdvgAA 1 DefaultBeanFactoryPointcutAdvisor False False 2T4+CMh0c0GydnKTjbqdvgAA 2T4+CMh0c0GydnKTjbqdvgAA False 2T4+CMh0c0GydnKTjbqdvgAA clMaroon $00B9FFFF 553,176;554,127 7re+P7E/80+Mi/Qy0jqaMQAA rjnpxU2SREWE+6s9793/yQAA osb06wVMSU2drv7knSvsOAAA False 1.5707963267949 15 7re+P7E/80+Mi/Qy0jqaMQAA False 1.5707963267949 30 7re+P7E/80+Mi/Qy0jqaMQAA False -1.5707963267949 15 7re+P7E/80+Mi/Qy0jqaMQAA clMaroon $00B9FFFF 554,284;553,234 vxHQf0we3kKga3a0SqwSKwAA osb06wVMSU2drv7knSvsOAAA AUhFK1dVmUugxIeMnxWoqgAA False 1.5707963267949 15 vxHQf0we3kKga3a0SqwSKwAA False 1.5707963267949 30 vxHQf0we3kKga3a0SqwSKwAA False -1.5707963267949 15 vxHQf0we3kKga3a0SqwSKwAA clMaroon $00B9FFFF 553,372;554,326 g5Qn8Me+C0SGUyoyZ49ABwAA AUhFK1dVmUugxIeMnxWoqgAA /YXCPLTOIU2tsqn3pPUTsQAA False 1.5707963267949 15 g5Qn8Me+C0SGUyoyZ49ABwAA False 1.5707963267949 30 g5Qn8Me+C0SGUyoyZ49ABwAA False -1.5707963267949 15 g5Qn8Me+C0SGUyoyZ49ABwAA clMaroon $00B9FFFF 553,469;553,414 GakyYzu8+E2F1wjf32XLiQAA /YXCPLTOIU2tsqn3pPUTsQAA zVG5OS6ssEiI88f3/O941QAA False 1.5707963267949 15 GakyYzu8+E2F1wjf32XLiQAA False 1.5707963267949 30 GakyYzu8+E2F1wjf32XLiQAA False -1.5707963267949 15 GakyYzu8+E2F1wjf32XLiQAA clMaroon $00B9FFFF 520,284;436,231 0DUSgkskFkGdbWBFpPMqBgAA Z+66B2WK0kyAFFyMGxqTMgAA AUhFK1dVmUugxIeMnxWoqgAA False 1.5707963267949 15 0DUSgkskFkGdbWBFpPMqBgAA False 1.5707963267949 30 0DUSgkskFkGdbWBFpPMqBgAA False -1.5707963267949 15 0DUSgkskFkGdbWBFpPMqBgAA clMaroon $00B9FFFF 581,284;665,220 ulT4S3+dNUuS1/FQBFjiNgAA qp0C/3vaX0ydf0RNSS9hzwAA AUhFK1dVmUugxIeMnxWoqgAA False 1.5707963267949 15 ulT4S3+dNUuS1/FQBFjiNgAA False 1.5707963267949 30 ulT4S3+dNUuS1/FQBFjiNgAA False -1.5707963267949 15 ulT4S3+dNUuS1/FQBFjiNgAA clMaroon $00B9FFFF 604,372;712,328 b+mCrtV0PEW3H7tElvw4QAAA JYO6rcJN/0CrkDCnegacZgAA /YXCPLTOIU2tsqn3pPUTsQAA False 1.5707963267949 15 b+mCrtV0PEW3H7tElvw4QAAA False 1.5707963267949 30 b+mCrtV0PEW3H7tElvw4QAAA False -1.5707963267949 15 b+mCrtV0PEW3H7tElvw4QAAA RuntimeBeanReference bXKXzrBC40m5Z1l+vw7pdAAA 6XgDMeb2PEiRJ5uQrSpptwAA 5 clMaroon $00B9FFFF 514 76 139 59 sdkNone epekX8tZzkGe5pJSmcdO+QAA 1 BeanMetadataElement <<interface>> False False epekX8tZzkGe5pJSmcdO+QAA epekX8tZzkGe5pJSmcdO+QAA clMaroon $00B9FFFF 535 174 96 59 sdkNone GbashPT8JUy64HNoKqdOZwAA 1 BeanReference <<interface>> False False GbashPT8JUy64HNoKqdOZwAA GbashPT8JUy64HNoKqdOZwAA clMaroon $00B9FFFF 511 272 144 43 PrSUFkaHNEOlVw7YOeJ5xgAA 1 RuntimeBeanReference False False PrSUFkaHNEOlVw7YOeJ5xgAA PrSUFkaHNEOlVw7YOeJ5xgAA False PrSUFkaHNEOlVw7YOeJ5xgAA clMaroon $00B9FFFF 582,174;583,134 EznkezOXx0ezASsk62E7vAAA vPx4I1awKkibUFUyuKWREgAA AB4a9cAICkqRqECSDimTfgAA False 1.5707963267949 15 EznkezOXx0ezASsk62E7vAAA False 1.5707963267949 30 EznkezOXx0ezASsk62E7vAAA False -1.5707963267949 15 EznkezOXx0ezASsk62E7vAAA clMaroon $00B9FFFF 582,272;582,232 5bM2BYVN00KRjxYF2bL/igAA AB4a9cAICkqRqECSDimTfgAA w3keD8mK4E+EODBhF3WogwAA False 1.5707963267949 15 5bM2BYVN00KRjxYF2bL/igAA False 1.5707963267949 30 5bM2BYVN00KRjxYF2bL/igAA False -1.5707963267949 15 5bM2BYVN00KRjxYF2bL/igAA AspectJExpressionPointcut bXKXzrBC40m5Z1l+vw7pdAAA J88dm5aP2UmwHG4RfV4q2gAA 17 clMaroon $00B9FFFF 692 72 117 95 sdkNone 1hwoUynNkk+QtdPmza/onAAA 1 Pointcut <<interface>> False 1hwoUynNkk+QtdPmza/onAAA 1hwoUynNkk+QtdPmza/onAAA clMaroon $00B9FFFF 691 213 118 59 sdkNone pUwjhV+0RUi9/VdXlXlm0QAA 1 ExpressionPointcut <<interface>> False False pUwjhV+0RUi9/VdXlXlm0QAA pUwjhV+0RUi9/VdXlXlm0QAA clMaroon $00B9FFFF 667 318 167 43 DficNkvBwkef6gpHJT/9swAA 3 AbstractExpressionPointcut False False DficNkvBwkef6gpHJT/9swAA DficNkvBwkef6gpHJT/9swAA False DficNkvBwkef6gpHJT/9swAA clMaroon $00B9FFFF True 900 212 85 45 sdkNone tzRhqojrpU+yzYGfd3vnNwAA 1 Serializable <<interface>> False False tzRhqojrpU+yzYGfd3vnNwAA False tzRhqojrpU+yzYGfd3vnNwAA clMaroon $00B9FFFF 669 512 163 43 IyPZa70HO0C52Xr1uM0zdwAA 1 AspectJExpressionPointcut False False IyPZa70HO0C52Xr1uM0zdwAA IyPZa70HO0C52Xr1uM0zdwAA False IyPZa70HO0C52Xr1uM0zdwAA clMaroon $00B9FFFF 1064 318 138 82 sdkNone mOh2fcrDIEiIiSxLtlsPFQAA 1 ClassFilter <<interface>> False mOh2fcrDIEiIiSxLtlsPFQAA mOh2fcrDIEiIiSxLtlsPFQAA clMaroon $00B9FFFF 243 160 327 108 sdkNone X0Ax7s7QhUarbDftOfdOOQAA 1 MethodMatcher <<interface>> False X0Ax7s7QhUarbDftOfdOOQAA X0Ax7s7QhUarbDftOfdOOQAA clMaroon $00B9FFFF 216 318 381 59 sdkNone Tj59zRNDrk61S0MbtQEr7QAA 1 IntroductionAwareMethodMatcher <<interface>> False False Tj59zRNDrk61S0MbtQEr7QAA Tj59zRNDrk61S0MbtQEr7QAA clMaroon $00B9FFFF 908 318 117 45 sdkNone dYy1t9mys0aRncWZtZhhIAAA 1 BeanFactoryAware <<interface>> False False dYy1t9mys0aRncWZtZhhIAAA False dYy1t9mys0aRncWZtZhhIAAA clMaroon $00B9FFFF 749,213;750,166 ocfUmHrQ8020j6+IgDHxcQAA 6HH6vsJQ8UG0jr3yjS1RJQAA 8C6ofcC150uBDjWK7EX38wAA False 1.5707963267949 15 ocfUmHrQ8020j6+IgDHxcQAA False 1.5707963267949 30 ocfUmHrQ8020j6+IgDHxcQAA False -1.5707963267949 15 ocfUmHrQ8020j6+IgDHxcQAA clMaroon $00B9FFFF 750,318;749,271 q4CnHp9OE06QRhMKJASwYAAA 8C6ofcC150uBDjWK7EX38wAA v1ULtc7RvUuGYV5o8RFdfwAA False 1.5707963267949 15 q4CnHp9OE06QRhMKJASwYAAA False 1.5707963267949 30 q4CnHp9OE06QRhMKJASwYAAA False -1.5707963267949 15 q4CnHp9OE06QRhMKJASwYAAA clMaroon $00B9FFFF 750,512;750,360 677ISRS7AUaB1myzPTcvZAAA v1ULtc7RvUuGYV5o8RFdfwAA qXmE19Am50iuTsb+1tsybQAA False 1.5707963267949 15 677ISRS7AUaB1myzPTcvZAAA False 1.5707963267949 30 677ISRS7AUaB1myzPTcvZAAA False -1.5707963267949 15 677ISRS7AUaB1myzPTcvZAAA clMaroon $00B9FFFF 406,318;406,267 yeUteihQo06CgZu7xUkD0gAA 7PiDW0pNxECkbgT6IHpvWgAA Tk+WXEBhOEiad5+7Ls1FvwAA False 1.5707963267949 15 yeUteihQo06CgZu7xUkD0gAA False 1.5707963267949 30 yeUteihQo06CgZu7xUkD0gAA False -1.5707963267949 15 yeUteihQo06CgZu7xUkD0gAA clMaroon $00B9FFFF 711,512;460,376 5oaJ6gXzOk+eZNwPvj4d0gAA Tk+WXEBhOEiad5+7Ls1FvwAA qXmE19Am50iuTsb+1tsybQAA False 1.5707963267949 15 5oaJ6gXzOk+eZNwPvj4d0gAA False 1.5707963267949 30 5oaJ6gXzOk+eZNwPvj4d0gAA False -1.5707963267949 15 5oaJ6gXzOk+eZNwPvj4d0gAA clMaroon $00B9FFFF 788,318;902,256 R+k6qMvdM0+smp1z87SWaQAA zAxAhh/iD0iM9TJYGKTYEAAA v1ULtc7RvUuGYV5o8RFdfwAA False 1.5707963267949 15 R+k6qMvdM0+smp1z87SWaQAA False 1.5707963267949 30 R+k6qMvdM0+smp1z87SWaQAA False -1.5707963267949 15 R+k6qMvdM0+smp1z87SWaQAA clMaroon $00B9FFFF 796,512;1064,389 7cfR8Ah0sUOFP3dx2PwOTgAA WM2mzjL000iQPla91ziJJAAA qXmE19Am50iuTsb+1tsybQAA False 1.5707963267949 15 7cfR8Ah0sUOFP3dx2PwOTgAA False 1.5707963267949 30 7cfR8Ah0sUOFP3dx2PwOTgAA False -1.5707963267949 15 7cfR8Ah0sUOFP3dx2PwOTgAA clMaroon $00B9FFFF 774,512;941,362 en3cb3Zzvk26cqJOjRItqgAA QeO+OMhRVkWOviPozSbq2AAA qXmE19Am50iuTsb+1tsybQAA False 1.5707963267949 15 en3cb3Zzvk26cqJOjRItqgAA False 1.5707963267949 30 en3cb3Zzvk26cqJOjRItqgAA False -1.5707963267949 15 en3cb3Zzvk26cqJOjRItqgAA DeclareParentsAdvisor bXKXzrBC40m5Z1l+vw7pdAAA S1+sdBhbrUiWHU5nZSE1AwAA 7 clMaroon $00B9FFFF 377 75 85 45 sdkNone yLcRy0LQDEaYZHd42I4LjgAA 1 Advisor <<interface>> False False yLcRy0LQDEaYZHd42I4LjgAA False yLcRy0LQDEaYZHd42I4LjgAA clMaroon $00B9FFFF 604 75 104 59 sdkNone h2dDDot5sEW6fhaPxY36gAAA 1 IntroductionInfo <<interface>> False False h2dDDot5sEW6fhaPxY36gAAA h2dDDot5sEW6fhaPxY36gAAA clMaroon $00B9FFFF 463 180 124 72 sdkNone tSsXGPAIoE2qIM7pqisaDQAA 1 IntroductionAdvisor <<interface>> False False tSsXGPAIoE2qIM7pqisaDQAA tSsXGPAIoE2qIM7pqisaDQAA clMaroon $00B9FFFF 455 308 140 43 J0i/+gna4U+qilXe7D11qQAA 1 DeclareParentsAdvisor False False J0i/+gna4U+qilXe7D11qQAA J0i/+gna4U+qilXe7D11qQAA False J0i/+gna4U+qilXe7D11qQAA clMaroon $00B9FFFF 524,308;524,251 AvSWWCtZLUC86R9XLyppEQAA u5hSwRIXjUWtcq7zLqtYBQAA jFTFDbvfK06uMeO+KLUTiAAA False 1.5707963267949 15 AvSWWCtZLUC86R9XLyppEQAA False 1.5707963267949 30 AvSWWCtZLUC86R9XLyppEQAA False -1.5707963267949 15 AvSWWCtZLUC86R9XLyppEQAA clMaroon $00B9FFFF 493,180;439,119 K9EOuq4THEWfXNKeNEBZoQAA s6xi03EISU+7BISHhfSULgAA u5hSwRIXjUWtcq7zLqtYBQAA False 1.5707963267949 15 K9EOuq4THEWfXNKeNEBZoQAA False 1.5707963267949 30 K9EOuq4THEWfXNKeNEBZoQAA False -1.5707963267949 15 K9EOuq4THEWfXNKeNEBZoQAA clMaroon $00B9FFFF 565,180;621,133 4fIHGs+I70y6JL2eyJm2xwAA fvxBlcP5MUKZohkZbE6JMwAA u5hSwRIXjUWtcq7zLqtYBQAA False 1.5707963267949 15 4fIHGs+I70y6JL2eyJm2xwAA False 1.5707963267949 30 4fIHGs+I70y6JL2eyJm2xwAA False -1.5707963267949 15 4fIHGs+I70y6JL2eyJm2xwAA AspectJPointcutAdvisor bXKXzrBC40m5Z1l+vw7pdAAA rbAgHVAJ50yFTONvDoIpTQAA 7 clMaroon $00B9FFFF 552 87 85 45 sdkNone yLcRy0LQDEaYZHd42I4LjgAA 1 Advisor <<interface>> False False yLcRy0LQDEaYZHd42I4LjgAA False yLcRy0LQDEaYZHd42I4LjgAA clMaroon $00B9FFFF 544 188 100 45 sdkNone 5G2NEGmEq0SBJ9fguruyNAAA 1 PointcutAdvisor <<interface>> False False 5G2NEGmEq0SBJ9fguruyNAAA False 5G2NEGmEq0SBJ9fguruyNAAA clMaroon $00B9FFFF 593,188;594,131 7re+P7E/80+Mi/Qy0jqaMQAA Zc+srX7MUk+eeucepy19AQAA PY6OuaBpw0mpooXY9wMRfgAA False 1.5707963267949 15 7re+P7E/80+Mi/Qy0jqaMQAA False 1.5707963267949 30 7re+P7E/80+Mi/Qy0jqaMQAA False -1.5707963267949 15 7re+P7E/80+Mi/Qy0jqaMQAA clMaroon $00B9FFFF 620 288 145 43 HpNhXooeHEWEr+LfnAL4wQAA 1 AspectJPointcutAdvisor False False HpNhXooeHEWEr+LfnAL4wQAA HpNhXooeHEWEr+LfnAL4wQAA False HpNhXooeHEWEr+LfnAL4wQAA clMaroon $00B9FFFF 754 188 85 45 sdkNone 0jYMhT28b0SC56izQqnCfwAA 1 Ordered <<interface>> False False 0jYMhT28b0SC56izQqnCfwAA False 0jYMhT28b0SC56izQqnCfwAA clMaroon $00B9FFFF 671,288;615,232 xMRl8aoTNU2JsA77pxGDKQAA PY6OuaBpw0mpooXY9wMRfgAA OmppCFkNC0uioaB98RzfYgAA False 1.5707963267949 15 xMRl8aoTNU2JsA77pxGDKQAA False 1.5707963267949 30 xMRl8aoTNU2JsA77pxGDKQAA False -1.5707963267949 15 xMRl8aoTNU2JsA77pxGDKQAA clMaroon $00B9FFFF 714,288;773,232 8cZM72Q/OUy7axAHIoMybQAA CrULEh+nXU2WsbZ0erUlmQAA OmppCFkNC0uioaB98RzfYgAA False 1.5707963267949 15 8cZM72Q/OUy7axAHIoMybQAA False 1.5707963267949 30 8cZM72Q/OUy7axAHIoMybQAA False -1.5707963267949 15 8cZM72Q/OUy7axAHIoMybQAA MethodLocatingFactoryBean bXKXzrBC40m5Z1l+vw7pdAAA Y2qmqW0Yy0yuO6ryy5sXKAAA 5 clMaroon $00B9FFFF 312 108 98 85 sdkNone QZLzvgYKQkWTwWNxzMCADgAA 1 FactoryBean <<interface>> False False QZLzvgYKQkWTwWNxzMCADgAA QZLzvgYKQkWTwWNxzMCADgAA clMaroon $00B9FFFF 525 108 117 45 sdkNone dYy1t9mys0aRncWZtZhhIAAA 1 BeanFactoryAware <<interface>> False False dYy1t9mys0aRncWZtZhhIAAA False dYy1t9mys0aRncWZtZhhIAAA clMaroon $00B9FFFF 380 252 172 43 OF5pq0feZkKyhjMbu8bgMQAA 1 MethodLocatingFactoryBean False False OF5pq0feZkKyhjMbu8bgMQAA OF5pq0feZkKyhjMbu8bgMQAA False OF5pq0feZkKyhjMbu8bgMQAA clMaroon $00B9FFFF 447,252;396,192 Qi8rRhL9tkmFFQ3TqzvIYAAA EgptDAqxuU21wRVnWhUGWQAA fMdAW8uy2U2yz9r7aRsUkAAA False 1.5707963267949 15 Qi8rRhL9tkmFFQ3TqzvIYAAA False 1.5707963267949 30 Qi8rRhL9tkmFFQ3TqzvIYAAA False -1.5707963267949 15 Qi8rRhL9tkmFFQ3TqzvIYAAA clMaroon $00B9FFFF 482,252;565,152 TGMWIHP+AUuW/pmr93HXXAAA XfXAvCfw9UCDBcm4sgVR+wAA fMdAW8uy2U2yz9r7aRsUkAAA False 1.5707963267949 15 TGMWIHP+AUuW/pmr93HXXAAA False 1.5707963267949 30 TGMWIHP+AUuW/pmr93HXXAAA False -1.5707963267949 15 TGMWIHP+AUuW/pmr93HXXAAA SimpleBeanFactoryAwareAspectInstanceFactory bXKXzrBC40m5Z1l+vw7pdAAA etYRIvZgjkua31z1/LIAdAAA 7 clMaroon $00B9FFFF 564 76 85 45 sdkNone 0jYMhT28b0SC56izQqnCfwAA 1 Ordered <<interface>> False False 0jYMhT28b0SC56izQqnCfwAA False 0jYMhT28b0SC56izQqnCfwAA clMaroon $00B9FFFF 535 172 142 72 sdkNone gIZU4shciUa4G/mBARwJ4QAA 1 AspectInstanceFactory <<interface>> False False gIZU4shciUa4G/mBARwJ4QAA gIZU4shciUa4G/mBARwJ4QAA clMaroon $00B9FFFF 636 292 287 43 DaoZ2SAf6EigNWPlG+RzHAAA 1 SimpleBeanFactoryAwareAspectInstanceFactory False False DaoZ2SAf6EigNWPlG+RzHAAA DaoZ2SAf6EigNWPlG+RzHAAA False DaoZ2SAf6EigNWPlG+RzHAAA clMaroon $00B9FFFF 827 168 117 45 sdkNone dYy1t9mys0aRncWZtZhhIAAA 1 BeanFactoryAware <<interface>> False False dYy1t9mys0aRncWZtZhhIAAA False dYy1t9mys0aRncWZtZhhIAAA clMaroon $00B9FFFF 605,172;606,120 BrdBoR/DLUuhCy9RvIEt2gAA h16ueN7+zUWa5c3xhMrWTQAA f241uxCdpUOvymdS5pTn8wAA False 1.5707963267949 15 BrdBoR/DLUuhCy9RvIEt2gAA False 1.5707963267949 30 BrdBoR/DLUuhCy9RvIEt2gAA False -1.5707963267949 15 BrdBoR/DLUuhCy9RvIEt2gAA clMaroon $00B9FFFF 745,292;664,243 2VFSMlG/Hkmq0x/QAK/aOQAA f241uxCdpUOvymdS5pTn8wAA 3oCAP2JFSkyPJ6iPW+pYhgAA False 1.5707963267949 15 2VFSMlG/Hkmq0x/QAK/aOQAA False 1.5707963267949 30 2VFSMlG/Hkmq0x/QAK/aOQAA False -1.5707963267949 15 2VFSMlG/Hkmq0x/QAK/aOQAA clMaroon $00B9FFFF 797,292;866,212 +zZScyZQSEuSIV9nyMW9cwAA +meW5MfS+EGgHhWObIcg/gAA 3oCAP2JFSkyPJ6iPW+pYhgAA False 1.5707963267949 15 +zZScyZQSEuSIV9nyMW9cwAA False 1.5707963267949 30 +zZScyZQSEuSIV9nyMW9cwAA False -1.5707963267949 15 +zZScyZQSEuSIV9nyMW9cwAA AspectJAwareAdvisorAutoProxyCreator bXKXzrBC40m5Z1l+vw7pdAAA mTnzvB9q3U6xP5kGbhBybwAA 21 clMaroon $00B9FFFF 643 64 85 45 sdkNone tzRhqojrpU+yzYGfd3vnNwAA 1 Serializable <<interface>> False False tzRhqojrpU+yzYGfd3vnNwAA False tzRhqojrpU+yzYGfd3vnNwAA clMaroon $00B9FFFF 622 144 126 82 XUWeL1r7UkyWQCcV+Ja0vAAA 1 ProxyConfig False False XUWeL1r7UkyWQCcV+Ja0vAAA XUWeL1r7UkyWQCcV+Ja0vAAA False XUWeL1r7UkyWQCcV+Ja0vAAA clMaroon $00B9FFFF 614 268 144 43 en5Gsj1C7kyRiCz3rYwZ4gAA 1 ProxyProcessorSupport False False en5Gsj1C7kyRiCz3rYwZ4gAA en5Gsj1C7kyRiCz3rYwZ4gAA False en5Gsj1C7kyRiCz3rYwZ4gAA clMaroon $00B9FFFF 455 144 85 45 sdkNone 0jYMhT28b0SC56izQqnCfwAA 1 Ordered <<interface>> False False 0jYMhT28b0SC56izQqnCfwAA False 0jYMhT28b0SC56izQqnCfwAA clMaroon $00B9FFFF 260 144 142 45 sdkNone CoyJlNTf4k+s4pLon1Sa0AAA 1 BeanClassLoaderAware <<interface>> False False CoyJlNTf4k+s4pLon1Sa0AAA False CoyJlNTf4k+s4pLon1Sa0AAA clMaroon $00B9FFFF 832 144 141 45 sdkNone PY1WPNb48Ea/77cYyhGOyQAA 1 AopInfrastructureBean <<interface>> False False PY1WPNb48Ea/77cYyhGOyQAA False PY1WPNb48Ea/77cYyhGOyQAA clMaroon $00B9FFFF 605 363 162 43 L/xSc3PA4ECYSlC5uhuCpAAA 3 AbstractAutoProxyCreator False False L/xSc3PA4ECYSlC5uhuCpAAA L/xSc3PA4ECYSlC5uhuCpAAA False L/xSc3PA4ECYSlC5uhuCpAAA clMaroon $00B9FFFF 276 268 264 45 sdkNone KCpgJnVrZU+PE/CN5qjDdQAA 1 SmartInstantiationAwareBeanPostProcessor <<interface>> False False KCpgJnVrZU+PE/CN5qjDdQAA False KCpgJnVrZU+PE/CN5qjDdQAA clMaroon $00B9FFFF 844 268 117 45 sdkNone dYy1t9mys0aRncWZtZhhIAAA 1 BeanFactoryAware <<interface>> False False dYy1t9mys0aRncWZtZhhIAAA False dYy1t9mys0aRncWZtZhhIAAA clMaroon $00B9FFFF 584 453 205 43 nUV+tybCREGP3LhDlhlo3gAA 3 AbstractAdvisorAutoProxyCreator False False nUV+tybCREGP3LhDlhlo3gAA nUV+tybCREGP3LhDlhlo3gAA False nUV+tybCREGP3LhDlhlo3gAA clMaroon $00B9FFFF 568 543 237 43 XPUvXFMcAEi833Lrj7J0qwAA 1 AspectJAwareAdvisorAutoProxyCreator False False XPUvXFMcAEi833Lrj7J0qwAA XPUvXFMcAEi833Lrj7J0qwAA False XPUvXFMcAEi833Lrj7J0qwAA clMaroon $00B9FFFF 685,268;684,225 1jnLzSn/CkKgC8HW7I+2qQAA qJOK9VJl7ka+jXTTHFCICwAA cQM/XRvGeUOfB/5ZQ3MZfAAA False 1.5707963267949 15 1jnLzSn/CkKgC8HW7I+2qQAA False 1.5707963267949 30 1jnLzSn/CkKgC8HW7I+2qQAA False -1.5707963267949 15 1jnLzSn/CkKgC8HW7I+2qQAA clMaroon $00B9FFFF 624,268;393,188 dsXKFXDJm0uwyg0pI6DnZAAA ZY2pq5yRIUOBpC93tb5vjQAA cQM/XRvGeUOfB/5ZQ3MZfAAA False 1.5707963267949 15 dsXKFXDJm0uwyg0pI6DnZAAA False 1.5707963267949 30 dsXKFXDJm0uwyg0pI6DnZAAA False -1.5707963267949 15 dsXKFXDJm0uwyg0pI6DnZAAA clMaroon $00B9FFFF 653,268;531,188 vxpmp/Cjj0qA2Er/NsgaCAAA S6+h5uXg0EC+AKK2s5KfWQAA cQM/XRvGeUOfB/5ZQ3MZfAAA False 1.5707963267949 15 vxpmp/Cjj0qA2Er/NsgaCAAA False 1.5707963267949 30 vxpmp/Cjj0qA2Er/NsgaCAAA False -1.5707963267949 15 vxpmp/Cjj0qA2Er/NsgaCAAA clMaroon $00B9FFFF 722,268;863,188 QCcqWY/TtEG90tttVNpmewAA ZV+CgeYfRUKTwmeiAn+NEwAA cQM/XRvGeUOfB/5ZQ3MZfAAA False 1.5707963267949 15 QCcqWY/TtEG90tttVNpmewAA False 1.5707963267949 30 QCcqWY/TtEG90tttVNpmewAA False -1.5707963267949 15 QCcqWY/TtEG90tttVNpmewAA clMaroon $00B9FFFF 623,363;472,312 sA5Sl/vHWU+JBpTBIs2NRwAA Xl4xeRY9oESyrMqOeM7zsAAA kALE7GlAzUeSPpQK4uaFowAA False 1.5707963267949 15 sA5Sl/vHWU+JBpTBIs2NRwAA False 1.5707963267949 30 sA5Sl/vHWU+JBpTBIs2NRwAA False -1.5707963267949 15 sA5Sl/vHWU+JBpTBIs2NRwAA clMaroon $00B9FFFF 733,363;851,312 gUTALVtlCE+Wi5CqYnLwEQAA LRNBW1aoV0OBqWfnpebeAgAA kALE7GlAzUeSPpQK4uaFowAA False 1.5707963267949 15 gUTALVtlCE+Wi5CqYnLwEQAA False 1.5707963267949 30 gUTALVtlCE+Wi5CqYnLwEQAA False -1.5707963267949 15 gUTALVtlCE+Wi5CqYnLwEQAA clMaroon $00B9FFFF 685,363;685,310 pyd8t+UI4kmm/dzUsqxOMgAA cQM/XRvGeUOfB/5ZQ3MZfAAA kALE7GlAzUeSPpQK4uaFowAA False 1.5707963267949 15 pyd8t+UI4kmm/dzUsqxOMgAA False 1.5707963267949 30 pyd8t+UI4kmm/dzUsqxOMgAA False -1.5707963267949 15 pyd8t+UI4kmm/dzUsqxOMgAA clMaroon $00B9FFFF 686,453;685,405 gT24zo1710exZ37+FruRBwAA kALE7GlAzUeSPpQK4uaFowAA o7vmVCl64UidirCH7rBfzgAA False 1.5707963267949 15 gT24zo1710exZ37+FruRBwAA False 1.5707963267949 30 gT24zo1710exZ37+FruRBwAA False -1.5707963267949 15 gT24zo1710exZ37+FruRBwAA clMaroon $00B9FFFF 686,543;686,495 TWmeBuDQN0qHrukLsXsNowAA o7vmVCl64UidirCH7rBfzgAA 7zqBdCkIQ0+fFc+Ah4GUjQAA False 1.5707963267949 15 TWmeBuDQN0qHrukLsXsNowAA False 1.5707963267949 30 TWmeBuDQN0qHrukLsXsNowAA False -1.5707963267949 15 TWmeBuDQN0qHrukLsXsNowAA clMaroon $00B9FFFF 684,144;685,108 P5CGfLkbREuQdPJ+NmfKowAA iYqgzLrrLEmeM/oBdn+xeAAA qJOK9VJl7ka+jXTTHFCICwAA False 1.5707963267949 15 P5CGfLkbREuQdPJ+NmfKowAA False 1.5707963267949 30 P5CGfLkbREuQdPJ+NmfKowAA False -1.5707963267949 15 P5CGfLkbREuQdPJ+NmfKowAA BeanFactoryAdvisorRetrievalHelperAdapter bXKXzrBC40m5Z1l+vw7pdAAA cw3CV/zFCUq1zqo0+Lv9owAA 3 clMaroon $00B9FFFF 515 88 213 69 7+KDgrjnLkylNVon/A6KTAAA 1 BeanFactoryAdvisorRetrievalHelper False False 7+KDgrjnLkylNVon/A6KTAAA 7+KDgrjnLkylNVon/A6KTAAA False 7+KDgrjnLkylNVon/A6KTAAA clMaroon $00B9FFFF 492 220 259 56 gg/RHeNysEaiFC9FAv0eKQAA 1 BeanFactoryAdvisorRetrievalHelperAdapter False False gg/RHeNysEaiFC9FAv0eKQAA gg/RHeNysEaiFC9FAv0eKQAA False gg/RHeNysEaiFC9FAv0eKQAA clMaroon $00B9FFFF 621,220;621,156 KyZui8tKHUyyDgyyDWAEjgAA 5DpF070U1E2oUhfbiRxWGwAA h0QbZkR5OESOTzMcu27g0QAA False 1.5707963267949 15 KyZui8tKHUyyDgyyDWAEjgAA False 1.5707963267949 30 KyZui8tKHUyyDgyyDWAEjgAA False -1.5707963267949 15 KyZui8tKHUyyDgyyDWAEjgAA TargetSource bXKXzrBC40m5Z1l+vw7pdAAA BJXpkaOCrUWFIguXQSAHTwAA 37 clMaroon $00B9FFFF 610 72 113 59 sdkNone hCcTrMkcJkKgkOnIHuxZ5wAA 1 TargetClassAware <<interface>> False False hCcTrMkcJkKgkOnIHuxZ5wAA hCcTrMkcJkKgkOnIHuxZ5wAA clMaroon $00B9FFFF 587 168 158 98 sdkNone vLgAB4aJUUO/Sr+xbejMuwAA 1 TargetSource <<interface>> False False vLgAB4aJUUO/Sr+xbejMuwAA vLgAB4aJUUO/Sr+xbejMuwAA clMaroon $00B9FFFF 298 244 123 43 D3oPJbzrLkmXn1aTehmfwQAA 1 EmptyTargetSource False False D3oPJbzrLkmXn1aTehmfwQAA D3oPJbzrLkmXn1aTehmfwQAA False D3oPJbzrLkmXn1aTehmfwQAA clMaroon $00B9FFFF 275 324 168 43 1ybJOancZk2zhg7iRipgKwAA 1 HotSwappableTargetSource False False 1ybJOancZk2zhg7iRipgKwAA 1ybJOancZk2zhg7iRipgKwAA False 1ybJOancZk2zhg7iRipgKwAA clMaroon $00B9FFFF 1006 264 147 43 OtpcZS7oPU6X9ysoERFrkQAA 1 JndiObjectTargetSource False False OtpcZS7oPU6X9ysoERFrkQAA OtpcZS7oPU6X9ysoERFrkQAA False OtpcZS7oPU6X9ysoERFrkQAA clMaroon $00B9FFFF 1009 200 140 43 Ccws09T4R0+k+Rj2pTI7JAAA 1 SingletonTargetSource False False Ccws09T4R0+k+Rj2pTI7JAAA Ccws09T4R0+k+Rj2pTI7JAAA False Ccws09T4R0+k+Rj2pTI7JAAA clMaroon $00B9FFFF 474 324 204 43 SGy3za4RDkepWeHAztrUnwAA 3 AbstractRefreshableTargetSource False False SGy3za4RDkepWeHAztrUnwAA SGy3za4RDkepWeHAztrUnwAA False SGy3za4RDkepWeHAztrUnwAA clMaroon $00B9FFFF 463 416 226 43 s4cLHIhdok+LP++DSIeG+gAA 1 BeanFactoryRefreshableTargetSource False False s4cLHIhdok+LP++DSIeG+gAA s4cLHIhdok+LP++DSIeG+gAA False s4cLHIhdok+LP++DSIeG+gAA clMaroon $00B9FFFF 482 504 188 43 rY6DP70nRU204WFhs0OWxQAA 1 RefreshableScriptTargetSource False False rY6DP70nRU204WFhs0OWxQAA rY6DP70nRU204WFhs0OWxQAA False rY6DP70nRU204WFhs0OWxQAA clMaroon $00B9FFFF 716 324 210 43 puq3eYkGikCf3G7H9K3xpQAA 3 AbstractLazyCreationTargetSource False False puq3eYkGikCf3G7H9K3xpQAA puq3eYkGikCf3G7H9K3xpQAA False puq3eYkGikCf3G7H9K3xpQAA clMaroon $00B9FFFF 959 324 241 43 Fpu5myMFB0yQiI89+TTBhgAA 3 AbstractBeanFactoryBasedTargetSource False False Fpu5myMFB0yQiI89+TTBhgAA Fpu5myMFB0yQiI89+TTBhgAA False Fpu5myMFB0yQiI89+TTBhgAA clMaroon $00B9FFFF 776 424 153 43 KSS9OUVygkmHhK/4fXZ/PgAA 1 SimpleBeanTargetSource False False KSS9OUVygkmHhK/4fXZ/PgAA KSS9OUVygkmHhK/4fXZ/PgAA False KSS9OUVygkmHhK/4fXZ/PgAA clMaroon $00B9FFFF 1248 424 133 43 AxzkfAljoEam/q0Hs25d3wAA 1 LazyInitTargetSource False False AxzkfAljoEam/q0Hs25d3wAA AxzkfAljoEam/q0Hs25d3wAA False AxzkfAljoEam/q0Hs25d3wAA clMaroon $00B9FFFF 900,424;1031,366 xnx04TI8PUq+erkCqgRKcQAA VIzMmNZY10KFH0Jl6JWHCwAA euiS2se1Y02CQLdgtLJ+BgAA False 1.5707963267949 15 xnx04TI8PUq+erkCqgRKcQAA False 1.5707963267949 30 xnx04TI8PUq+erkCqgRKcQAA False -1.5707963267949 15 xnx04TI8PUq+erkCqgRKcQAA clMaroon $00B9FFFF 1265,424;1128,366 XdP1DMlxK0eKjXTwUHKN1wAA VIzMmNZY10KFH0Jl6JWHCwAA Bw8Vto7ts0CPIvb9IGm/8AAA False 1.5707963267949 15 XdP1DMlxK0eKjXTwUHKN1wAA False 1.5707963267949 30 XdP1DMlxK0eKjXTwUHKN1wAA False -1.5707963267949 15 XdP1DMlxK0eKjXTwUHKN1wAA clMaroon $00B9FFFF 966 424 227 43 MGNL2bQPvkuR0o6ds5q0yQAA 1 AbstractPrototypeBasedTargetSource False False MGNL2bQPvkuR0o6ds5q0yQAA MGNL2bQPvkuR0o6ds5q0yQAA False MGNL2bQPvkuR0o6ds5q0yQAA clMaroon $00B9FFFF 991 512 177 43 xqxgDzxx0UWwYR6K7lia7AAA 1 AbstractPoolingTargetSource False False xqxgDzxx0UWwYR6K7lia7AAA xqxgDzxx0UWwYR6K7lia7AAA False xqxgDzxx0UWwYR6K7lia7AAA clMaroon $00B9FFFF 780 512 156 43 SYi7fp5tY0eB+d68PcCfZAAA 1 ThreadLocalTargetSource False False SYi7fp5tY0eB+d68PcCfZAAA SYi7fp5tY0eB+d68PcCfZAAA False SYi7fp5tY0eB+d68PcCfZAAA clMaroon $00B9FFFF 1208 512 144 43 CGh3uibeDkWnYe2oZUEo2wAA 1 PrototypeTargetSource False False CGh3uibeDkWnYe2oZUEo2wAA CGh3uibeDkWnYe2oZUEo2wAA False CGh3uibeDkWnYe2oZUEo2wAA clMaroon $00B9FFFF 884 604 174 43 wNg/JLr240avGYH7XT9MfwAA 1 CommonsPool2TargetSource False False wNg/JLr240avGYH7XT9MfwAA wNg/JLr240avGYH7XT9MfwAA False wNg/JLr240avGYH7XT9MfwAA clMaroon $00B9FFFF 1096 604 167 43 sjE6G6n1JEGqzKwmXUha/gAA 1 CommonsPoolTargetSource False False sjE6G6n1JEGqzKwmXUha/gAA sjE6G6n1JEGqzKwmXUha/gAA False sjE6G6n1JEGqzKwmXUha/gAA clMaroon $00B9FFFF 995,604;1054,554 Vk1mlFFKx06rbDI0IgmrzwAA NgHyKugxUU+//kJyEN+tqgAA DeeWNmHUD0un2DwUOo5yTgAA False 1.5707963267949 15 Vk1mlFFKx06rbDI0IgmrzwAA False 1.5707963267949 30 Vk1mlFFKx06rbDI0IgmrzwAA False -1.5707963267949 15 Vk1mlFFKx06rbDI0IgmrzwAA clMaroon $00B9FFFF 1156,604;1102,554 vzsCj1EWr0uQJM9Om055FQAA NgHyKugxUU+//kJyEN+tqgAA 7xNIw2cej0Wk0G1g+YnbiAAA False 1.5707963267949 15 vzsCj1EWr0uQJM9Om055FQAA False 1.5707963267949 30 vzsCj1EWr0uQJM9Om055FQAA False -1.5707963267949 15 vzsCj1EWr0uQJM9Om055FQAA clMaroon $00B9FFFF 1079,512;1079,466 Xt+CE/rp3Ee1rDTAwgrAXwAA nEtqRm+2B0iohetC5U+nZwAA NgHyKugxUU+//kJyEN+tqgAA False 1.5707963267949 15 Xt+CE/rp3Ee1rDTAwgrAXwAA False 1.5707963267949 30 Xt+CE/rp3Ee1rDTAwgrAXwAA False -1.5707963267949 15 Xt+CE/rp3Ee1rDTAwgrAXwAA clMaroon $00B9FFFF 910,512;1026,466 2mkIDGxTw0uBNYq7aLOuTgAA nEtqRm+2B0iohetC5U+nZwAA HZnbqqq580Ct96BdMNeTCQAA False 1.5707963267949 15 2mkIDGxTw0uBNYq7aLOuTgAA False 1.5707963267949 30 2mkIDGxTw0uBNYq7aLOuTgAA False -1.5707963267949 15 2mkIDGxTw0uBNYq7aLOuTgAA clMaroon $00B9FFFF 1231,512;1127,466 IvvI6za9LEu4GLy0GySFDQAA nEtqRm+2B0iohetC5U+nZwAA GxSrL0v7gEKiYT97Lj5TswAA False 1.5707963267949 15 IvvI6za9LEu4GLy0GySFDQAA False 1.5707963267949 30 IvvI6za9LEu4GLy0GySFDQAA False -1.5707963267949 15 IvvI6za9LEu4GLy0GySFDQAA clMaroon $00B9FFFF 665,168;666,130 Hwq9ntx9HE6CHdxGdBu7mQAA uC4FWNbNd0GUM6ZMQmQzdAAA dLu1nc53T0+VYZUNiN2gbwAA False 1.5707963267949 15 Hwq9ntx9HE6CHdxGdBu7mQAA False 1.5707963267949 30 Hwq9ntx9HE6CHdxGdBu7mQAA False -1.5707963267949 15 Hwq9ntx9HE6CHdxGdBu7mQAA clMaroon $00B9FFFF 420,255;587,228 VORMFATkfECvmni/8qNvQwAA dLu1nc53T0+VYZUNiN2gbwAA Dvotki7Y/k2q1us0I0HPngAA False 1.5707963267949 15 VORMFATkfECvmni/8qNvQwAA False 1.5707963267949 30 VORMFATkfECvmni/8qNvQwAA False -1.5707963267949 15 VORMFATkfECvmni/8qNvQwAA clMaroon $00B9FFFF 408,324;587,249 FCek/JRDMkKjMzN+iVW9lQAA dLu1nc53T0+VYZUNiN2gbwAA 4xxNHdA72E+bbEPaTu/GtAAA False 1.5707963267949 15 FCek/JRDMkKjMzN+iVW9lQAA False 1.5707963267949 30 FCek/JRDMkKjMzN+iVW9lQAA False -1.5707963267949 15 FCek/JRDMkKjMzN+iVW9lQAA clMaroon $00B9FFFF 590,324;631,265 xlJRJD4/WkGYJwv9e10aNQAA dLu1nc53T0+VYZUNiN2gbwAA +QlkLy1cY0OzhbrNY0hEewAA False 1.5707963267949 15 xlJRJD4/WkGYJwv9e10aNQAA False 1.5707963267949 30 xlJRJD4/WkGYJwv9e10aNQAA False -1.5707963267949 15 xlJRJD4/WkGYJwv9e10aNQAA clMaroon $00B9FFFF 795,324;724,265 06WPE/b29UOkg0zKA4mA8wAA dLu1nc53T0+VYZUNiN2gbwAA H9+DgLVA702BHr4san3DCAAA False 1.5707963267949 15 06WPE/b29UOkg0zKA4mA8wAA False 1.5707963267949 30 06WPE/b29UOkg0zKA4mA8wAA False -1.5707963267949 15 06WPE/b29UOkg0zKA4mA8wAA clMaroon $00B9FFFF 1012,324;744,241 w5iLXKYksE6cBSekrScwWQAA dLu1nc53T0+VYZUNiN2gbwAA VIzMmNZY10KFH0Jl6JWHCwAA False 1.5707963267949 15 w5iLXKYksE6cBSekrScwWQAA False 1.5707963267949 30 w5iLXKYksE6cBSekrScwWQAA False -1.5707963267949 15 w5iLXKYksE6cBSekrScwWQAA clMaroon $00B9FFFF 1006,273;744,229 L82+J+TYF02XCkZl/BctqQAA dLu1nc53T0+VYZUNiN2gbwAA t8LldKSZYkChdtVhdJP/KgAA False 1.5707963267949 15 L82+J+TYF02XCkZl/BctqQAA False 1.5707963267949 30 L82+J+TYF02XCkZl/BctqQAA False -1.5707963267949 15 L82+J+TYF02XCkZl/BctqQAA clMaroon $00B9FFFF 1009,220;744,217 x6StjVqMwkCBOm4HTaI4wwAA dLu1nc53T0+VYZUNiN2gbwAA 9Ue6STOwXUKlmRmCudc3XgAA False 1.5707963267949 15 x6StjVqMwkCBOm4HTaI4wwAA False 1.5707963267949 30 x6StjVqMwkCBOm4HTaI4wwAA False -1.5707963267949 15 x6StjVqMwkCBOm4HTaI4wwAA clMaroon $00B9FFFF 575,416;575,366 IZJTRPshR0irDt2hemQFBAAA +QlkLy1cY0OzhbrNY0hEewAA aLFH1LIxvk+IPb01PwF/MwAA False 1.5707963267949 15 IZJTRPshR0irDt2hemQFBAAA False 1.5707963267949 30 IZJTRPshR0irDt2hemQFBAAA False -1.5707963267949 15 IZJTRPshR0irDt2hemQFBAAA clMaroon $00B9FFFF 575,504;575,458 JRJJR63XMkmFniuXZ+OjvAAA aLFH1LIxvk+IPb01PwF/MwAA ZhX2tePj7UCnu97p/Fu6yQAA False 1.5707963267949 15 JRJJR63XMkmFniuXZ+OjvAAA False 1.5707963267949 30 JRJJR63XMkmFniuXZ+OjvAAA False -1.5707963267949 15 JRJJR63XMkmFniuXZ+OjvAAA clMaroon $00B9FFFF 1079,424;1079,366 tcbkZ+9wPUC8eVyIaCNoKgAA VIzMmNZY10KFH0Jl6JWHCwAA nEtqRm+2B0iohetC5U+nZwAA False 1.5707963267949 15 tcbkZ+9wPUC8eVyIaCNoKgAA False 1.5707963267949 30 tcbkZ+9wPUC8eVyIaCNoKgAA False -1.5707963267949 15 tcbkZ+9wPUC8eVyIaCNoKgAA ExposeInvocationInterceptor bXKXzrBC40m5Z1l+vw7pdAAA uIhh87nIEUSzZejojqP6FQAA 11 clMaroon $00B9FFFF 606 144 85 45 sdkNone ZfPDK09vLUuoLWP9nfK1ywAA 1 Advice <<interface>> False False ZfPDK09vLUuoLWP9nfK1ywAA False ZfPDK09vLUuoLWP9nfK1ywAA clMaroon $00B9FFFF 605 232 86 45 sdkNone feA7liZolUWiuTR6E7Vq3wAA 1 Interceptor <<interface>> False False feA7liZolUWiuTR6E7Vq3wAA False feA7liZolUWiuTR6E7Vq3wAA clMaroon $00B9FFFF 550 328 196 59 sdkNone JIARuFQVBkeJaonMHipEvwAA 1 MethodInterceptor <<interface>> False False JIARuFQVBkeJaonMHipEvwAA JIARuFQVBkeJaonMHipEvwAA clMaroon $00B9FFFF 560 434 177 43 R0MlsKk/DEaR1km2nQkpvwAA 1 ExposeInvocationInterceptor False False R0MlsKk/DEaR1km2nQkpvwAA R0MlsKk/DEaR1km2nQkpvwAA False R0MlsKk/DEaR1km2nQkpvwAA clMaroon $00B9FFFF 648,434;647,386 hd6HSPrkoUuEZssyhgLXGgAA S4rR0w4OLEOoRKpQTX70jQAA vsGsukO8HEyKe8jUVlESOAAA False 1.5707963267949 15 hd6HSPrkoUuEZssyhgLXGgAA False 1.5707963267949 30 hd6HSPrkoUuEZssyhgLXGgAA False -1.5707963267949 15 hd6HSPrkoUuEZssyhgLXGgAA clMaroon $00B9FFFF 420 328 85 45 sdkNone tzRhqojrpU+yzYGfd3vnNwAA 1 Serializable <<interface>> False False tzRhqojrpU+yzYGfd3vnNwAA False tzRhqojrpU+yzYGfd3vnNwAA clMaroon $00B9FFFF 788 328 98 45 sdkNone XerUDeu42021KPWTM///cQAA 1 PriorityOrdered <<interface>> False False XerUDeu42021KPWTM///cQAA False XerUDeu42021KPWTM///cQAA clMaroon $00B9FFFF 647,328;647,276 Ed22AnIUFkiOHkiJdbpavQAA sBQie7Ig9kGSubLpnxIPDwAA S4rR0w4OLEOoRKpQTX70jQAA False 1.5707963267949 15 Ed22AnIUFkiOHkiJdbpavQAA False 1.5707963267949 30 Ed22AnIUFkiOHkiJdbpavQAA False -1.5707963267949 15 Ed22AnIUFkiOHkiJdbpavQAA clMaroon $00B9FFFF 647,232;648,188 aSE8WTwhIkCX4E7AMVzsFwAA SXSoH3H/Ek6a4QZqqosKtAAA sBQie7Ig9kGSubLpnxIPDwAA False 1.5707963267949 15 aSE8WTwhIkCX4E7AMVzsFwAA False 1.5707963267949 30 aSE8WTwhIkCX4E7AMVzsFwAA False -1.5707963267949 15 aSE8WTwhIkCX4E7AMVzsFwAA clMaroon $00B9FFFF 611,434;501,372 yfOTDPnNnEmH9YWaqcH+xAAA kTGGSI5WeUqFspoA6zzBBAAA vsGsukO8HEyKe8jUVlESOAAA False 1.5707963267949 15 yfOTDPnNnEmH9YWaqcH+xAAA False 1.5707963267949 30 yfOTDPnNnEmH9YWaqcH+xAAA False -1.5707963267949 15 yfOTDPnNnEmH9YWaqcH+xAAA clMaroon $00B9FFFF 686,434;797,372 8Jkpecm8kUS7sEiOHvhaKgAA nQy6UMLUBUCvuLs42vgxNgAA vsGsukO8HEyKe8jUVlESOAAA False 1.5707963267949 15 8Jkpecm8kUS7sEiOHvhaKgAA False 1.5707963267949 30 8Jkpecm8kUS7sEiOHvhaKgAA False -1.5707963267949 15 8Jkpecm8kUS7sEiOHvhaKgAA AopProxy bXKXzrBC40m5Z1l+vw7pdAAA ZZO7EZ7imEupo3NQY80CrQAA 9 clMaroon $00B9FFFF 548 60 187 72 sdkNone tZmqHND/t0qNPRKkUtKWSgAA 1 AopProxy <<interface>> False False tZmqHND/t0qNPRKkUtKWSgAA tZmqHND/t0qNPRKkUtKWSgAA clMaroon $00B9FFFF 468 192 134 43 uQeTp5Kp0EmsmV0+HS+rRgAA 1 JdkDynamicAopProxy False False uQeTp5Kp0EmsmV0+HS+rRgAA uQeTp5Kp0EmsmV0+HS+rRgAA False uQeTp5Kp0EmsmV0+HS+rRgAA clMaroon $00B9FFFF 208 60 273 59 sdkNone 3eLZg81wmEufzPDGdk4+9QAA 1 InvocationHandler <<interface>> False False 3eLZg81wmEufzPDGdk4+9QAA 3eLZg81wmEufzPDGdk4+9QAA clMaroon $00B9FFFF 502,192;388,118 fATzHhbLH0i0g4J2ZlyFPwAA XQKhTQ5ilEuJxa7O10SttQAA 9GEnF2jFp02MH7LDvk2LDgAA False 1.5707963267949 15 fATzHhbLH0i0g4J2ZlyFPwAA False 1.5707963267949 30 fATzHhbLH0i0g4J2ZlyFPwAA False -1.5707963267949 15 fATzHhbLH0i0g4J2ZlyFPwAA clMaroon $00B9FFFF 553,192;608,131 5dSRDuoeuECV6/7DIzNKuwAA wU4rDL54OUysqjrC7jPC6gAA 9GEnF2jFp02MH7LDvk2LDgAA False 1.5707963267949 15 5dSRDuoeuECV6/7DIzNKuwAA False 1.5707963267949 30 5dSRDuoeuECV6/7DIzNKuwAA False -1.5707963267949 15 5dSRDuoeuECV6/7DIzNKuwAA clMaroon $00B9FFFF 687 192 92 43 OKY0ZONQmUiVyJzH2Q6mnQAA 1 CglibAopProxy False False OKY0ZONQmUiVyJzH2Q6mnQAA OKY0ZONQmUiVyJzH2Q6mnQAA False OKY0ZONQmUiVyJzH2Q6mnQAA clMaroon $00B9FFFF 660 292 147 43 MSHVYKw+J0u4HSNvqe9z1wAA 1 ObjenesisCglibAopProxy False False MSHVYKw+J0u4HSNvqe9z1wAA MSHVYKw+J0u4HSNvqe9z1wAA False MSHVYKw+J0u4HSNvqe9z1wAA clMaroon $00B9FFFF 716,192;669,131 Jru4AuvnrE6AIzx0vK7XoQAA wU4rDL54OUysqjrC7jPC6gAA pkZUv4RNg0SZtwpXN1FVqwAA False 1.5707963267949 15 Jru4AuvnrE6AIzx0vK7XoQAA False 1.5707963267949 30 Jru4AuvnrE6AIzx0vK7XoQAA False -1.5707963267949 15 Jru4AuvnrE6AIzx0vK7XoQAA clMaroon $00B9FFFF 733,292;732,234 IdQWlzH/M0WizkLAbNXX+QAA pkZUv4RNg0SZtwpXN1FVqwAA YGaUf4ky7kW3bIs9058PEgAA False 1.5707963267949 15 IdQWlzH/M0WizkLAbNXX+QAA False 1.5707963267949 30 IdQWlzH/M0WizkLAbNXX+QAA False -1.5707963267949 15 IdQWlzH/M0WizkLAbNXX+QAA ScopedProxyBeanDefinitionDecorator bXKXzrBC40m5Z1l+vw7pdAAA cvtVWnLBMkWBGRI7YWEXtwAA 5 clMaroon $00B9FFFF 464 68 425 59 sdkNone 5iJAT5VgvE2JPsLuFjlyXQAA 1 BeanDefinitionDecorator <<interface>> False False 5iJAT5VgvE2JPsLuFjlyXQAA 5iJAT5VgvE2JPsLuFjlyXQAA clMaroon $00B9FFFF 368 172 223 43 gdEESwgbsUqHgqxmKDPCnQAA 1 ScopedProxyBeanDefinitionDecorator False False gdEESwgbsUqHgqxmKDPCnQAA gdEESwgbsUqHgqxmKDPCnQAA False gdEESwgbsUqHgqxmKDPCnQAA clMaroon $00B9FFFF 720 172 301 43 9vaEFaXMlU64OYH/alIeLgAA 3 AbstractInterceptorDrivenBeanDefinitionDecorator False False 9vaEFaXMlU64OYH/alIeLgAA 9vaEFaXMlU64OYH/alIeLgAA False 9vaEFaXMlU64OYH/alIeLgAA clMaroon $00B9FFFF 522,172;616,126 Jwl0U9qc8Eiq+CwcxaF7nwAA LYyGvUqzSUOZl4iJDArn5gAA cSYEUdS13Uic4x15c5MEcgAA False 1.5707963267949 15 Jwl0U9qc8Eiq+CwcxaF7nwAA False 1.5707963267949 30 Jwl0U9qc8Eiq+CwcxaF7nwAA False -1.5707963267949 15 Jwl0U9qc8Eiq+CwcxaF7nwAA clMaroon $00B9FFFF 828,172;735,126 Yyy1HO9aKEW4RUkyigOxsAAA LYyGvUqzSUOZl4iJDArn5gAA l0BFNRVdUUGHSVZiXArknAAA False 1.5707963267949 15 Yyy1HO9aKEW4RUkyigOxsAAA False 1.5707963267949 30 Yyy1HO9aKEW4RUkyigOxsAAA False -1.5707963267949 15 Yyy1HO9aKEW4RUkyigOxsAAA ScopedProxyFactoryBean bXKXzrBC40m5Z1l+vw7pdAAA hmzlC3hay0KBdZVBfbldYgAA 7 clMaroon $00B9FFFF 657 91 126 82 XUWeL1r7UkyWQCcV+Ja0vAAA 1 ProxyConfig False False XUWeL1r7UkyWQCcV+Ja0vAAA XUWeL1r7UkyWQCcV+Ja0vAAA False XUWeL1r7UkyWQCcV+Ja0vAAA clMaroon $00B9FFFF 643 236 155 43 DtMay9qrEEaF0biilG4ceAAA 1 ScopedProxyFactoryBean False False DtMay9qrEEaF0biilG4ceAAA DtMay9qrEEaF0biilG4ceAAA False DtMay9qrEEaF0biilG4ceAAA clMaroon $00B9FFFF 520 91 85 45 sdkNone QZLzvgYKQkWTwWNxzMCADgAA 1 FactoryBean <<interface>> False False QZLzvgYKQkWTwWNxzMCADgAA False QZLzvgYKQkWTwWNxzMCADgAA clMaroon $00B9FFFF 824 91 117 45 sdkNone dYy1t9mys0aRncWZtZhhIAAA 1 BeanFactoryAware <<interface>> False False dYy1t9mys0aRncWZtZhhIAAA False dYy1t9mys0aRncWZtZhhIAAA clMaroon $00B9FFFF 720,236;719,172 iZEWpVXXN0iv+gk6kqwIIwAA G5mwRsXJW0qbm4mrHFRagQAA EqfEI2E4wk6zojOT7qm+6wAA False 1.5707963267949 15 iZEWpVXXN0iv+gk6kqwIIwAA False 1.5707963267949 30 iZEWpVXXN0iv+gk6kqwIIwAA False -1.5707963267949 15 iZEWpVXXN0iv+gk6kqwIIwAA clMaroon $00B9FFFF 697,236;586,135 uavdBAZ3eUO+76THIJSmJgAA j4Zfjr4Z4UCKsG/+ZgldbQAA EqfEI2E4wk6zojOT7qm+6wAA False 1.5707963267949 15 uavdBAZ3eUO+76THIJSmJgAA False 1.5707963267949 30 uavdBAZ3eUO+76THIJSmJgAA False -1.5707963267949 15 uavdBAZ3eUO+76THIJSmJgAA clMaroon $00B9FFFF 744,236;857,135 9uP+Ej42zEOGBoGTiYfvtwAA rIXfria6L0yB9DFtXDZ5BgAA EqfEI2E4wk6zojOT7qm+6wAA False 1.5707963267949 15 9uP+Ej42zEOGBoGTiYfvtwAA False 1.5707963267949 30 9uP+Ej42zEOGBoGTiYfvtwAA False -1.5707963267949 15 9uP+Ej42zEOGBoGTiYfvtwAA DelegatingIntroductionInterceptor bXKXzrBC40m5Z1l+vw7pdAAA 2hpEkjg5XUCGvfEXqxxKYAAA 16 clMaroon $00B9FFFF 618 179 104 59 sdkNone h2dDDot5sEW6fhaPxY36gAAA 1 IntroductionInfo <<interface>> False False h2dDDot5sEW6fhaPxY36gAAA h2dDDot5sEW6fhaPxY36gAAA clMaroon $00B9FFFF 596 280 149 43 F0PzUS4rzki7/UmN8s9wHQAA 1 IntroductionInfoSupport False False F0PzUS4rzki7/UmN8s9wHQAA F0PzUS4rzki7/UmN8s9wHQAA False F0PzUS4rzki7/UmN8s9wHQAA clMaroon $00B9FFFF 790 376 208 43 0dXB32ZKX02tr2RkTx1i1wAA 1 DelegatingIntroductionInterceptor False False 0dXB32ZKX02tr2RkTx1i1wAA 0dXB32ZKX02tr2RkTx1i1wAA False 0dXB32ZKX02tr2RkTx1i1wAA clMaroon $00B9FFFF 821 284 147 45 sdkNone jInPH1Cl/0+WEpa+ok0c3gAA 1 IntroductionInterceptor <<interface>> False False jInPH1Cl/0+WEpa+ok0c3gAA False jInPH1Cl/0+WEpa+ok0c3gAA clMaroon $00B9FFFF 852 87 85 46 sdkNone feA7liZolUWiuTR6E7Vq3wAA 1 Interceptor <<interface>> False False feA7liZolUWiuTR6E7Vq3wAA feA7liZolUWiuTR6E7Vq3wAA clMaroon $00B9FFFF 796 176 196 59 sdkNone JIARuFQVBkeJaonMHipEvwAA 1 MethodInterceptor <<interface>> False False JIARuFQVBkeJaonMHipEvwAA JIARuFQVBkeJaonMHipEvwAA clMaroon $00B9FFFF 893,176;894,132 Ed22AnIUFkiOHkiJdbpavQAA qmbUmq/pQEqvPKdLPi8n6AAA +hQD3EhzjUmO9aZkaVPd1QAA False 1.5707963267949 15 Ed22AnIUFkiOHkiJdbpavQAA False 1.5707963267949 30 Ed22AnIUFkiOHkiJdbpavQAA False -1.5707963267949 15 Ed22AnIUFkiOHkiJdbpavQAA clMaroon $00B9FFFF 670,280;669,237 0tv8nH+3pk2Glct2LrYlOQAA p9X8HdxFH02DpefeT6JxAQAA Mwu900KS1Em5WEOLPPvbCgAA False 1.5707963267949 15 0tv8nH+3pk2Glct2LrYlOQAA False 1.5707963267949 30 0tv8nH+3pk2Glct2LrYlOQAA False -1.5707963267949 15 0tv8nH+3pk2Glct2LrYlOQAA clMaroon $00B9FFFF 844,376;719,322 TXj2hVm3ZEq+Wz1UEkvpjQAA Mwu900KS1Em5WEOLPPvbCgAA N/T6xIKZt0aSnxCAurjipwAA False 1.5707963267949 15 TXj2hVm3ZEq+Wz1UEkvpjQAA False 1.5707963267949 30 TXj2hVm3ZEq+Wz1UEkvpjQAA False -1.5707963267949 15 TXj2hVm3ZEq+Wz1UEkvpjQAA clMaroon $00B9FFFF 894,284;893,234 wlYD95CibkmgwRae5ukeEAAA +hQD3EhzjUmO9aZkaVPd1QAA ZVLiZpNt3k6rL8PXRUuH8QAA False 1.5707963267949 15 wlYD95CibkmgwRae5ukeEAAA False 1.5707963267949 30 wlYD95CibkmgwRae5ukeEAAA False -1.5707963267949 15 wlYD95CibkmgwRae5ukeEAAA clMaroon $00B9FFFF 893,376;894,328 ksjzp4oQE0aqtp0ZvromdQAA ZVLiZpNt3k6rL8PXRUuH8QAA N/T6xIKZt0aSnxCAurjipwAA False 1.5707963267949 15 ksjzp4oQE0aqtp0ZvromdQAA False 1.5707963267949 30 ksjzp4oQE0aqtp0ZvromdQAA False -1.5707963267949 15 ksjzp4oQE0aqtp0ZvromdQAA clMaroon $00B9FFFF 1032 280 189 59 sdkNone MymqEwcde0+NZ/x8ZU7gpgAA 1 DynamicIntroductionAdvice <<interface>> False False MymqEwcde0+NZ/x8ZU7gpgAA MymqEwcde0+NZ/x8ZU7gpgAA clMaroon $00B9FFFF 1084 20 85 46 sdkNone ZfPDK09vLUuoLWP9nfK1ywAA 1 Advice <<interface>> False False ZfPDK09vLUuoLWP9nfK1ywAA False ZfPDK09vLUuoLWP9nfK1ywAA clMaroon $00B9FFFF 936,97;1084,54 aSE8WTwhIkCX4E7AMVzsFwAA H/NOfJA/N0mCOGuXQkH2ZwAA qmbUmq/pQEqvPKdLPi8n6AAA False 1.5707963267949 15 aSE8WTwhIkCX4E7AMVzsFwAA False 1.5707963267949 30 aSE8WTwhIkCX4E7AMVzsFwAA False -1.5707963267949 15 aSE8WTwhIkCX4E7AMVzsFwAA clMaroon $00B9FFFF 1126,280;1126,65 +FmH9Q58NEOld1FURDj01AAA H/NOfJA/N0mCOGuXQkH2ZwAA XBrOhDgwREKyZZUDUPtcIwAA False 1.5707963267949 15 +FmH9Q58NEOld1FURDj01AAA False 1.5707963267949 30 +FmH9Q58NEOld1FURDj01AAA False -1.5707963267949 15 +FmH9Q58NEOld1FURDj01AAA clMaroon $00B9FFFF 949,376;1049,338 dVP8HcpZqEKobCJt66GsoAAA XBrOhDgwREKyZZUDUPtcIwAA N/T6xIKZt0aSnxCAurjipwAA False 1.5707963267949 15 dVP8HcpZqEKobCJt66GsoAAA False 1.5707963267949 30 dVP8HcpZqEKobCJt66GsoAAA False -1.5707963267949 15 dVP8HcpZqEKobCJt66GsoAAA Callback bXKXzrBC40m5Z1l+vw7pdAAA AxmpOiM+g0qQCY2SK4QmGgAA 15 clMaroon $00B9FFFF 596 72 86 45 sdkNone XBR9HD1BTEOGk7gdpBjQrQAA 1 Callback <<interface>> False False XBR9HD1BTEOGk7gdpBjQrQAA False XBR9HD1BTEOGk7gdpBjQrQAA clMaroon $00B9FFFF 880 216 85 46 sdkNone cazkTBa320Sv+Rb537AL2AAA 1 NoOp <<interface>> False False cazkTBa320Sv+Rb537AL2AAA cazkTBa320Sv+Rb537AL2AAA clMaroon $00B9FFFF 1004 216 85 59 sdkNone False O1Jgm4kbV02uduRgvIW6dAAA 1 Dispatcher <<interface>> False False O1Jgm4kbV02uduRgvIW6dAAA O1Jgm4kbV02uduRgvIW6dAAA clMaroon $00B9FFFF 328 216 273 59 sdkNone 3eLZg81wmEufzPDGdk4+9QAA 1 InvocationHandler <<interface>> False False 3eLZg81wmEufzPDGdk4+9QAA 3eLZg81wmEufzPDGdk4+9QAA clMaroon $00B9FFFF 652 216 196 63 sdkNone JIARuFQVBkeJaonMHipEvwAA 1 MethodInterceptor <<interface>> False False JIARuFQVBkeJaonMHipEvwAA JIARuFQVBkeJaonMHipEvwAA clMaroon $00B9FFFF 28 216 86 59 sdkNone IsebjsqPTUqKSY5EE32aTwAA 1 LazyLoader <<interface>> False False IsebjsqPTUqKSY5EE32aTwAA IsebjsqPTUqKSY5EE32aTwAA clMaroon $00B9FFFF 164 216 123 59 sdkNone 0MJjwwouNUSxji5pHIYupgAA 1 ProxyRefDispatcher <<interface>> False False 0MJjwwouNUSxji5pHIYupgAA 0MJjwwouNUSxji5pHIYupgAA clMaroon $00B9FFFF 1124 216 86 59 sdkNone uEr1XH8YYEmeu5zvEBjJ3QAA 1 FixedValue <<interface>> False False uEr1XH8YYEmeu5zvEBjJ3QAA uEr1XH8YYEmeu5zvEBjJ3QAA clMaroon $00B9FFFF 113,234;596,105 Z65jq4UGyUqwjdInNy55pwAA ntI9Wk78VkmNbPStawvqZQAA JWMJAdXzOEOHc5VYAJelHAAA False 1.5707963267949 15 Z65jq4UGyUqwjdInNy55pwAA False 1.5707963267949 30 Z65jq4UGyUqwjdInNy55pwAA False -1.5707963267949 15 Z65jq4UGyUqwjdInNy55pwAA clMaroon $00B9FFFF 286,223;596,109 gPGQtvsp+EumdnJDBnHCuwAA ntI9Wk78VkmNbPStawvqZQAA Fabe9O8Jk0uEjCTP6KBkTgAA False 1.5707963267949 15 gPGQtvsp+EumdnJDBnHCuwAA False 1.5707963267949 30 gPGQtvsp+EumdnJDBnHCuwAA False -1.5707963267949 15 gPGQtvsp+EumdnJDBnHCuwAA clMaroon $00B9FFFF 497,216;613,116 Odja1IhFtUOEs1OHukElcQAA ntI9Wk78VkmNbPStawvqZQAA oYs+CvW9Z0m0PTOOFTFHIgAA False 1.5707963267949 15 Odja1IhFtUOEs1OHukElcQAA False 1.5707963267949 30 Odja1IhFtUOEs1OHukElcQAA False -1.5707963267949 15 Odja1IhFtUOEs1OHukElcQAA clMaroon $00B9FFFF 727,216;654,116 V3YJ5XcLXUCdFm7omR9v8QAA ntI9Wk78VkmNbPStawvqZQAA l+9gui9iKUyXxXaJUJmngAAA False 1.5707963267949 15 V3YJ5XcLXUCdFm7omR9v8QAA False 1.5707963267949 30 V3YJ5XcLXUCdFm7omR9v8QAA False -1.5707963267949 15 V3YJ5XcLXUCdFm7omR9v8QAA clMaroon $00B9FFFF 880,217;681,116 eBQMSNh32EmpXwFJN9TfsgAA ntI9Wk78VkmNbPStawvqZQAA 3Q9XJu5/n06NJTUcxbKjAAAA False 1.5707963267949 15 eBQMSNh32EmpXwFJN9TfsgAA False 1.5707963267949 30 eBQMSNh32EmpXwFJN9TfsgAA False -1.5707963267949 15 eBQMSNh32EmpXwFJN9TfsgAA clMaroon $00B9FFFF 1004,229;681,110 Qs/F0P3ankC9u3wVRPwpzgAA ntI9Wk78VkmNbPStawvqZQAA loBy4y2omUS5IHGo0T34CQAA False 1.5707963267949 15 Qs/F0P3ankC9u3wVRPwpzgAA False 1.5707963267949 30 Qs/F0P3ankC9u3wVRPwpzgAA False -1.5707963267949 15 Qs/F0P3ankC9u3wVRPwpzgAA clMaroon $00B9FFFF 1124,233;681,106 vMEFQTMU9U28O6XecUxBSAAA ntI9Wk78VkmNbPStawvqZQAA EeXBO5QxRUuvHBW2YLoEOgAA False 1.5707963267949 15 vMEFQTMU9U28O6XecUxBSAAA False 1.5707963267949 30 vMEFQTMU9U28O6XecUxBSAAA False -1.5707963267949 15 vMEFQTMU9U28O6XecUxBSAAA CallbackFilter bXKXzrBC40m5Z1l+vw7pdAAA cTzqDG0EzESOl8RQLCAQFQAA 1 clMaroon $00B9FFFF 564 92 133 72 sdkNone yKz1WX74bEyqqTZHqRkfXgAA 1 CallbackFilter <<interface>> False False yKz1WX74bEyqqTZHqRkfXgAA yKz1WX74bEyqqTZHqRkfXgAA 165 Advisor bXKXzrBC40m5Z1l+vw7pdAAA 9 rjnpxU2SREWE+6s9793/yQAA KZ+KSXN9aE+Pe4c2Si3C9wAA tFeLWHD4IEyFENqfIT99kwAA s6xi03EISU+7BISHhfSULgAA uw90OEv7v0aQ84xpJHpIAgAA BvisJc+YC0iUkxi4wu5JiwAA Zc+srX7MUk+eeucepy19AQAA kmcNn+1wnEOFogJ0eZxV9gAA MQnXAySR7kaffPR9T+DmKwAA 1 MdzoyaasDUW3DOiZR3SjngAA 2 7re+P7E/80+Mi/Qy0jqaMQAA K9EOuq4THEWfXNKeNEBZoQAA 2 getAdvice yLcRy0LQDEaYZHd42I4LjgAA isPerInstance yLcRy0LQDEaYZHd42I4LjgAA PointcutAdvisor bXKXzrBC40m5Z1l+vw7pdAAA 6 osb06wVMSU2drv7knSvsOAAA ghaqezA+ckWu4ZnfKvSBRAAA PqiFeWyn8EOghJf66eN2twAA PY6OuaBpw0mpooXY9wMRfgAA Wysf2CdiUUu7gf5u/mCiwQAA 4io09m1Nc0+wnNp7AFMpdAAA 2 vxHQf0we3kKga3a0SqwSKwAA xMRl8aoTNU2JsA77pxGDKQAA 1 7re+P7E/80+Mi/Qy0jqaMQAA 1 getPointcut 5G2NEGmEq0SBJ9fguruyNAAA AbstractPointcutAdvisor True bXKXzrBC40m5Z1l+vw7pdAAA 4 AUhFK1dVmUugxIeMnxWoqgAA X48g4kMqFEyA6wx/RcdsbwAA S+0VSUVFake0YVxZKCoSiAAA 8fpScKqzdEiq35uyean9vQAA 3 vxHQf0we3kKga3a0SqwSKwAA 0DUSgkskFkGdbWBFpPMqBgAA ulT4S3+dNUuS1/FQBFjiNgAA 1 g5Qn8Me+C0SGUyoyZ49ABwAA Ordered bXKXzrBC40m5Z1l+vw7pdAAA 12 Z+66B2WK0kyAFFyMGxqTMgAA +aiDs/ZhvUagd/Clo5T4mQAA ypNdeWTlF0+WpWjAThV/wwAA CrULEh+nXU2WsbZ0erUlmQAA cYeGYsQBGUigY/sYa0p0vAAA 7DFXtMS5DkKwBfs+bYN3UAAA h16ueN7+zUWa5c3xhMrWTQAA Moms3SMKHkCpapRZyVRN/wAA oCSVSF4SjkOPNrmuEFJSxgAA S6+h5uXg0EC+AKK2s5KfWQAA f98oL0GQmEiIOKasJo8aAAAA iJzIQTSUU0CnU06u7T0v6gAA 3 0DUSgkskFkGdbWBFpPMqBgAA 8cZM72Q/OUy7axAHIoMybQAA vxpmp/Cjj0qA2Er/NsgaCAAA 1 BrdBoR/DLUuhCy9RvIEt2gAA 1 getOrder 0jYMhT28b0SC56izQqnCfwAA Serializable bXKXzrBC40m5Z1l+vw7pdAAA 12 qp0C/3vaX0ydf0RNSS9hzwAA bunWzH/aYUO9IahPJanktQAA C5NqbPYyb0GJNuowEf/nygAA zAxAhh/iD0iM9TJYGKTYEAAA SxEZk+TTxE+5JVvZ1ifTQgAA zoKrVE3+BU2PHsRhhYg7bgAA iYqgzLrrLEmeM/oBdn+xeAAA MjnSdsP9IECfoy8sup+wLQAA E0+jdijG3kSAj0FLxpNy/gAA kTGGSI5WeUqFspoA6zzBBAAA TULwnEkjXUibpZT6IwoJygAA ykQ3fWgxwEK3JKzkAi7OngAA 3 ulT4S3+dNUuS1/FQBFjiNgAA R+k6qMvdM0+smp1z87SWaQAA yfOTDPnNnEmH9YWaqcH+xAAA 1 P5CGfLkbREuQdPJ+NmfKowAA AbstractBeanFactoryPointcutAdvisor True bXKXzrBC40m5Z1l+vw7pdAAA 4 /YXCPLTOIU2tsqn3pPUTsQAA KbPsfHnEqkSGxQYmixzlUwAA sU5VF+pMYE+ol/yP0TMfzQAA IHXIEXt3O0e8NzFbbHy3LgAA 1 b+mCrtV0PEW3H7tElvw4QAAA 1 g5Qn8Me+C0SGUyoyZ49ABwAA 1 GakyYzu8+E2F1wjf32XLiQAA BeanFactoryAware bXKXzrBC40m5Z1l+vw7pdAAA 18 JYO6rcJN/0CrkDCnegacZgAA wY9T9sXVQkqqtIvxGrLNEQAA ILI9F2MaIUe4x/cts2RQHAAA QeO+OMhRVkWOviPozSbq2AAA 9f4553jDDkq+Eo4SI17Q6QAA Pv1r270f90a6icmLHm7yZAAA XfXAvCfw9UCDBcm4sgVR+wAA TzuCB092kkaUJlelEF836wAA RvfT8nOx/USttZAkg+EsiAAA +meW5MfS+EGgHhWObIcg/gAA ZYQ+t6vPDUKLXLEch/zokwAA 3vlwyS6pEUiBIxhcw9btqQAA LRNBW1aoV0OBqWfnpebeAgAA WZudHmjYfUGlYVHzYEaoSwAA rEneHVjH9ECLhPiCT6ZO6gAA rIXfria6L0yB9DFtXDZ5BgAA Pj1TYyTwI0yIUlkHurbLngAA 34Np8TGqdU+TlhQGoHiIRwAA 6 b+mCrtV0PEW3H7tElvw4QAAA en3cb3Zzvk26cqJOjRItqgAA TGMWIHP+AUuW/pmr93HXXAAA +zZScyZQSEuSIV9nyMW9cwAA gUTALVtlCE+Wi5CqYnLwEQAA 9uP+Ej42zEOGBoGTiYfvtwAA DefaultBeanFactoryPointcutAdvisor bXKXzrBC40m5Z1l+vw7pdAAA 4 zVG5OS6ssEiI88f3/O941QAA iPJzDPaoUEKjs2QGL09cKQAA UnAjbCL/YEukorHDaXbAOAAA Tnm7puq34Um2KCfKmZS/oAAA 1 GakyYzu8+E2F1wjf32XLiQAA bXKXzrBC40m5Z1l+vw7pdAAA 5G2NEGmEq0SBJ9fguruyNAAA yLcRy0LQDEaYZHd42I4LjgAA 8 beYNAaT4mkWR/FzHtI54XAAA PULg5JXYrk6kRE2Z5hoyFQAA H6bnIw7UrkmlWT5yZaqnqgAA xj02v0FpXEuiiZhNZCp9PwAA u84ipOpSQESjyVvzvAVHOQAA h8jvKVg9ZUe58IYbunFTPAAA OxNJEhu8lU65mzO+jwbRcAAA rZGB6obJZkCweIU4Uq/uhwAA bXKXzrBC40m5Z1l+vw7pdAAA JnHy9+h+mEifVnNmvaAOAAAA 5G2NEGmEq0SBJ9fguruyNAAA 4 fxU1BIE7vkuGDVX1V12D6wAA 39XNjsKP/UCT+Vo6lKk15AAA mRYX2mBLK0e76AhntUaolgAA T5jISz/MbUqsEY4TVQQXdgAA bXKXzrBC40m5Z1l+vw7pdAAA 7t0JMf8qFUuTKG9JVFon9wAA JnHy9+h+mEifVnNmvaAOAAAA 4 +IuBWHuBzEiSkHejnAJc5QAA 2zydpnT7yEKVk8xEW5NeHgAA lFPUpa8JGUOFse5ikcSo3wAA mtVnAT3z3Uydhr6vP1HnrAAA bXKXzrBC40m5Z1l+vw7pdAAA 2T4+CMh0c0GydnKTjbqdvgAA 7t0JMf8qFUuTKG9JVFon9wAA 4 ohMvWSfJN06ozHFtv+9UUAAA doOuSrXMb0SLszLdD8SNvAAA vA3CsWU4CE2Hr01By5rmVQAA 1PVRQmqERUaCLMaTFVg/mAAA bXKXzrBC40m5Z1l+vw7pdAAA JnHy9+h+mEifVnNmvaAOAAAA 0jYMhT28b0SC56izQqnCfwAA 4 jphbsZvcAU+wZx9vSN/7HgAA fzkcA1A9V0aooVI4XXwAxQAA PwO4aewWeE6npwK7mKhClQAA HhAj539Il0KGEgIVZN8gAAAA bXKXzrBC40m5Z1l+vw7pdAAA JnHy9+h+mEifVnNmvaAOAAAA tzRhqojrpU+yzYGfd3vnNwAA 4 7EF8HqTPp060wFGNlmb1sgAA ykC+eY7nM0mFb5JuMu+m2QAA CvQPBEYlEk+dbDfI73exNQAA vCVTWPQ8IU6tEbHDfEyj8gAA bXKXzrBC40m5Z1l+vw7pdAAA 7t0JMf8qFUuTKG9JVFon9wAA dYy1t9mys0aRncWZtZhhIAAA 4 WtF73OU2jEeKHkTc/9H8iwAA epyrTCPJhEOj2IMsKfDwsQAA UMP/TLvLgUCtbzg/oIWPDgAA 11CQSokLd0y8z0eDWJnrVQAA BeanMetadataElement bXKXzrBC40m5Z1l+vw7pdAAA 3 vPx4I1awKkibUFUyuKWREgAA TWQXiu9hWEa/qb9Skb9EqgAA VPM5XwfMzkuxWXhXd2v1vQAA 1 EznkezOXx0ezASsk62E7vAAA 1 getSource epekX8tZzkGe5pJSmcdO+QAA BeanReference bXKXzrBC40m5Z1l+vw7pdAAA 3 AB4a9cAICkqRqECSDimTfgAA 5RneznSFSEWlAtURtavB7QAA 4v1RfgADykS4RGTchGA2XQAA 1 5bM2BYVN00KRjxYF2bL/igAA 1 EznkezOXx0ezASsk62E7vAAA 1 getBeanName GbashPT8JUy64HNoKqdOZwAA RuntimeBeanReference bXKXzrBC40m5Z1l+vw7pdAAA 4 w3keD8mK4E+EODBhF3WogwAA X0MY33FQxkWqdYwJbN/VHgAA 3ygmrKIp6ESLPxk5qfHOiAAA 2GHPLCpomEyZ0kzZjkDifgAA 1 5bM2BYVN00KRjxYF2bL/igAA bXKXzrBC40m5Z1l+vw7pdAAA GbashPT8JUy64HNoKqdOZwAA epekX8tZzkGe5pJSmcdO+QAA 4 MhMNgHa+y0uFw1tPquvRXwAA 6gjW08J7Q0S+Eufs+RC1EgAA upfV/pOI0Ue23FOmVpsLLwAA hqS+7/TRrka4+OQxHAyQ/gAA bXKXzrBC40m5Z1l+vw7pdAAA PrSUFkaHNEOlVw7YOeJ5xgAA GbashPT8JUy64HNoKqdOZwAA 4 CDnGm8OFzU+HQKYNzErM9gAA pMV0sy3qWE6mZSj5M2TVyAAA xeWSRTYLJE6j3okO9qoJNQAA 085WE360c0abeOXw+U8TiwAA Pointcut bXKXzrBC40m5Z1l+vw7pdAAA 3 6HH6vsJQ8UG0jr3yjS1RJQAA RO34fUZboU21cmFtEu8HuwAA I0RDuJQHgE2O1yVM0rXD8QAA 1 ocfUmHrQ8020j6+IgDHxcQAA 2 getClassFilter 1hwoUynNkk+QtdPmza/onAAA getMethodMatcher 1hwoUynNkk+QtdPmza/onAAA 1 TRUE 1hwoUynNkk+QtdPmza/onAAA ExpressionPointcut bXKXzrBC40m5Z1l+vw7pdAAA 3 8C6ofcC150uBDjWK7EX38wAA IAOlP6FeKU+xJvaw/icZRQAA Qlk9MajYWkqzC1mgxSqykwAA 1 q4CnHp9OE06QRhMKJASwYAAA 1 ocfUmHrQ8020j6+IgDHxcQAA 1 getExpression pUwjhV+0RUi9/VdXlXlm0QAA AbstractExpressionPointcut True bXKXzrBC40m5Z1l+vw7pdAAA 4 v1ULtc7RvUuGYV5o8RFdfwAA u8FvT0g3XU26SsbDQ09OcAAA Fi05/WhPXUmu8M5oIBZn5QAA yLt9PRA1fk6LgwCco9Se0QAA 2 q4CnHp9OE06QRhMKJASwYAAA R+k6qMvdM0+smp1z87SWaQAA 1 677ISRS7AUaB1myzPTcvZAAA AspectJExpressionPointcut bXKXzrBC40m5Z1l+vw7pdAAA 4 qXmE19Am50iuTsb+1tsybQAA ncs3KoCtVUGpec8aVsYIEQAA ZltctLoAgkWBKUAKSWON4gAA 6bn7WrH+Uk6LqPa+2oa39AAA 3 5oaJ6gXzOk+eZNwPvj4d0gAA 7cfR8Ah0sUOFP3dx2PwOTgAA en3cb3Zzvk26cqJOjRItqgAA 1 677ISRS7AUaB1myzPTcvZAAA ClassFilter bXKXzrBC40m5Z1l+vw7pdAAA 3 WM2mzjL000iQPla91ziJJAAA P6sPifGSzEai+dpZHRoIrQAA as8LqvKOz0GUcB1dOpdJjAAA 1 7cfR8Ah0sUOFP3dx2PwOTgAA 1 matches mOh2fcrDIEiIiSxLtlsPFQAA 1 Class<?> clazz K2A4sMur30qySyY3JPuRjAAA 1 TRUE mOh2fcrDIEiIiSxLtlsPFQAA MethodMatcher bXKXzrBC40m5Z1l+vw7pdAAA 3 7PiDW0pNxECkbgT6IHpvWgAA Js/FMVjxyEqAI5Ul8BSW6gAA OUTFNzstS0adt0iGEV8eawAA 1 yeUteihQo06CgZu7xUkD0gAA 3 matches X0Ax7s7QhUarbDftOfdOOQAA 2 Method method 89RCDh0xkUqAEjTwRmr08wAA Class<?> targetClass 89RCDh0xkUqAEjTwRmr08wAA isRuntime X0Ax7s7QhUarbDftOfdOOQAA matches X0Ax7s7QhUarbDftOfdOOQAA 3 Method method IFOtWmX/REugs2ByFDERhQAA Class<?> targetClass IFOtWmX/REugs2ByFDERhQAA Object... args IFOtWmX/REugs2ByFDERhQAA 1 TRUE X0Ax7s7QhUarbDftOfdOOQAA IntroductionAwareMethodMatcher bXKXzrBC40m5Z1l+vw7pdAAA 3 Tk+WXEBhOEiad5+7Ls1FvwAA sW0X/UFNx0WAWAvEgOoU0AAA 71yS7RaNvUeElJvWKDk98wAA 1 5oaJ6gXzOk+eZNwPvj4d0gAA 1 yeUteihQo06CgZu7xUkD0gAA 1 matches Tj59zRNDrk61S0MbtQEr7QAA 3 Method method gxKYrxtCaEOlzhHbcgO1YgAA Class<?> targetClass gxKYrxtCaEOlzhHbcgO1YgAA boolean hasIntroductions gxKYrxtCaEOlzhHbcgO1YgAA bXKXzrBC40m5Z1l+vw7pdAAA pUwjhV+0RUi9/VdXlXlm0QAA 1hwoUynNkk+QtdPmza/onAAA 4 fwBMgHfwkUSXnU9X16oumQAA Nf6IluzT9kCqi9fhanp2PwAA ltEnPx7BF0i2PcYVj+RpYQAA 3sT0E6bEIEaXU6G6R/722gAA bXKXzrBC40m5Z1l+vw7pdAAA DficNkvBwkef6gpHJT/9swAA pUwjhV+0RUi9/VdXlXlm0QAA 4 yzqPydRt/E6qM2qr3dfpBAAA g7+NXPfqtUSmgh16M0TRyAAA h7J9eWX2dkSt6ww3Xk2z/QAA lUFuoYb9tUe3J3OhcB+TtgAA bXKXzrBC40m5Z1l+vw7pdAAA IyPZa70HO0C52Xr1uM0zdwAA DficNkvBwkef6gpHJT/9swAA 4 nFoefiY1GUyHuycIttX+awAA Vpj4ovwkCUO76kjqRxO/nwAA HKv3lRp34kusI9HzZcBerQAA lQXvXv6E1E6Jt/h0i0cPogAA bXKXzrBC40m5Z1l+vw7pdAAA Tj59zRNDrk61S0MbtQEr7QAA X0Ax7s7QhUarbDftOfdOOQAA 4 Zl2MfwQk50OaAyM4zFdI4wAA 1bPXZKPf80C2nNYUyt6lpwAA 43PidtvEJUCebOhvDTRcRwAA 84l5HDx0GUylwZKrmMm/WQAA bXKXzrBC40m5Z1l+vw7pdAAA IyPZa70HO0C52Xr1uM0zdwAA Tj59zRNDrk61S0MbtQEr7QAA 4 /DqjCDuqDU+aty+577YzkwAA 1V0wQDrL0EC5BwNO+2tC0AAA RYNtA7QFjkyNWNHsLG3LrQAA oxwwOivZnUqEP6VNrHBEOgAA bXKXzrBC40m5Z1l+vw7pdAAA DficNkvBwkef6gpHJT/9swAA tzRhqojrpU+yzYGfd3vnNwAA 4 +Glvc61N/kOOuGkLoM4NcAAA XDc5a0vYgEu3MsgpkFd8hQAA j/pyb+Co/UusdyFhLEvx9AAA ZhCKmS0wn0urr15a81v31QAA bXKXzrBC40m5Z1l+vw7pdAAA IyPZa70HO0C52Xr1uM0zdwAA mOh2fcrDIEiIiSxLtlsPFQAA 4 JOjLGex890+9r2VIY/4SiwAA W4YV4WkgX02gZEZRvcagvAAA 0qQ0fHETcEi03WMc+uangQAA NjS6iJnfmEig6xcVq+8jrgAA bXKXzrBC40m5Z1l+vw7pdAAA IyPZa70HO0C52Xr1uM0zdwAA dYy1t9mys0aRncWZtZhhIAAA 4 eRVov1XNKkCnK8IsWPp1+gAA fwpso2+9XU6PLxgbEwAYmgAA Ed+mQ96+0Em61FKe6VSTLAAA k3CooODbEkCeIbDkiOCmIAAA IntroductionInfo bXKXzrBC40m5Z1l+vw7pdAAA 6 fvxBlcP5MUKZohkZbE6JMwAA 1QmbOKWRu0G/FO6cucEdPQAA zDDok5ZbwE+haMGmU8vtVAAA p9X8HdxFH02DpefeT6JxAQAA uHOt51RN0EqG7ImQU+YrOwAA 2YKEK7m4oUylBFY1g4dZ5AAA 2 w6IeGE9OBUKOBNIhO8MHQQAA 0tv8nH+3pk2Glct2LrYlOQAA 1 4fIHGs+I70y6JL2eyJm2xwAA 1 getInterfaces h2dDDot5sEW6fhaPxY36gAAA IntroductionAdvisor bXKXzrBC40m5Z1l+vw7pdAAA 3 u5hSwRIXjUWtcq7zLqtYBQAA o7fvHIjQqkuZTcXBgH8cYgAA knUeJzG7sEypy3/RjxGM+wAA 2 MdzoyaasDUW3DOiZR3SjngAA w6IeGE9OBUKOBNIhO8MHQQAA 1 AvSWWCtZLUC86R9XLyppEQAA 2 K9EOuq4THEWfXNKeNEBZoQAA 4fIHGs+I70y6JL2eyJm2xwAA 2 getClassFilter tSsXGPAIoE2qIM7pqisaDQAA validateInterfaces tSsXGPAIoE2qIM7pqisaDQAA DeclareParentsAdvisor bXKXzrBC40m5Z1l+vw7pdAAA 4 jFTFDbvfK06uMeO+KLUTiAAA IWPK0o4HPU+NHerFFDKAoQAA VQtQP2w58E2lkSwk7vhmAQAA iNOQSDjn3kegvowuZIz0xgAA 1 AvSWWCtZLUC86R9XLyppEQAA bXKXzrBC40m5Z1l+vw7pdAAA tSsXGPAIoE2qIM7pqisaDQAA yLcRy0LQDEaYZHd42I4LjgAA bXKXzrBC40m5Z1l+vw7pdAAA tSsXGPAIoE2qIM7pqisaDQAA h2dDDot5sEW6fhaPxY36gAAA bXKXzrBC40m5Z1l+vw7pdAAA J0i/+gna4U+qilXe7D11qQAA tSsXGPAIoE2qIM7pqisaDQAA 4 T0NDWIl340i0xk7XaQbbUwAA uVOUTynr6EeNe7anFXKI2AAA Eezk5BrVHkuy7Le+7+ZUBAAA jjgismVaJk2hvag09VyPnQAA bXKXzrBC40m5Z1l+vw7pdAAA tSsXGPAIoE2qIM7pqisaDQAA yLcRy0LQDEaYZHd42I4LjgAA 4 +vTu/juUQUqUUNraJQEGOQAA rvkexrId0kCDMulkQj1kbwAA 8p0kvlmSpU+OlGXCnQYVlAAA Tm/OE984P0yMz0dcJsu1wwAA bXKXzrBC40m5Z1l+vw7pdAAA tSsXGPAIoE2qIM7pqisaDQAA h2dDDot5sEW6fhaPxY36gAAA 4 Qrv1MMrBcUKTpTUTsZHb/QAA RmERyjdnHkOOfWq7iH3EgQAA 5MxQpytXq0OMLr29w3+3/AAA DZ1szkrTzUyTK/ph0QVuOQAA AspectJPointcutAdvisor bXKXzrBC40m5Z1l+vw7pdAAA 4 OmppCFkNC0uioaB98RzfYgAA G5lF2t9NwUK2wlmh3iXQqgAA HkS3yx05FkGnUlBhXNU02gAA PLQg5pnNvk+ktxSJu9spNAAA 2 xMRl8aoTNU2JsA77pxGDKQAA 8cZM72Q/OUy7axAHIoMybQAA bXKXzrBC40m5Z1l+vw7pdAAA HpNhXooeHEWEr+LfnAL4wQAA 5G2NEGmEq0SBJ9fguruyNAAA 4 01pVva/7vkOg/eMTjqu24gAA hUfjdZO5YECYt0P4NTRveQAA MVpkYDS+9UqCGU1NcquwbQAA tlL7+i7YpE2C9EWITNrPZwAA bXKXzrBC40m5Z1l+vw7pdAAA HpNhXooeHEWEr+LfnAL4wQAA 0jYMhT28b0SC56izQqnCfwAA 4 pKpAUeOfaUq92cvFIeealgAA zCHtZSJAS0+eAbSF+ne/YQAA lyHOXzdd0E+YUmykR6aE5AAA LVII4RtnqEutFtXIKam6BAAA FactoryBean bXKXzrBC40m5Z1l+vw7pdAAA 6 EgptDAqxuU21wRVnWhUGWQAA raYzpmQnrEme07n61HTbuQAA WGCsk7Qlh0+y+1vTTbgL+QAA j4Zfjr4Z4UCKsG/+ZgldbQAA ULvYSVumqU6hOSZ2QmnaoQAA mvkoRRhFbkqwYC1fwiN+uAAA 2 Qi8rRhL9tkmFFQ3TqzvIYAAA uavdBAZ3eUO+76THIJSmJgAA 3 getObject QZLzvgYKQkWTwWNxzMCADgAA getObjectType QZLzvgYKQkWTwWNxzMCADgAA isSingleton QZLzvgYKQkWTwWNxzMCADgAA MethodLocatingFactoryBean bXKXzrBC40m5Z1l+vw7pdAAA 4 fMdAW8uy2U2yz9r7aRsUkAAA 2166488dDEyv30AEFqIqCwAA hxWQq0GcI0exyrSnbkMS+AAA tCQ/nuLgF0W7Iu12hRRqGwAA 2 Qi8rRhL9tkmFFQ3TqzvIYAAA TGMWIHP+AUuW/pmr93HXXAAA bXKXzrBC40m5Z1l+vw7pdAAA OF5pq0feZkKyhjMbu8bgMQAA QZLzvgYKQkWTwWNxzMCADgAA 4 cOA7M6u+AkeoPBztsXejfAAA 9FVc/N0tAkeWudEXrCaI/wAA nrIXiESdP0aclVGV8cuUDgAA swP0ZCBqSE6bFA0FYWkc5QAA bXKXzrBC40m5Z1l+vw7pdAAA OF5pq0feZkKyhjMbu8bgMQAA dYy1t9mys0aRncWZtZhhIAAA 4 vMqblEK8o0qs5LuSY/3dagAA 2Za/tpQ7W064i4lgFdkRYgAA aNyx5+kp8kmsEYdDHytZSwAA gwp1LKRcs0GeIfMV4Xx8ZAAA AspectInstanceFactory bXKXzrBC40m5Z1l+vw7pdAAA 3 f241uxCdpUOvymdS5pTn8wAA nlCSGREeLka7HuDxRc61ygAA R19oy8rELEehFRksj6/gfAAA 1 2VFSMlG/Hkmq0x/QAK/aOQAA 1 BrdBoR/DLUuhCy9RvIEt2gAA 2 getAspectInstance gIZU4shciUa4G/mBARwJ4QAA getAspectClassLoader gIZU4shciUa4G/mBARwJ4QAA SimpleBeanFactoryAwareAspectInstanceFactory bXKXzrBC40m5Z1l+vw7pdAAA 4 3oCAP2JFSkyPJ6iPW+pYhgAA zWRg+nf8dkORDq5tjntuAAAA FBHOtIk/BEuh3C+kXFc41wAA X8UZBoY+kk669T6wmP9u2gAA 2 2VFSMlG/Hkmq0x/QAK/aOQAA +zZScyZQSEuSIV9nyMW9cwAA bXKXzrBC40m5Z1l+vw7pdAAA gIZU4shciUa4G/mBARwJ4QAA 0jYMhT28b0SC56izQqnCfwAA 4 aBHWCHIP8ECzRTuKlI3TxgAA DuBqq5XVNU+QjKSmHwik/QAA CWB+DcmFhkOsjNYO1Pcg7QAA 2Jro1H+5g0iXfEXl4BgSeAAA bXKXzrBC40m5Z1l+vw7pdAAA DaoZ2SAf6EigNWPlG+RzHAAA gIZU4shciUa4G/mBARwJ4QAA 4 ZtWy1pjQUkqWn2jonBQQ7QAA /muPr67WXUmleH1NOCj47wAA Mjf7kUr71E6V1xZaitVZDAAA vfhrZdCbHU2WalLpvejdPwAA bXKXzrBC40m5Z1l+vw7pdAAA DaoZ2SAf6EigNWPlG+RzHAAA dYy1t9mys0aRncWZtZhhIAAA 4 iSLEQG6m9EG3HXog/eP+EgAA uqSpbIRCGUqW/xWXgPSwlwAA NANxTt4GuEW7ioEo26pI5QAA ppUnJ6VQhE6mYTWJk3RjNwAA ProxyConfig bXKXzrBC40m5Z1l+vw7pdAAA 8 qJOK9VJl7ka+jXTTHFCICwAA zYvf7UQjA02vMZSWvMqe/AAA Itmvt5n8KUazKYmpACWEgQAA Raj1R1SL5UGeLCXl0LcT5QAA G5mwRsXJW0qbm4mrHFRagQAA zSVMC8nzrUuWIXoL1bwo7QAA IIMwOelms0WwC2myTodD8QAA 8Cs+rb6RdUWkn0fVNCRKCwAA 1 1jnLzSn/CkKgC8HW7I+2qQAA 1 P5CGfLkbREuQdPJ+NmfKowAA 1 iZEWpVXXN0iv+gk6kqwIIwAA 3 setProxyTargetClass XUWeL1r7UkyWQCcV+Ja0vAAA isProxyTargetClass XUWeL1r7UkyWQCcV+Ja0vAAA setOptimize XUWeL1r7UkyWQCcV+Ja0vAAA ProxyProcessorSupport bXKXzrBC40m5Z1l+vw7pdAAA 4 cQM/XRvGeUOfB/5ZQ3MZfAAA kmkCvuwQikG4Cgb/A909OwAA VhnMR6rSskqBrFFFeKLl5wAA IOjaXswHe0SiPK72M/mbdQAA 4 1jnLzSn/CkKgC8HW7I+2qQAA dsXKFXDJm0uwyg0pI6DnZAAA vxpmp/Cjj0qA2Er/NsgaCAAA QCcqWY/TtEG90tttVNpmewAA 1 pyd8t+UI4kmm/dzUsqxOMgAA BeanClassLoaderAware bXKXzrBC40m5Z1l+vw7pdAAA 3 ZY2pq5yRIUOBpC93tb5vjQAA jym33x4lrEW6xwF5pwyf1AAA KqBq+dXRwUOOnnhcwfenbQAA 1 dsXKFXDJm0uwyg0pI6DnZAAA AopInfrastructureBean bXKXzrBC40m5Z1l+vw7pdAAA 3 ZV+CgeYfRUKTwmeiAn+NEwAA OO7Xh73ZWkea+hmJElkwBgAA 9H3+DfIdek+EN/FkD7tWZQAA 1 QCcqWY/TtEG90tttVNpmewAA AbstractAutoProxyCreator True bXKXzrBC40m5Z1l+vw7pdAAA 4 kALE7GlAzUeSPpQK4uaFowAA RbQpHyeCKUySLut+qZx/0wAA 3PF8RFZlmkWEaL2vDgZ81QAA LAkLybre60SsAAvAlFJpNQAA 2 sA5Sl/vHWU+JBpTBIs2NRwAA gUTALVtlCE+Wi5CqYnLwEQAA 1 pyd8t+UI4kmm/dzUsqxOMgAA 1 gT24zo1710exZ37+FruRBwAA SmartInstantiationAwareBeanPostProcessor bXKXzrBC40m5Z1l+vw7pdAAA 3 Xl4xeRY9oESyrMqOeM7zsAAA PzVc2UGpeEed5kE027SJOAAA +428Tu49WkGhh2zCuUt4MQAA 1 sA5Sl/vHWU+JBpTBIs2NRwAA AbstractAdvisorAutoProxyCreator True bXKXzrBC40m5Z1l+vw7pdAAA 4 o7vmVCl64UidirCH7rBfzgAA eDs04lVmFkOFyXJfcWo6EAAA bvviUQqeeEWvoclrPNhf4gAA LCI9fkj8HUKnMQQatUxuhgAA 1 gT24zo1710exZ37+FruRBwAA 1 TWmeBuDQN0qHrukLsXsNowAA AspectJAwareAdvisorAutoProxyCreator bXKXzrBC40m5Z1l+vw7pdAAA 4 7zqBdCkIQ0+fFc+Ah4GUjQAA RLCTDO0Pvki8oozL3LoYWQAA Vue8/I39HUC7L/U3k9cVOAAA giQdHWeVtEy1oo1Rb0VnGQAA 1 TWmeBuDQN0qHrukLsXsNowAA bXKXzrBC40m5Z1l+vw7pdAAA en5Gsj1C7kyRiCz3rYwZ4gAA XUWeL1r7UkyWQCcV+Ja0vAAA 4 HzaI79K3GEWF8HxaK51DEAAA eYbtKIrZiUCCOSkch3FnNQAA tE7dVHYJZ0uSdzGb64PlcwAA 3C0JSUJ3MEed6M51nG6gqwAA bXKXzrBC40m5Z1l+vw7pdAAA en5Gsj1C7kyRiCz3rYwZ4gAA CoyJlNTf4k+s4pLon1Sa0AAA 4 nnM8sVa+HkeT4NJdLoncIQAA hdhpwCh4oUagSqwGd37E6gAA BYbc8rCDlEuAFqoRnd0vhAAA ZyDlH9wnKECNzPC91zK+YQAA bXKXzrBC40m5Z1l+vw7pdAAA en5Gsj1C7kyRiCz3rYwZ4gAA 0jYMhT28b0SC56izQqnCfwAA 4 NWjOMZrbykmvw6i87SoxJgAA J7y26EkvmUaZg0iV2NMOqgAA lgTRYYTEokiwnaaA2Q7LFQAA Pzd3WuuHjkymYtPQVGRx1gAA bXKXzrBC40m5Z1l+vw7pdAAA en5Gsj1C7kyRiCz3rYwZ4gAA PY1WPNb48Ea/77cYyhGOyQAA 4 ZwZVOc8yuk2/+if4NG3OKQAA ABPfx/qFe0q0o0XLtfYeogAA zNdMvzhwiEKlzH4AnBN3lAAA nXBAeeWC9UG3pAys3mJcMAAA bXKXzrBC40m5Z1l+vw7pdAAA L/xSc3PA4ECYSlC5uhuCpAAA KCpgJnVrZU+PE/CN5qjDdQAA 4 +H/WH4rypEq2TMYNji1MsgAA W6SoBRYmOUK6P3lpo80b4gAA g9sRRhx3606gU1OcOgWzTAAA N1GzCjqtx0G7bp/0Dt/hTQAA bXKXzrBC40m5Z1l+vw7pdAAA L/xSc3PA4ECYSlC5uhuCpAAA dYy1t9mys0aRncWZtZhhIAAA 4 t77FjD2UikCwI4lD2a0kTwAA kujaW+ADT0ysD2H5RauhfQAA GPtjMb8ZSEuWW/NCsoPHBwAA XpUmDIG4TU6qrZa5G4G+gQAA bXKXzrBC40m5Z1l+vw7pdAAA L/xSc3PA4ECYSlC5uhuCpAAA en5Gsj1C7kyRiCz3rYwZ4gAA 4 USalMxcHx0GSp50JFB5H0gAA hh/3JS3plkqegOpVnM7nhwAA PLOyhuShr0WzqZSeIeWc3AAA u/UokpKsTU22ZR1+Gw2MyAAA bXKXzrBC40m5Z1l+vw7pdAAA nUV+tybCREGP3LhDlhlo3gAA L/xSc3PA4ECYSlC5uhuCpAAA 4 iXW26ho5tUazHOxBeREszgAA BagvPDGHakuw6lShyqSJ0AAA 2iVy3W3p+UWQvw4aMHyL6AAA B+QnoErvgUi8Br1s0yMS8wAA bXKXzrBC40m5Z1l+vw7pdAAA XPUvXFMcAEi833Lrj7J0qwAA nUV+tybCREGP3LhDlhlo3gAA 4 ukn+ELtHW0KRXSIrhxzp2wAA s+P4d5Q/2EySAC/E3LYdXAAA UubU0r/sVU28wg2C2jVkGwAA W6uzqboKv0aG3eDb/JvwHgAA bXKXzrBC40m5Z1l+vw7pdAAA XUWeL1r7UkyWQCcV+Ja0vAAA tzRhqojrpU+yzYGfd3vnNwAA 4 LShysmEj/EGx8NIrDeA3HQAA fUCzPbh6MEuS4borBMsPugAA NV+XIukT2UKPQ+H/9XIeggAA nV3ABVtfOEuOhXu70Od5kgAA BeanFactoryAdvisorRetrievalHelper bXKXzrBC40m5Z1l+vw7pdAAA 4 5DpF070U1E2oUhfbiRxWGwAA qpu2WRf02EGVwdG2LYTGXQAA i4ZlOe6AGEKHXaSE3t7U2wAA b97YG5MEjkOh1cCTT+91tAAA 1 KyZui8tKHUyyDgyyDWAEjgAA 2 findAdvisorBeans 7+KDgrjnLkylNVon/A6KTAAA isEligibleBean 7+KDgrjnLkylNVon/A6KTAAA BeanFactoryAdvisorRetrievalHelperAdapter vkPrivate bXKXzrBC40m5Z1l+vw7pdAAA 4 h0QbZkR5OESOTzMcu27g0QAA FdVhyv6J2Uq08poyRa+MrgAA OpbKHvdVn0WOVsm6ftvsGAAA DYKfDa8eFUCJNTUQ9s2dAAAA 1 KyZui8tKHUyyDgyyDWAEjgAA 1 isEligibleBean gg/RHeNysEaiFC9FAv0eKQAA bXKXzrBC40m5Z1l+vw7pdAAA gg/RHeNysEaiFC9FAv0eKQAA 7+KDgrjnLkylNVon/A6KTAAA 4 +vtsXxkbBkWDpl/tfM3LDgAA EgzusmeqKUqLcKmpL3ZrhQAA MYR05BsElkuyV2sSFxjn9gAA MV43N5RUAUi+ZHeFj+GCnAAA TargetClassAware bXKXzrBC40m5Z1l+vw7pdAAA 3 uC4FWNbNd0GUM6ZMQmQzdAAA Tg3qgFnVUki1PvSnLxsQ2QAA 6i/CkOP2xEK3ZT63PZP9sgAA 1 Hwq9ntx9HE6CHdxGdBu7mQAA 1 getTargetClass hCcTrMkcJkKgkOnIHuxZ5wAA TargetSource bXKXzrBC40m5Z1l+vw7pdAAA 3 dLu1nc53T0+VYZUNiN2gbwAA 9S5LCUAtBkahLi+Jco5CYgAA kZXzABMJnEKCWQKKv/s/8QAA 7 VORMFATkfECvmni/8qNvQwAA FCek/JRDMkKjMzN+iVW9lQAA xlJRJD4/WkGYJwv9e10aNQAA 06WPE/b29UOkg0zKA4mA8wAA w5iLXKYksE6cBSekrScwWQAA L82+J+TYF02XCkZl/BctqQAA x6StjVqMwkCBOm4HTaI4wwAA 1 Hwq9ntx9HE6CHdxGdBu7mQAA 4 getTargetClass vLgAB4aJUUO/Sr+xbejMuwAA isStatic vLgAB4aJUUO/Sr+xbejMuwAA getTarget vLgAB4aJUUO/Sr+xbejMuwAA releaseTarget vLgAB4aJUUO/Sr+xbejMuwAA 1 Object target RIzh5CRlOEOYZjhJDm/KAwAA EmptyTargetSource bXKXzrBC40m5Z1l+vw7pdAAA 4 Dvotki7Y/k2q1us0I0HPngAA 6r1uajAR80Km9aJ7ZIzRgQAA kLxqQL5KYEOtiXLIGRNiGgAA XGNC/5hC50C25oUPFLff4gAA 1 VORMFATkfECvmni/8qNvQwAA HotSwappableTargetSource bXKXzrBC40m5Z1l+vw7pdAAA 4 4xxNHdA72E+bbEPaTu/GtAAA VI8LT1AlJEiaiy5/EI/3ugAA gjpCTKb+c0i1RxtN2cBRUwAA LICgDDha20Kqhmohzc9NHgAA 1 FCek/JRDMkKjMzN+iVW9lQAA JndiObjectTargetSource bXKXzrBC40m5Z1l+vw7pdAAA 4 t8LldKSZYkChdtVhdJP/KgAA jWU0pNZclEevg88wAtNl+gAA GXNIbZSfyUGc0CqpG0CGIQAA evVGhiqX8UidGPb0xJIDwgAA 1 L82+J+TYF02XCkZl/BctqQAA SingletonTargetSource bXKXzrBC40m5Z1l+vw7pdAAA 4 9Ue6STOwXUKlmRmCudc3XgAA y/CLxUcYRk6UwfpCaSvYXQAA BdbFCP+1G0qhXVngPHipiQAA mBpkvusglkqiHTdiC49dvAAA 1 x6StjVqMwkCBOm4HTaI4wwAA AbstractRefreshableTargetSource True bXKXzrBC40m5Z1l+vw7pdAAA 4 +QlkLy1cY0OzhbrNY0hEewAA DeYZUU+N+EmDxLmhT1M50wAA kusgCBRP8EeMCgqKXl0lIgAA Tq+xNPPjkEGbOS6zEq8OqQAA 1 xlJRJD4/WkGYJwv9e10aNQAA 1 IZJTRPshR0irDt2hemQFBAAA BeanFactoryRefreshableTargetSource bXKXzrBC40m5Z1l+vw7pdAAA 4 aLFH1LIxvk+IPb01PwF/MwAA RZdaoJv9VU2Cd5cESzkx/gAA UqOEQ+vAJ02FRV77ViF0YgAA o1qptAlnfkOviRJCzp/nkgAA 1 IZJTRPshR0irDt2hemQFBAAA 1 JRJJR63XMkmFniuXZ+OjvAAA RefreshableScriptTargetSource bXKXzrBC40m5Z1l+vw7pdAAA 4 ZhX2tePj7UCnu97p/Fu6yQAA Easd1leq7km++fX6zS+wZgAA m4OKFXJ2SUqIWbSGfmxndgAA iLRctVtTsEqagYAHLOcr0AAA 1 JRJJR63XMkmFniuXZ+OjvAAA AbstractLazyCreationTargetSource True bXKXzrBC40m5Z1l+vw7pdAAA 4 H9+DgLVA702BHr4san3DCAAA ckRUJi7ui02r4rv6pKsYVAAA pwF3yKckWE22bpj9IZIPowAA /NirdtIB4kC+JtGkBt1A7wAA 1 06WPE/b29UOkg0zKA4mA8wAA AbstractBeanFactoryBasedTargetSource True bXKXzrBC40m5Z1l+vw7pdAAA 4 VIzMmNZY10KFH0Jl6JWHCwAA TGIQoRtaoUCGnQC1FrWxVgAA jtkju4X5OkqHAVMt2oq2nQAA /jOe1nCTlEChS1Dr33vtIAAA 1 w5iLXKYksE6cBSekrScwWQAA 3 xnx04TI8PUq+erkCqgRKcQAA XdP1DMlxK0eKjXTwUHKN1wAA tcbkZ+9wPUC8eVyIaCNoKgAA SimpleBeanTargetSource bXKXzrBC40m5Z1l+vw7pdAAA 4 euiS2se1Y02CQLdgtLJ+BgAA 9n2+miR2Tkeeo8WZdo8XngAA OFCtONJzhkywNeK3ONG5rAAA aNpFdqSOXkO2LTZ2KxCHVgAA 1 xnx04TI8PUq+erkCqgRKcQAA LazyInitTargetSource bXKXzrBC40m5Z1l+vw7pdAAA 4 Bw8Vto7ts0CPIvb9IGm/8AAA RYlfx+Ka1kSILCN844w4yQAA 42xskpRVQE6Z0TB0VQKIuQAA 6yM/wdB4BUqTkvByUdr/1gAA 1 XdP1DMlxK0eKjXTwUHKN1wAA bXKXzrBC40m5Z1l+vw7pdAAA KSS9OUVygkmHhK/4fXZ/PgAA Fpu5myMFB0yQiI89+TTBhgAA 4 ex0Fvjagc02r1l5oljoTvQAA 0uDnAYpuKEC4xxP5YP0W5AAA QkSjZshCq02UfdCpxwbXbgAA 1QxE5oRNjkW9VBdTN1yk4AAA bXKXzrBC40m5Z1l+vw7pdAAA AxzkfAljoEam/q0Hs25d3wAA Fpu5myMFB0yQiI89+TTBhgAA 4 jj39TQmT4kiS9yRoLAQogQAA owdRKDDgmUO+8z2BUJDadQAA sWXikP59uEqSSjSM0Ejf4AAA MZBBrLWpl0udBZVTAHI2NAAA AbstractPrototypeBasedTargetSource bXKXzrBC40m5Z1l+vw7pdAAA 4 nEtqRm+2B0iohetC5U+nZwAA CgvYaWRSYEOgltHVriynnwAA B9HHuVs0bUSp0U85PY16jwAA 0QGbfQPemEW/oYBTouz+BgAA 1 tcbkZ+9wPUC8eVyIaCNoKgAA 3 Xt+CE/rp3Ee1rDTAwgrAXwAA 2mkIDGxTw0uBNYq7aLOuTgAA IvvI6za9LEu4GLy0GySFDQAA AbstractPoolingTargetSource bXKXzrBC40m5Z1l+vw7pdAAA 4 NgHyKugxUU+//kJyEN+tqgAA TatDRLadZEujDl9Hs1hKmgAA DnpBkdb2q0akuzoyXDr3wAAA moeoWijQ1UuZL8fIS7nJWwAA 1 Xt+CE/rp3Ee1rDTAwgrAXwAA 2 Vk1mlFFKx06rbDI0IgmrzwAA vzsCj1EWr0uQJM9Om055FQAA ThreadLocalTargetSource bXKXzrBC40m5Z1l+vw7pdAAA 4 HZnbqqq580Ct96BdMNeTCQAA JB+xkGdcT02pjq/Ms8dPtgAA oWfYVghS/U6NZIvZ2GzRAwAA jho910XvXkGQbGYIrIDDzAAA 1 2mkIDGxTw0uBNYq7aLOuTgAA PrototypeTargetSource bXKXzrBC40m5Z1l+vw7pdAAA 4 GxSrL0v7gEKiYT97Lj5TswAA orQK/LOo5022pafoeE3jnQAA sk96rtEWokiENaJAd44lQAAA 3mhj9rRpME25P8Cl4XixywAA 1 IvvI6za9LEu4GLy0GySFDQAA CommonsPool2TargetSource bXKXzrBC40m5Z1l+vw7pdAAA 4 DeeWNmHUD0un2DwUOo5yTgAA OlD9/rdjTU+JSqD8i+AiRQAA odyA285bZECyMW3NfG3abQAA d9eZo7kUIEavroCTbGV4VgAA 1 Vk1mlFFKx06rbDI0IgmrzwAA CommonsPoolTargetSource bXKXzrBC40m5Z1l+vw7pdAAA 4 7xNIw2cej0Wk0G1g+YnbiAAA shGvbWuX2USQoisp7m6fAgAA keEDIeJ7L0Op7tQWnSOvrAAA mlON13WhhEOxRWJYV9yo9AAA 1 vzsCj1EWr0uQJM9Om055FQAA bXKXzrBC40m5Z1l+vw7pdAAA wNg/JLr240avGYH7XT9MfwAA xqxgDzxx0UWwYR6K7lia7AAA 4 faqCmgbPUUemfKL09zQZ9AAA HOltrLac0UKl0HUuehiNGgAA j4Y59rCJ1Ey12x8ZV37wegAA 69F0PY0cfEaNo5Ctz1L4FwAA bXKXzrBC40m5Z1l+vw7pdAAA sjE6G6n1JEGqzKwmXUha/gAA xqxgDzxx0UWwYR6K7lia7AAA 4 sgNp4jo+D0S8AlUHcy1E/gAA khAa6umUfESsDond6H6bxgAA c+dP/iNE+UKLz9VIB/+bTwAA mHWAqzSd80qu6MMVYa+0hQAA bXKXzrBC40m5Z1l+vw7pdAAA xqxgDzxx0UWwYR6K7lia7AAA MGNL2bQPvkuR0o6ds5q0yQAA 4 vzn6xoRs00aRrGLCBa3u1wAA KHaTWTNK20iSl2V9ggwANQAA Kf7JAgoBmkqa297dk+NfxQAA oA9Q1JwbyUWHzfWRW+QSSAAA bXKXzrBC40m5Z1l+vw7pdAAA SYi7fp5tY0eB+d68PcCfZAAA MGNL2bQPvkuR0o6ds5q0yQAA 4 G+MZq2zdNUOzAocM3ehlPwAA bGhfbUN3G0uCKRHlC9xC/AAA vtxAK4HDxk6hXfgxWkg8GwAA vM24lGeOxkmlUU1tu6vbNAAA bXKXzrBC40m5Z1l+vw7pdAAA CGh3uibeDkWnYe2oZUEo2wAA MGNL2bQPvkuR0o6ds5q0yQAA 4 l3YYt1WJA0eWvZ2K22dTmwAA WS4/UfM4Bkq5vowuL3uhRwAA CO6Sjf8/1EOJckvUr6iJPgAA e2g6a+Lr7kWaZA/58LPriAAA bXKXzrBC40m5Z1l+vw7pdAAA vLgAB4aJUUO/Sr+xbejMuwAA hCcTrMkcJkKgkOnIHuxZ5wAA 4 XkBo5DdrqEazz0eYGEHEngAA SM6zaCXcTECrj1zAGOE6DAAA oeYWFsGOW0eQBBoQyLOdhQAA UpVghKCBik6IevCfQ6OoywAA bXKXzrBC40m5Z1l+vw7pdAAA D3oPJbzrLkmXn1aTehmfwQAA vLgAB4aJUUO/Sr+xbejMuwAA 4 Biu2KdHWKkuBxSZA1T9FZAAA sHvTmrorNk+aR29WJfzUzwAA HEcineAIN0eM7NgVqwH6MAAA ObH3ivxP3E2eT0USgu/fYgAA bXKXzrBC40m5Z1l+vw7pdAAA 1ybJOancZk2zhg7iRipgKwAA vLgAB4aJUUO/Sr+xbejMuwAA 4 kmx5qAN/nU+Qud+Dsh4aGwAA R1rc/Sf6JUyIMh2OE6ogkwAA EUCRts6h8U+GzZCXiFKUiwAA mh6+4XPDMk6VgeoH90B/6wAA bXKXzrBC40m5Z1l+vw7pdAAA SGy3za4RDkepWeHAztrUnwAA vLgAB4aJUUO/Sr+xbejMuwAA 4 gdKVvI6eYUi158IG7HVXUwAA spfSoMUPokWvlNgEjf+mrQAA Tx8pdgN8r0K76SRWm9i8eAAA esH09UeyPEqDyn724otYtgAA bXKXzrBC40m5Z1l+vw7pdAAA puq3eYkGikCf3G7H9K3xpQAA vLgAB4aJUUO/Sr+xbejMuwAA 4 6x7HlO2FHU2zAzy7D0AmzgAA w67VRNBYZkyFeFIWfFYkXgAA kIwtWX39SkKuLetwih9/7AAA uW4dV8IGhEunMbmRZvmuywAA bXKXzrBC40m5Z1l+vw7pdAAA Fpu5myMFB0yQiI89+TTBhgAA vLgAB4aJUUO/Sr+xbejMuwAA 4 GY8CVagvREK8BtdbYFb/2wAA YwVldOY0CE2jPZb7gZh2TgAA ldD2xAwgjUOPw8ob3n/BPAAA reVEv4fXUkWRXJu7fHz6OQAA bXKXzrBC40m5Z1l+vw7pdAAA OtpcZS7oPU6X9ysoERFrkQAA vLgAB4aJUUO/Sr+xbejMuwAA 4 gdC34fy9SkCVip/NkPKtrgAA +KffAeonXUWzQHMQOzGJvwAA 1Ew5oy6f9kKA7rHYexH3OwAA WhlcYCAP/kC9lv3U84IFWwAA bXKXzrBC40m5Z1l+vw7pdAAA Ccws09T4R0+k+Rj2pTI7JAAA vLgAB4aJUUO/Sr+xbejMuwAA 4 yRrnyDHsDkukCYMLj1VXiAAA nHPMUFnVa0u3RygPuUWlSAAA LlHvgmnZO0ipgK+WJVAbNgAA foKS/espQkO0ZdOt4m3YKgAA bXKXzrBC40m5Z1l+vw7pdAAA s4cLHIhdok+LP++DSIeG+gAA SGy3za4RDkepWeHAztrUnwAA 4 lLqfhRFvwUKeC1ZNW0SZNgAA q7rc5nTrPUWVjI2SPN0mFAAA SLRNPb5yS0KTVm3rgtT/GgAA jkEvTtkGski1Rb9y/AKX3AAA bXKXzrBC40m5Z1l+vw7pdAAA rY6DP70nRU204WFhs0OWxQAA s4cLHIhdok+LP++DSIeG+gAA 4 QPDGUAUiakuBFo1NUFPLAgAA 1yLJMhIudkGhgp/+1fSmEQAA IN0s3ydDpkGQzQXE2+EoOQAA YOQhIVtrbkGqq9dtrxDPwgAA bXKXzrBC40m5Z1l+vw7pdAAA MGNL2bQPvkuR0o6ds5q0yQAA Fpu5myMFB0yQiI89+TTBhgAA 4 3xJIWNRkPEGN+RWcj+H0CQAA Nfmp8xwXxUmTGFM3j+N+6AAA o/vDlWA0+kaXOHGaBEv0zwAA MLSX6GIzvka2/Wux+8ZJfgAA Advice bXKXzrBC40m5Z1l+vw7pdAAA 6 SXSoH3H/Ek6a4QZqqosKtAAA 2aZWUXnxI0CdqeorRkU2sAAA NIizhMIpU0apZ5pX1it8vgAA H/NOfJA/N0mCOGuXQkH2ZwAA vA5EOZF+MU+3/usnDVWbxwAA Kx6QNTIaMU6SYxqken4p/wAA 2 aSE8WTwhIkCX4E7AMVzsFwAA +FmH9Q58NEOld1FURDj01AAA Interceptor bXKXzrBC40m5Z1l+vw7pdAAA 6 sBQie7Ig9kGSubLpnxIPDwAA kNRjg3gNBk2DLBYsyPYDvwAA bs0PUHGeiUK6DJgb3wS+EAAA qmbUmq/pQEqvPKdLPi8n6AAA wk+8HKEnT0ao9E/sDYvSlwAA NE8VPqEMskexkWHvd28RqAAA 1 aSE8WTwhIkCX4E7AMVzsFwAA 1 Ed22AnIUFkiOHkiJdbpavQAA MethodInterceptor bXKXzrBC40m5Z1l+vw7pdAAA 9 S4rR0w4OLEOoRKpQTX70jQAA MJPC9NnflUeYXevgCsSaPwAA uAn3ePYcfk28aEyb/+UwxwAA +hQD3EhzjUmO9aZkaVPd1QAA uyFdyQSibEm6NgPFg8KMLgAA OJba/7245U6mIy9v2+79JQAA l+9gui9iKUyXxXaJUJmngAAA juRmSfyw5UOPZJjdDMWrlAAA 2xKq7+mk/E+Cf88ZknbB3AAA 1 hd6HSPrkoUuEZssyhgLXGgAA 2 Ed22AnIUFkiOHkiJdbpavQAA V3YJ5XcLXUCdFm7omR9v8QAA 1 wlYD95CibkmgwRae5ukeEAAA 1 invoke JIARuFQVBkeJaonMHipEvwAA 1 MethodInvocation invocation QdMZjrgn+0Chc0fONz8M7wAA ExposeInvocationInterceptor bXKXzrBC40m5Z1l+vw7pdAAA 4 vsGsukO8HEyKe8jUVlESOAAA 6KDdpSrD8EawUsKKEbuk4AAA 8iBDKPe0ukK/plolCmPFdgAA /EPvjNzMTk62FZuMF5MGGAAA 3 hd6HSPrkoUuEZssyhgLXGgAA yfOTDPnNnEmH9YWaqcH+xAAA 8Jkpecm8kUS7sEiOHvhaKgAA bXKXzrBC40m5Z1l+vw7pdAAA R0MlsKk/DEaR1km2nQkpvwAA JIARuFQVBkeJaonMHipEvwAA 4 xTzCZ2C62EaTUHEPCSm23AAA xx+mqeEeY0OuKR9biAwtJAAA 3gCl8FU45kegiMQZQmALoQAA lB5Amqpxk0CGLm96MlNcpQAA PriorityOrdered bXKXzrBC40m5Z1l+vw7pdAAA 3 nQy6UMLUBUCvuLs42vgxNgAA aRP22EwKaEOz6lfnEA3puwAA XU0mclStrUmFd7iWlQCTRAAA 1 8Jkpecm8kUS7sEiOHvhaKgAA bXKXzrBC40m5Z1l+vw7pdAAA JIARuFQVBkeJaonMHipEvwAA feA7liZolUWiuTR6E7Vq3wAA 8 q6kN0EtxWketFBGHIKUSVQAA DNjUK9w9RUeJUHGL82VkkAAA D9+DYz9OaEa/jw63B22DeAAA beOJMuTitUycOOac+EUbOQAA 3GtJSwkA1Ueal8c/fEnbPwAA 76raWHAS+EibwonnuclQ8gAA WMgrceDFLkirHgp7ds/r1gAA hoJgL7D8TU+Wv5ey3EyHUAAA bXKXzrBC40m5Z1l+vw7pdAAA feA7liZolUWiuTR6E7Vq3wAA ZfPDK09vLUuoLWP9nfK1ywAA 8 LhXIWF6hVk+Huli+yCTJtQAA NZwltoWhm0myDm1uuVkd8gAA 1iRn0Yyf1EKxF0Lfo3iw4QAA OSdi2tj/40m7PyAiovoIgAAA CN0Vlrd3cEGWlF/BoJ2E9AAA //0QWISlk0aU03fEqJmlfAAA pzVjiD3CqkSKogYIO8YKowAA 8x+Kk/Rb0Uibfu3rpEMd7wAA bXKXzrBC40m5Z1l+vw7pdAAA R0MlsKk/DEaR1km2nQkpvwAA tzRhqojrpU+yzYGfd3vnNwAA 4 mcab9YabHkKNgyxwtKKEYAAA LzbNiIdah06Fu2iOoT8MLwAA MyjzDPfoqEeTKoGHyfTNzwAA HuiL0ORBEUqBGLFJTJ2vJwAA bXKXzrBC40m5Z1l+vw7pdAAA R0MlsKk/DEaR1km2nQkpvwAA XerUDeu42021KPWTM///cQAA 4 gzVhL8UubEq8WO6NqjxWmAAA NEnqbXBjkkaANUA8dHhe/QAA jmPIbCO/l0yUWOeONBfyFAAA LJtgQsOdMEOFql0mpWRRxQAA AopProxy bXKXzrBC40m5Z1l+vw7pdAAA 3 wU4rDL54OUysqjrC7jPC6gAA WntbiMHXQkOO8CdCbO1iuQAA eG0JWWFMVUG4wVCD1k04HAAA 2 5dSRDuoeuECV6/7DIzNKuwAA Jru4AuvnrE6AIzx0vK7XoQAA 2 getProxy tZmqHND/t0qNPRKkUtKWSgAA getProxy tZmqHND/t0qNPRKkUtKWSgAA 1 ClassLoader classLoader Gyq1DK7/nUiMo+LAk75SgwAA JdkDynamicAopProxy bXKXzrBC40m5Z1l+vw7pdAAA 4 9GEnF2jFp02MH7LDvk2LDgAA SLmYbsYyik625J9BBKZFZAAA WQq8YFqkQE+udObnCR6NMQAA VR1AZ6Qr7ku7o1DL/1CsSwAA 2 fATzHhbLH0i0g4J2ZlyFPwAA 5dSRDuoeuECV6/7DIzNKuwAA InvocationHandler bXKXzrBC40m5Z1l+vw7pdAAA 6 XQKhTQ5ilEuJxa7O10SttQAA tMBdAsZVoE2Nns2W0yfygwAA jn9AtDwDFk+E/yPuA34rVwAA oYs+CvW9Z0m0PTOOFTFHIgAA B9YoNW6Ya0uOd4uvKbiRJwAA mA9vj9yFj0a4TxcXGro15AAA 1 fATzHhbLH0i0g4J2ZlyFPwAA 1 Odja1IhFtUOEs1OHukElcQAA 1 invoke 3eLZg81wmEufzPDGdk4+9QAA 3 Object proxy TB0Dd36wG0+8871SaSvevAAA Method method TB0Dd36wG0+8871SaSvevAAA Object[] args TB0Dd36wG0+8871SaSvevAAA bXKXzrBC40m5Z1l+vw7pdAAA uQeTp5Kp0EmsmV0+HS+rRgAA 3eLZg81wmEufzPDGdk4+9QAA 4 KabyNAE0okyi4N63MIOpvQAA d+wqHarfSkmYb3o4YSLCJwAA w7ofPy1Lc0SKf7HAKeDO2QAA G6GHmTIMxEKNLvr+4ZA8lgAA bXKXzrBC40m5Z1l+vw7pdAAA uQeTp5Kp0EmsmV0+HS+rRgAA tZmqHND/t0qNPRKkUtKWSgAA 4 9rNFeqj9tEuNQUM0JON5WwAA qyd4XvA+Ak+hhj46XDmxUAAA obN+b7+Xnkaj11Q7XkHISAAA D8EBLUG09kCiTpiLSbaX2QAA CglibAopProxy bXKXzrBC40m5Z1l+vw7pdAAA 4 pkZUv4RNg0SZtwpXN1FVqwAA 8KeCOAP8qE+WqzY9d4cpdAAA qcbY4eM6dEaf0x8e86H4lQAA Xd1oJB7mUkuG+kORvrrTJwAA 1 Jru4AuvnrE6AIzx0vK7XoQAA 1 IdQWlzH/M0WizkLAbNXX+QAA ObjenesisCglibAopProxy bXKXzrBC40m5Z1l+vw7pdAAA 4 YGaUf4ky7kW3bIs9058PEgAA LHND4AzeoEClMe65W7oUrAAA Zi7rTsufGka7N8j9tIF2xQAA ur+f3gGGi0uc1ou8WhAl/gAA 1 IdQWlzH/M0WizkLAbNXX+QAA bXKXzrBC40m5Z1l+vw7pdAAA OKY0ZONQmUiVyJzH2Q6mnQAA tZmqHND/t0qNPRKkUtKWSgAA 4 pkiyAJd+0kexSHF+uQzTzQAA gSakM8GoOE+wUJN+nmGI8gAA GmQs3lmsjEKe03Bw5Z7/WgAA SAMNJYQ8ukqRRsH+o9xIbAAA bXKXzrBC40m5Z1l+vw7pdAAA MSHVYKw+J0u4HSNvqe9z1wAA OKY0ZONQmUiVyJzH2Q6mnQAA 4 dAtHfIo56kmk3s9XwcZUbQAA Rb8GWJajeUC7P0tk+m2GSAAA oNUBl22++0iOAg/D8PcUugAA kKz29uTPwUCUNond9Itj4QAA BeanDefinitionDecorator bXKXzrBC40m5Z1l+vw7pdAAA 3 LYyGvUqzSUOZl4iJDArn5gAA +ppWhQt4REaaTi6oCZ4xSQAA eKJImEQR2UiV42WF0JLGcAAA 2 Jwl0U9qc8Eiq+CwcxaF7nwAA Yyy1HO9aKEW4RUkyigOxsAAA 1 decorate 5iJAT5VgvE2JPsLuFjlyXQAA 3 Node node Gu7mcWCXqU62ySpzXZGufQAA BeanDefinitionHolder definition Gu7mcWCXqU62ySpzXZGufQAA ParserContext parserContext Gu7mcWCXqU62ySpzXZGufQAA ScopedProxyBeanDefinitionDecorator bXKXzrBC40m5Z1l+vw7pdAAA 4 cSYEUdS13Uic4x15c5MEcgAA 2YCUfX+9HEakX6ajcA+XnQAA 3Gkk7+Ew4E6OAcbBDvLTXQAA QdxKx6M1MUa3bfuT/xVjqQAA 1 Jwl0U9qc8Eiq+CwcxaF7nwAA AbstractInterceptorDrivenBeanDefinitionDecorator True bXKXzrBC40m5Z1l+vw7pdAAA 4 l0BFNRVdUUGHSVZiXArknAAA 3/5qRj87P0OuNlY+4C6E5QAA Fsjk7p/4mE2XUWjS1kcHQwAA 0hti3LbQS0CGgFw45CEalwAA 1 Yyy1HO9aKEW4RUkyigOxsAAA bXKXzrBC40m5Z1l+vw7pdAAA gdEESwgbsUqHgqxmKDPCnQAA 5iJAT5VgvE2JPsLuFjlyXQAA 4 vnxU/AyR+UqRzUcM1PSWigAA 1tFsD2iWU0mSrAgwFDkgyAAA koRC1yKXKECZYMFnH5nsNQAA 7Jgq3yh18EiX3cj2hsQh+wAA bXKXzrBC40m5Z1l+vw7pdAAA 9vaEFaXMlU64OYH/alIeLgAA 5iJAT5VgvE2JPsLuFjlyXQAA 4 ghd+oUgbUE+B2KzBWmug5QAA 4UmsoGe3HUO8J7Q9VEe8HgAA 9opo/3ifKEqvr84oLcBGpAAA 8pdFS7P5ZUqheecfYc0a0AAA ScopedProxyFactoryBean bXKXzrBC40m5Z1l+vw7pdAAA 4 EqfEI2E4wk6zojOT7qm+6wAA TZnS42aQ+0qSvD4BFwFYhAAA z1vzwWXvh0CtmWGDxFNGDQAA KCfXYIY0k0yRSg1Xup5VDwAA 2 uavdBAZ3eUO+76THIJSmJgAA 9uP+Ej42zEOGBoGTiYfvtwAA 1 iZEWpVXXN0iv+gk6kqwIIwAA bXKXzrBC40m5Z1l+vw7pdAAA DtMay9qrEEaF0biilG4ceAAA XUWeL1r7UkyWQCcV+Ja0vAAA 4 s41+9S18AEWtHFxKl95lDwAA D4u0BFb/VkaSx2o7yBvkhgAA QgjgnnJJeEWpYZZFpljMfgAA I2kyKW6nikCI3Nx4f9jZxAAA bXKXzrBC40m5Z1l+vw7pdAAA DtMay9qrEEaF0biilG4ceAAA QZLzvgYKQkWTwWNxzMCADgAA 4 QKX4s0O30EqVZduZu9FORwAA TxWfPj3h7UauakVARiBbLQAA iXYXaZYEckSPqJ5qSkLOQAAA SdCRHCM7UkqdFYpzQyKJ5QAA bXKXzrBC40m5Z1l+vw7pdAAA DtMay9qrEEaF0biilG4ceAAA dYy1t9mys0aRncWZtZhhIAAA 4 fpCV8jzXgESVZORVEl+h4gAA 8b6tdkfhG0q17LdHtThCBQAA e8go10YTr0a2Xt9ean2s1gAA UBjr9EQ0PEiONh6Qzt0R9AAA IntroductionInfoSupport bXKXzrBC40m5Z1l+vw7pdAAA 4 Mwu900KS1Em5WEOLPPvbCgAA +ECUgTwLBkO9VeifEty42gAA 5oRQTq59DEC9i6iJbpA9XgAA CEgYjWg5oUSkaXKfIGS8jQAA 1 0tv8nH+3pk2Glct2LrYlOQAA 1 TXj2hVm3ZEq+Wz1UEkvpjQAA DelegatingIntroductionInterceptor bXKXzrBC40m5Z1l+vw7pdAAA 4 N/T6xIKZt0aSnxCAurjipwAA vfKSLDExJUqO3+8WivymSwAA 9xZGcKixg0yqolntITcMwgAA zrM0FyRTA0SwkJztwUAIvAAA 2 ksjzp4oQE0aqtp0ZvromdQAA dVP8HcpZqEKobCJt66GsoAAA 1 TXj2hVm3ZEq+Wz1UEkvpjQAA IntroductionInterceptor bXKXzrBC40m5Z1l+vw7pdAAA 3 ZVLiZpNt3k6rL8PXRUuH8QAA JMUJz3TNPU2tE2oAFFmAjQAA VT3adRnN5UCt7OcjeLHyDwAA 1 ksjzp4oQE0aqtp0ZvromdQAA 1 wlYD95CibkmgwRae5ukeEAAA bXKXzrBC40m5Z1l+vw7pdAAA F0PzUS4rzki7/UmN8s9wHQAA h2dDDot5sEW6fhaPxY36gAAA 4 kLgJ5CEQUUmNzvOPgkjWTQAA mYTQPbIyh02jaINNUyc17gAA nSvgwySKqESH9OBbVL8WnwAA zTHAzqTfOkWlpygkh87MPQAA bXKXzrBC40m5Z1l+vw7pdAAA 0dXB32ZKX02tr2RkTx1i1wAA F0PzUS4rzki7/UmN8s9wHQAA 4 pZlBc2kDlU6uBWJQOwuavgAA cxt6kF0XhEqIxqE0z1BaHAAA kC3WhcPTLUOOkNIZFXx1JgAA Xqwmo425pUmj8y/7YOkHkQAA bXKXzrBC40m5Z1l+vw7pdAAA jInPH1Cl/0+WEpa+ok0c3gAA JIARuFQVBkeJaonMHipEvwAA 4 x3fpkeTqH0iiDdZu/6DggAAA X+a4uV45DkemtBy4gRsxjAAA OY+KwR3i3k6uGEdui24HbQAA wgmBbWZs0ECodgDxF/E2VgAA bXKXzrBC40m5Z1l+vw7pdAAA 0dXB32ZKX02tr2RkTx1i1wAA jInPH1Cl/0+WEpa+ok0c3gAA 4 qVWlxe8kkkyUJW+ZyXHnsAAA Wl/NDxdP5kKTCekfF4gLpwAA YSWNNhKsh0eLxUQwmGn+SgAA hW4HnwRavUCzgpjciIASewAA DynamicIntroductionAdvice bXKXzrBC40m5Z1l+vw7pdAAA 3 XBrOhDgwREKyZZUDUPtcIwAA OAqGAgaO50+gRF4b3Gz3twAA Mw7sqoQOqki9zGRDFeumUgAA 1 dVP8HcpZqEKobCJt66GsoAAA 1 +FmH9Q58NEOld1FURDj01AAA 1 implementsInterface MymqEwcde0+NZ/x8ZU7gpgAA 1 Class<?> intf CpBgtyYE80ad6UjVzBcrXAAA bXKXzrBC40m5Z1l+vw7pdAAA MymqEwcde0+NZ/x8ZU7gpgAA ZfPDK09vLUuoLWP9nfK1ywAA 4 UvV4d7oVeEG7yhjbQt9u/gAA PuSgBCPD90GziJuKSyfmvwAA MYpZCZDfekCXNpwq7EpcWwAA o92F8yzwI0uEhQeT5JEVSAAA bXKXzrBC40m5Z1l+vw7pdAAA 0dXB32ZKX02tr2RkTx1i1wAA MymqEwcde0+NZ/x8ZU7gpgAA 4 FtJ61gkwEkaA07FFK9MBEgAA IwG6cyYWU02nOJ9d+IaxNgAA 3iekAPemOE+Vit0UbUKXcAAA WbY7FsTOWE6e8AtwTX7NGQAA Callback bXKXzrBC40m5Z1l+vw7pdAAA 3 ntI9Wk78VkmNbPStawvqZQAA WeREDmQABEKrUkb9Vqx5hwAA y/rR+IN0e0KPCgGfWJq2IwAA 7 Z65jq4UGyUqwjdInNy55pwAA gPGQtvsp+EumdnJDBnHCuwAA Odja1IhFtUOEs1OHukElcQAA V3YJ5XcLXUCdFm7omR9v8QAA eBQMSNh32EmpXwFJN9TfsgAA Qs/F0P3ankC9u3wVRPwpzgAA vMEFQTMU9U28O6XecUxBSAAA NoOp bXKXzrBC40m5Z1l+vw7pdAAA 3 3Q9XJu5/n06NJTUcxbKjAAAA tKQ4P7VPbkWF865Y4OwOjgAA VXGX+QvnVEKtCQFlgPnrdwAA 1 eBQMSNh32EmpXwFJN9TfsgAA 1 INSTANCE cazkTBa320Sv+Rb537AL2AAA Dispatcher bXKXzrBC40m5Z1l+vw7pdAAA 3 loBy4y2omUS5IHGo0T34CQAA 3WU/zoKp30+jBOaygNy3fgAA QhaG6Mc8F0aTchbqyrKfuQAA 1 Qs/F0P3ankC9u3wVRPwpzgAA 1 loadObject O1Jgm4kbV02uduRgvIW6dAAA LazyLoader bXKXzrBC40m5Z1l+vw7pdAAA 3 JWMJAdXzOEOHc5VYAJelHAAA WeOP4bTDZUOq5/y41qCgpwAA 90RLjS/lQ0qqFxIJsSymPwAA 1 Z65jq4UGyUqwjdInNy55pwAA 1 loadObject IsebjsqPTUqKSY5EE32aTwAA ProxyRefDispatcher bXKXzrBC40m5Z1l+vw7pdAAA 3 Fabe9O8Jk0uEjCTP6KBkTgAA YteAwTUYuEyy/CvLIpCBZAAA JP9bCjKI+UaC6J0mW8Q8FwAA 1 gPGQtvsp+EumdnJDBnHCuwAA 1 loadObject 0MJjwwouNUSxji5pHIYupgAA FixedValue bXKXzrBC40m5Z1l+vw7pdAAA 3 EeXBO5QxRUuvHBW2YLoEOgAA lSi7T2fnAkWNMtTpXQMVmgAA 3tklj3rZH0WbBDv3Q9mjCAAA 1 vMEFQTMU9U28O6XecUxBSAAA 1 loadObject uEr1XH8YYEmeu5zvEBjJ3QAA bXKXzrBC40m5Z1l+vw7pdAAA IsebjsqPTUqKSY5EE32aTwAA XBR9HD1BTEOGk7gdpBjQrQAA 4 D9j95GPWG0uz3qdo09FidgAA fUmb+MhWOUipLNqueW6yDAAA 3e42RXgsek6F2R2u28rmwgAA MVV9/ZNLp0GYqpOH1xNyLAAA bXKXzrBC40m5Z1l+vw7pdAAA 0MJjwwouNUSxji5pHIYupgAA XBR9HD1BTEOGk7gdpBjQrQAA 4 hbfZY4Tgn0OwH+zd0KcwgQAA DUb7HSEtZUqL9p4zC5t1BgAA Zlj3zgvCs065WFk+1nggzgAA +JiIB1VxzkaMGZQwFdZifwAA bXKXzrBC40m5Z1l+vw7pdAAA 3eLZg81wmEufzPDGdk4+9QAA XBR9HD1BTEOGk7gdpBjQrQAA 4 1j19WRvQSEOUpsMpFyRbuwAA +Mg/ckLHUUSTkzlextFqcwAA nw9klZJxxEqaHMPAW9WUXQAA R6irTfKhrEiT3Wwukc0AHQAA bXKXzrBC40m5Z1l+vw7pdAAA JIARuFQVBkeJaonMHipEvwAA XBR9HD1BTEOGk7gdpBjQrQAA 4 AsgBkXPbEEOhdJYUw7QyagAA NMcaVh5MbEmUdgNfT+pvCAAA Zw3tWhUskESPOTZpeQwTbAAA HajR+JAac0efkDdTXBg5ogAA bXKXzrBC40m5Z1l+vw7pdAAA cazkTBa320Sv+Rb537AL2AAA XBR9HD1BTEOGk7gdpBjQrQAA 4 DzKUXBTC60+TEPcfIdF8/QAA 1oK3+Xg7J0S0S4jy57HMiAAA 4JmaYyQ+X06r4bKjWtRqwAAA /3r0HQLfokKw81HyX6NAXQAA bXKXzrBC40m5Z1l+vw7pdAAA O1Jgm4kbV02uduRgvIW6dAAA XBR9HD1BTEOGk7gdpBjQrQAA 4 WXAjyBhf5kKIXroWotkmTwAA MgCmkYJ1vEe5pGczekVGeQAA NvAac7cbREqyzwbJ3b4BBwAA fXNZanneJUSK7rLjcM0pqQAA bXKXzrBC40m5Z1l+vw7pdAAA uEr1XH8YYEmeu5zvEBjJ3QAA XBR9HD1BTEOGk7gdpBjQrQAA 4 2ogJ6LcQskWMp0e8RZxJdQAA HOGkbvPnOEa4v6G6mkJvIQAA SwB9orwup0GmpaZSdAULXQAA v9w4vUgviEWcbD8twrsTtAAA CallbackFilter bXKXzrBC40m5Z1l+vw7pdAAA 3 9uGnZPIpmEqXeoK68gapNgAA /TfpymaWYE6e03/U5kvfvwAA m7vdCq5ZMk6pUkplEiL8TwAA 2 accept yKz1WX74bEyqqTZHqRkfXgAA 1 Method method PlwSQ5n+f0eIxoyIOW1n6gAA equals yKz1WX74bEyqqTZHqRkfXgAA 1 Object filter 0s48r7Jt7kC+s8IzZnlhNQAA task OB1ywkeJUU2zhj8yqaXuowAA 6 ThreadPoolTaskScheduler L4AF/kor50S4rM5w2GzJtgAA mlfhFGnoCkSHIR6xzbze9wAA Task L4AF/kor50S4rM5w2GzJtgAA wgtzwR2JlkG0xuDwh2nrigAA 7 clMaroon $00B9FFFF 586 56 108 56 9QG1BnJ2V0q2ln4E65yUtgAA 1 Task False False 9QG1BnJ2V0q2ln4E65yUtgAA 9QG1BnJ2V0q2ln4E65yUtgAA False 9QG1BnJ2V0q2ln4E65yUtgAA clMaroon $00B9FFFF 517 152 87 56 2XcalSiUEE6wSs1J41q+EgAA 1 TriggerTask False False 2XcalSiUEE6wSs1J41q+EgAA 2XcalSiUEE6wSs1J41q+EgAA False 2XcalSiUEE6wSs1J41q+EgAA clMaroon $00B9FFFF 510 256 101 56 IbTV2NCx9U+4V96BZmR80gAA 1 CronTask False False IbTV2NCx9U+4V96BZmR80gAA IbTV2NCx9U+4V96BZmR80gAA False IbTV2NCx9U+4V96BZmR80gAA clMaroon $00B9FFFF 684 152 101 69 kver21/pgECurt7GZBG53gAA 1 IntervalTask False False kver21/pgECurt7GZBG53gAA kver21/pgECurt7GZBG53gAA False kver21/pgECurt7GZBG53gAA clMaroon $00B9FFFF 582,152;616,111 Av2qj+qNgEyA6bgAtueUPwAA pg6c6ZAYT0+i5mkiSbWF3wAA JfrhjHKrokWO8XgeizQ2BwAA False 1.5707963267949 15 Av2qj+qNgEyA6bgAtueUPwAA False 1.5707963267949 30 Av2qj+qNgEyA6bgAtueUPwAA False -1.5707963267949 15 Av2qj+qNgEyA6bgAtueUPwAA clMaroon $00B9FFFF 560,256;560,207 PcapfWCSyk+S/uM8fx7uFgAA JfrhjHKrokWO8XgeizQ2BwAA cuSC0bh0iU2Wv4ip2Wo9dAAA False 1.5707963267949 15 PcapfWCSyk+S/uM8fx7uFgAA False 1.5707963267949 30 PcapfWCSyk+S/uM8fx7uFgAA False -1.5707963267949 15 PcapfWCSyk+S/uM8fx7uFgAA clMaroon $00B9FFFF 703,152;665,111 Ms5vT46qs06q5AHTWAjncQAA pg6c6ZAYT0+i5mkiSbWF3wAA H7DA93joikKoKpxEQMEvqQAA False 1.5707963267949 15 Ms5vT46qs06q5AHTWAjncQAA False 1.5707963267949 30 Ms5vT46qs06q5AHTWAjncQAA False -1.5707963267949 15 Ms5vT46qs06q5AHTWAjncQAA ContextLifecycleScheduledTaskRegistrar L4AF/kor50S4rM5w2GzJtgAA KLVWRN6AiEWW5XvhxKPtTwAA 9 clMaroon $00B9FFFF 456 96 146 69 sdkNone zeB7tvRRsEC+CehvpExbIQAA 1 InitializingBean <<interface>> False False zeB7tvRRsEC+CehvpExbIQAA zeB7tvRRsEC+CehvpExbIQAA clMaroon $00B9FFFF 696 96 99 59 sdkNone CsI7GkhagUu+uAsbXWfDEQAA 1 DisposableBean <<interface>> False False CsI7GkhagUu+uAsbXWfDEQAA CsI7GkhagUu+uAsbXWfDEQAA clMaroon $00B9FFFF 562 224 148 43 MeTXG00AhE+aex2CbG4fGAAA 1 ScheduledTaskRegistrar False False MeTXG00AhE+aex2CbG4fGAAA MeTXG00AhE+aex2CbG4fGAAA False MeTXG00AhE+aex2CbG4fGAAA clMaroon $00B9FFFF 515 328 242 43 1KQudwJOAE2jwcCCreQDewAA 1 ContextLifecycleScheduledTaskRegistrar False False 1KQudwJOAE2jwcCCreQDewAA 1KQudwJOAE2jwcCCreQDewAA False 1KQudwJOAE2jwcCCreQDewAA clMaroon $00B9FFFF 772 224 181 59 sdkNone +vAjPIIqC0KBPOoSbG52vwAA 1 SmartInitializingSingleton <<interface>> False False +vAjPIIqC0KBPOoSbG52vwAA +vAjPIIqC0KBPOoSbG52vwAA clMaroon $00B9FFFF 615,224;559,164 zKejd0v2jUaeLQf7X64ykQAA 9gklJG7tJ0WN2LjAc9dTFgAA yRLSXCJUdUm/VOHN14lqkgAA False 1.5707963267949 15 zKejd0v2jUaeLQf7X64ykQAA False 1.5707963267949 30 zKejd0v2jUaeLQf7X64ykQAA False -1.5707963267949 15 zKejd0v2jUaeLQf7X64ykQAA clMaroon $00B9FFFF 654,224;718,154 i50+W3tyvUq+XgTykuHvegAA xJgWZQzjQkOgho14S0uwOwAA yRLSXCJUdUm/VOHN14lqkgAA False 1.5707963267949 15 i50+W3tyvUq+XgTykuHvegAA False 1.5707963267949 30 i50+W3tyvUq+XgTykuHvegAA False -1.5707963267949 15 i50+W3tyvUq+XgTykuHvegAA clMaroon $00B9FFFF 685,328;794,282 U+v/kGZsjEyMFIigr0I3TAAA WNmkfLsp/U20heaindxuNAAA plClYvJgfkezHMNasV5JfAAA False 1.5707963267949 15 U+v/kGZsjEyMFIigr0I3TAAA False 1.5707963267949 30 U+v/kGZsjEyMFIigr0I3TAAA False -1.5707963267949 15 U+v/kGZsjEyMFIigr0I3TAAA clMaroon $00B9FFFF 635,328;635,266 docI4Ei/n0uWMJ4lkRlFAwAA yRLSXCJUdUm/VOHN14lqkgAA plClYvJgfkezHMNasV5JfAAA False 1.5707963267949 15 docI4Ei/n0uWMJ4lkRlFAwAA False 1.5707963267949 30 docI4Ei/n0uWMJ4lkRlFAwAA False -1.5707963267949 15 docI4Ei/n0uWMJ4lkRlFAwAA TaskScheduler L4AF/kor50S4rM5w2GzJtgAA baLVV6Es8E+rzcDe2SxwJQAA 5 clMaroon $00B9FFFF 228 84 450 124 True sdkNone NoP6dDw2dUSfAAN4n1uJTAAA 1 TaskScheduler <<interface>> False False NoP6dDw2dUSfAAN4n1uJTAAA NoP6dDw2dUSfAAN4n1uJTAAA clMaroon $00B9FFFF 748 84 150 43 iefQ58zxOkuWP2oKYIa/ZgAA 1 ConcurrentTaskExecutor False False iefQ58zxOkuWP2oKYIa/ZgAA iefQ58zxOkuWP2oKYIa/ZgAA False iefQ58zxOkuWP2oKYIa/ZgAA clMaroon $00B9FFFF 600 260 156 43 TPXSxHq+CUWtticyR719kAAA 1 ConcurrentTaskScheduler False False TPXSxHq+CUWtticyR719kAAA TPXSxHq+CUWtticyR719kAAA False TPXSxHq+CUWtticyR719kAAA clMaroon $00B9FFFF 694,260;805,126 mx3cCsgLT0aLWDCiHhHgAQAA qt1X1gIjrECy3DurGcR0VgAA RKDewtEmj0+prh1Zv5V3kgAA False 1.5707963267949 15 mx3cCsgLT0aLWDCiHhHgAQAA False 1.5707963267949 30 mx3cCsgLT0aLWDCiHhHgAQAA False -1.5707963267949 15 mx3cCsgLT0aLWDCiHhHgAQAA clMaroon $00B9FFFF 642,260;554,207 6a6Zz+ac80CImziwtnZOuAAA qtJqyQSFdUePV9W2j9l3pAAA RKDewtEmj0+prh1Zv5V3kgAA False 1.5707963267949 15 6a6Zz+ac80CImziwtnZOuAAA False 1.5707963267949 30 6a6Zz+ac80CImziwtnZOuAAA False -1.5707963267949 15 6a6Zz+ac80CImziwtnZOuAAA Trigger L4AF/kor50S4rM5w2GzJtgAA Hwhgfl6wb0qdqfzDOtJ4NgAA 5 clMaroon $00B9FFFF 492 76 290 59 sdkNone qrU5rjJrd0iavSYaApfhOAAA 1 Trigger <<interface>> False False qrU5rjJrd0iavSYaApfhOAAA qrU5rjJrd0iavSYaApfhOAAA clMaroon $00B9FFFF 496 196 90 43 oy5gs4AjhE+SlVaEl4pO3gAA 1 CronTrigger False False oy5gs4AjhE+SlVaEl4pO3gAA oy5gs4AjhE+SlVaEl4pO3gAA False oy5gs4AjhE+SlVaEl4pO3gAA clMaroon $00B9FFFF 684 196 96 43 nuSrfumWW0i7pQEQl0CizAAA 1 PeriodicTrigger False False nuSrfumWW0i7pQEQl0CizAAA nuSrfumWW0i7pQEQl0CizAAA False nuSrfumWW0i7pQEQl0CizAAA clMaroon $00B9FFFF 558,196;611,134 LkaMOrkWa0yf0mXL3b8yXgAA mClJ28hBrk+niujzGmmV1QAA WTNYaMTBOE2EbiALe3Bt1gAA False 1.5707963267949 15 LkaMOrkWa0yf0mXL3b8yXgAA False 1.5707963267949 30 LkaMOrkWa0yf0mXL3b8yXgAA False -1.5707963267949 15 LkaMOrkWa0yf0mXL3b8yXgAA clMaroon $00B9FFFF 713,196;661,134 jNxmZLtO4UqowGAxyHwZWQAA mClJ28hBrk+niujzGmmV1QAA 6cDvikpFW0S7vv8MdIqSJgAA False 1.5707963267949 15 jNxmZLtO4UqowGAxyHwZWQAA False 1.5707963267949 30 jNxmZLtO4UqowGAxyHwZWQAA False -1.5707963267949 15 jNxmZLtO4UqowGAxyHwZWQAA ReschedulingRunnable L4AF/kor50S4rM5w2GzJtgAA 44UEu7/j+kOupVunPM7Z1wAA 7 clMaroon $00B9FFFF 578 84 85 46 sdkNone e0ZK401xdUuH6UQUyX9+yAAA 1 Runnable <<interface>> False False e0ZK401xdUuH6UQUyX9+yAAA e0ZK401xdUuH6UQUyX9+yAAA clMaroon $00B9FFFF 520 187 201 43 D8C7ROhuj02UP7hlExNVyQAA 1 DelegatingErrorHandlingRunnable False False D8C7ROhuj02UP7hlExNVyQAA D8C7ROhuj02UP7hlExNVyQAA False D8C7ROhuj02UP7hlExNVyQAA clMaroon $00B9FFFF 551 287 138 43 qFVp6NvhT0iGCsjn/ZeETwAA 1 ReschedulingRunnable False False qFVp6NvhT0iGCsjn/ZeETwAA qFVp6NvhT0iGCsjn/ZeETwAA False qFVp6NvhT0iGCsjn/ZeETwAA clMaroon $00B9FFFF 776 187 105 46 sdkNone VjtSXbLbTkasClv9jFBYQwAA 1 ScheduledFuture <<interface>> False False VjtSXbLbTkasClv9jFBYQwAA VjtSXbLbTkasClv9jFBYQwAA clMaroon $00B9FFFF 620,187;620,129 OMAEAl9EFUWxlhtm7I8yIgAA BVbA054c7E+wTRP2bbEaaQAA fY0CWxSpHkOo63JTaZOcHQAA False 1.5707963267949 15 OMAEAl9EFUWxlhtm7I8yIgAA False 1.5707963267949 30 OMAEAl9EFUWxlhtm7I8yIgAA False -1.5707963267949 15 OMAEAl9EFUWxlhtm7I8yIgAA clMaroon $00B9FFFF 663,287;779,232 QF/aCtk7Jke3YO89K9YUsAAA xmphiiEomUGt5qIo0QYgHQAA /ImkoP2PtEqH5PC19ZLOPwAA False 1.5707963267949 15 QF/aCtk7Jke3YO89K9YUsAAA False 1.5707963267949 30 QF/aCtk7Jke3YO89K9YUsAAA False -1.5707963267949 15 QF/aCtk7Jke3YO89K9YUsAAA clMaroon $00B9FFFF 619,287;620,229 tQ0LXfozME6YLM/yy8GSkgAA fY0CWxSpHkOo63JTaZOcHQAA /ImkoP2PtEqH5PC19ZLOPwAA False 1.5707963267949 15 tQ0LXfozME6YLM/yy8GSkgAA False 1.5707963267949 30 tQ0LXfozME6YLM/yy8GSkgAA False -1.5707963267949 15 tQ0LXfozME6YLM/yy8GSkgAA 36 Task L4AF/kor50S4rM5w2GzJtgAA 4 pg6c6ZAYT0+i5mkiSbWF3wAA eL1KN+U+rUePG/E33tDZdQAA oU7HReuNN0+E8hNq/QMaNQAA ADTKXtamGUKsnFkM1mAK8wAA 2 IPsJykZGW0mfO8Dkr04Y9gAA sD2yVRlnGUGG3D4Kdi5fwgAA 2 Av2qj+qNgEyA6bgAtueUPwAA Ms5vT46qs06q5AHTWAjncQAA 1 Runnable runnable vkPrivate 9QG1BnJ2V0q2ln4E65yUtgAA TriggerTask L4AF/kor50S4rM5w2GzJtgAA 4 JfrhjHKrokWO8XgeizQ2BwAA MT0IECis7U6QdJV6FkpO/QAA H2Ml5Mecw0m+JIr7aJQopAAA zMzB0SNToUmr0nd+VMPNKAAA 2 rZPjKPwePEObqSBbP18XyQAA Av2qj+qNgEyA6bgAtueUPwAA 2 IPsJykZGW0mfO8Dkr04Y9gAA PcapfWCSyk+S/uM8fx7uFgAA 1 Trigger trigger vkPrivate 2XcalSiUEE6wSs1J41q+EgAA CronTask L4AF/kor50S4rM5w2GzJtgAA 4 cuSC0bh0iU2Wv4ip2Wo9dAAA Mbshdibr1E+vgioVpEWZawAA xbcmHsnaRUOoqhz2KNWxzQAA pllSb4Vu70+RnIVxK6QLKgAA 1 PcapfWCSyk+S/uM8fx7uFgAA 1 rZPjKPwePEObqSBbP18XyQAA 1 String expression vkPrivate IbTV2NCx9U+4V96BZmR80gAA IntervalTask L4AF/kor50S4rM5w2GzJtgAA 4 H7DA93joikKoKpxEQMEvqQAA StrKIti9jkObc+DXRdUP/QAA xkPU+mgyU0qYcLNijrh49QAA vHEMPLguJ02BdaqOOu04BQAA 1 Ms5vT46qs06q5AHTWAjncQAA 1 sD2yVRlnGUGG3D4Kdi5fwgAA 2 long interval vkPrivate kver21/pgECurt7GZBG53gAA long initialDelay vkPrivate kver21/pgECurt7GZBG53gAA L4AF/kor50S4rM5w2GzJtgAA 9QG1BnJ2V0q2ln4E65yUtgAA 2XcalSiUEE6wSs1J41q+EgAA L4AF/kor50S4rM5w2GzJtgAA 2XcalSiUEE6wSs1J41q+EgAA IbTV2NCx9U+4V96BZmR80gAA L4AF/kor50S4rM5w2GzJtgAA 9QG1BnJ2V0q2ln4E65yUtgAA kver21/pgECurt7GZBG53gAA InitializingBean L4AF/kor50S4rM5w2GzJtgAA 3 9gklJG7tJ0WN2LjAc9dTFgAA CQ0QNRGTCUixlxemqmFwuQAA QzaVP3b7MUGlqElbSJH8twAA 1 zKejd0v2jUaeLQf7X64ykQAA 1 void afterPropertiesSet() zeB7tvRRsEC+CehvpExbIQAA DisposableBean L4AF/kor50S4rM5w2GzJtgAA 3 xJgWZQzjQkOgho14S0uwOwAA duQumPtCsEKJvpNquKPbuQAA c8fs5arOvk+qNLIJCeAwhgAA 1 i50+W3tyvUq+XgTykuHvegAA 1 void destroy CsI7GkhagUu+uAsbXWfDEQAA ScheduledTaskRegistrar L4AF/kor50S4rM5w2GzJtgAA 4 yRLSXCJUdUm/VOHN14lqkgAA BItW65QeakqNurew5EK/uwAA hE+110mpEkea/ccaWVF29gAA J3c69XoBEEKzABf8aQJmowAA 2 zKejd0v2jUaeLQf7X64ykQAA i50+W3tyvUq+XgTykuHvegAA 1 docI4Ei/n0uWMJ4lkRlFAwAA ContextLifecycleScheduledTaskRegistrar L4AF/kor50S4rM5w2GzJtgAA 4 plClYvJgfkezHMNasV5JfAAA nEI1aZZXGkq9D5bmMg6SNAAA TsM0/dxb70uSI3qAKavAcwAA Ar6OvZH6w0eBh1LXMxw8MwAA 1 U+v/kGZsjEyMFIigr0I3TAAA 1 docI4Ei/n0uWMJ4lkRlFAwAA SmartInitializingSingleton L4AF/kor50S4rM5w2GzJtgAA 3 WNmkfLsp/U20heaindxuNAAA sZyFtLWqckqC+fkGwH8g5AAA UrEW5f7/SkOwS+5QFuNfRgAA 1 U+v/kGZsjEyMFIigr0I3TAAA 1 void afterSingletonsInstantiated +vAjPIIqC0KBPOoSbG52vwAA L4AF/kor50S4rM5w2GzJtgAA MeTXG00AhE+aex2CbG4fGAAA zeB7tvRRsEC+CehvpExbIQAA 4 MI8Yu850FkehQmHJ5IQS/QAA fpmepGsAzkmSlEK3Z/dDEgAA g0aiankkBUKftL7JyBCBrAAA r5XTYB9Tk0m7MfTResB6fQAA L4AF/kor50S4rM5w2GzJtgAA MeTXG00AhE+aex2CbG4fGAAA CsI7GkhagUu+uAsbXWfDEQAA 4 zn6oh/aX0UuJrwy6gCVU2QAA QFP5MgKtlUuEA/C8IhrRsgAA oo6fCKg9c06+MH6WDHlXgwAA AblCJ9gbCUuRpqO2QLXMmgAA L4AF/kor50S4rM5w2GzJtgAA 1KQudwJOAE2jwcCCreQDewAA +vAjPIIqC0KBPOoSbG52vwAA 4 FpaTCUZuG0GuYuiv0FrWPgAA awNPmz5jxE2ZpYRPlrluUgAA esrFZDdilEa87XWbZRf1vwAA 2EQPVPKEbkea5utucx3m/QAA L4AF/kor50S4rM5w2GzJtgAA 1KQudwJOAE2jwcCCreQDewAA MeTXG00AhE+aex2CbG4fGAAA 4 6LzrU3LYCEqGcW9E4R4OjQAA 13qnNoZuG0a/NLqH1Z1MwQAA 8pLMFZMuckW7cMrwtvwgRQAA FhePVYas8kSkeRqiyR8XjgAA TaskScheduler L4AF/kor50S4rM5w2GzJtgAA 3 qtJqyQSFdUePV9W2j9l3pAAA cNJr7g2+BEmZHEMcmluAdwAA NseO4jPtC0yhPMezPZ+e2wAA 1 6a6Zz+ac80CImziwtnZOuAAA 6 ScheduledFuture<?> schedule NoP6dDw2dUSfAAN4n1uJTAAA 2 Runnable task /rBVMI3V6k2SMDRM+MbEhAAA Trigger trigger /rBVMI3V6k2SMDRM+MbEhAAA ScheduledFuture<?> schedule NoP6dDw2dUSfAAN4n1uJTAAA 2 Runnable task vUsi2kpjd0WtKl/h5knUmwAA Date startTime vUsi2kpjd0WtKl/h5knUmwAA ScheduledFuture<?> scheduleAtFixedRate NoP6dDw2dUSfAAN4n1uJTAAA 3 Runnable task SZa3UZUFlECgUV6XDbtrQgAA Date startTime SZa3UZUFlECgUV6XDbtrQgAA long period SZa3UZUFlECgUV6XDbtrQgAA ScheduledFuture<?> scheduleAtFixedRate NoP6dDw2dUSfAAN4n1uJTAAA 2 Runnable task Tmijl5m9906ZaeYRnnEhrAAA long period Tmijl5m9906ZaeYRnnEhrAAA ScheduledFuture<?> scheduleWithFixedDelay NoP6dDw2dUSfAAN4n1uJTAAA 3 Runnable task 95Zn4zYG1k2sr8aqZai9igAA Date startTime 95Zn4zYG1k2sr8aqZai9igAA long delay 95Zn4zYG1k2sr8aqZai9igAA ScheduledFuture<?> scheduleWithFixedDelay NoP6dDw2dUSfAAN4n1uJTAAA 2 Runnable task 0ReQGr0XbkuMJIDtsEpLXQAA long delay 0ReQGr0XbkuMJIDtsEpLXQAA ConcurrentTaskExecutor L4AF/kor50S4rM5w2GzJtgAA 4 qt1X1gIjrECy3DurGcR0VgAA iJhSXUJ6R0aGBC0ZVKEGKAAA W2WEE8jkj06Bn0XI6qaDWwAA uAQWvRW4SEqJTzc6QzRnRgAA 1 mx3cCsgLT0aLWDCiHhHgAQAA ConcurrentTaskScheduler L4AF/kor50S4rM5w2GzJtgAA 4 RKDewtEmj0+prh1Zv5V3kgAA BXZ0jBV7ck6Ymcg3SSaC8gAA VHs8d8tM/EatvQMNppqEJQAA D2PXDLtmpUKjhS51ysY8yQAA 1 6a6Zz+ac80CImziwtnZOuAAA 1 mx3cCsgLT0aLWDCiHhHgAQAA L4AF/kor50S4rM5w2GzJtgAA TPXSxHq+CUWtticyR719kAAA iefQ58zxOkuWP2oKYIa/ZgAA 4 tXhX27iWyUWX2bcVGxYZUwAA HjYcUHOR+kKI1CCv2+tbwQAA /7cscyU+JEuJz7IgTX8emgAA 8oKik5ZY/UqOEIDgNdChRwAA L4AF/kor50S4rM5w2GzJtgAA TPXSxHq+CUWtticyR719kAAA NoP6dDw2dUSfAAN4n1uJTAAA 4 lBqZQC4XVUuFvcpp0/yOrgAA CCWg8qU2h06egeMxce71PAAA 43JLMbOhA02qWQQI85usoQAA UVv3XQUzaU+lQEHooAe/2wAA Trigger L4AF/kor50S4rM5w2GzJtgAA 3 mClJ28hBrk+niujzGmmV1QAA B2qi2YHQwUKZrZa72tfadgAA /5ggOkClPkiDEJswXJ912wAA 2 LkaMOrkWa0yf0mXL3b8yXgAA jNxmZLtO4UqowGAxyHwZWQAA 1 Date nextExecutionTime qrU5rjJrd0iavSYaApfhOAAA 1 TriggerContext triggerContext g9BPYem5oUe+YX+rjhZ/swAA CronTrigger L4AF/kor50S4rM5w2GzJtgAA 4 WTNYaMTBOE2EbiALe3Bt1gAA 4k0dkBwkP0W1DvvSKSEu8AAA 4jfIU4ntSESh4mHl8Ri0DQAA gI+GxH9UlkS5OyaFglSliAAA 1 LkaMOrkWa0yf0mXL3b8yXgAA PeriodicTrigger L4AF/kor50S4rM5w2GzJtgAA 4 6cDvikpFW0S7vv8MdIqSJgAA mGxGvHREGUuZTetFxtxAHQAA YI3JIzELdkOk1+K2HnahNQAA 7gD/nhGER0iqdYFxHY10vQAA 1 jNxmZLtO4UqowGAxyHwZWQAA L4AF/kor50S4rM5w2GzJtgAA oy5gs4AjhE+SlVaEl4pO3gAA qrU5rjJrd0iavSYaApfhOAAA 4 bmPiBjrQpkaGo6gYkRbYtgAA VzMUv63SE0G4/k6mxgHIugAA /NPSeHRpikKmlfOdJG9XmwAA m+PPs0GlGEiPR3gIDtNUhwAA L4AF/kor50S4rM5w2GzJtgAA nuSrfumWW0i7pQEQl0CizAAA qrU5rjJrd0iavSYaApfhOAAA 4 e0800yPzOUGS6ikzXHqRFgAA wyQG9Mj07EqoXNeOTONpygAA F+GVlQo0KEqnR2puGolYkgAA V06IZojBrk6i7VEfdhXHCAAA Runnable L4AF/kor50S4rM5w2GzJtgAA 3 BVbA054c7E+wTRP2bbEaaQAA plmqfnSZIkuSlJVbV0AofAAA RjmwxiHF0U2PXYdG9M3llAAA 1 OMAEAl9EFUWxlhtm7I8yIgAA DelegatingErrorHandlingRunnable L4AF/kor50S4rM5w2GzJtgAA 4 fY0CWxSpHkOo63JTaZOcHQAA kZB7ukSg6Eyi6Bhcu/ATiAAA QNwE1P4R4EKmNKcNRMTP6wAA tiRHpA25pU+R3fcnQv1a8QAA 1 OMAEAl9EFUWxlhtm7I8yIgAA 1 tQ0LXfozME6YLM/yy8GSkgAA ReschedulingRunnable L4AF/kor50S4rM5w2GzJtgAA 4 /ImkoP2PtEqH5PC19ZLOPwAA Y5IR7iPPZUWq4kM6dvwT2gAA 7Ymcvosb+UKoXhoTgBHUAQAA AqeklghPbk2jem2U0N3RbAAA 1 QF/aCtk7Jke3YO89K9YUsAAA 1 tQ0LXfozME6YLM/yy8GSkgAA ScheduledFuture L4AF/kor50S4rM5w2GzJtgAA 3 xmphiiEomUGt5qIo0QYgHQAA wkjWfSYcVES77EOk9RmPjAAA C0DeD50Na0yPY5PdL9uoVAAA 1 QF/aCtk7Jke3YO89K9YUsAAA L4AF/kor50S4rM5w2GzJtgAA D8C7ROhuj02UP7hlExNVyQAA e0ZK401xdUuH6UQUyX9+yAAA 4 0ccLDJRzgU+KhD41ZsA15gAA mDvjo3S/YkKTJaaWpKo+HQAA K1vZPWagpUqoQCdZC+phoAAA cnJQxHeJgUeqnWtw290ssgAA L4AF/kor50S4rM5w2GzJtgAA qFVp6NvhT0iGCsjn/ZeETwAA VjtSXbLbTkasClv9jFBYQwAA 4 Qq8oqPEUbUW7ZVkfk/JoMQAA tdiBhgombEOGM4L02oBteQAA 8/8QW+9yzku+6JZ60lLtgQAA 3ZmB4/Mcmkmtr9uhH9aZIwAA L4AF/kor50S4rM5w2GzJtgAA qFVp6NvhT0iGCsjn/ZeETwAA D8C7ROhuj02UP7hlExNVyQAA 4 BhCLPQ7qAUCm0dgFuTziHQAA romhnuPI/UqINYbPsx7BVQAA g9xvWMCdL02sStAGijtz0gAA AdFRNmPnE0yH6tVk8uV7sQAA L4AF/kor50S4rM5w2GzJtgAA 2XcalSiUEE6wSs1J41q+EgAA 9QG1BnJ2V0q2ln4E65yUtgAA 4 QK5/evLLa0ihOgJINctVvAAA mqnYRhz2h02dWjplR2e1NQAA BC8lUnba9kWQg77+Efod8QAA 1W1mzlRGC0mztJXqGD0nHgAA L4AF/kor50S4rM5w2GzJtgAA IbTV2NCx9U+4V96BZmR80gAA 2XcalSiUEE6wSs1J41q+EgAA 4 tyiZW57kZ06yKsreymli+wAA okFzKPPqKEqiwbPFh4UEEgAA sFbDYAO6c0i0w25nKEp1VQAA jW2Ae8Dy00G2zuvCOYxKQgAA L4AF/kor50S4rM5w2GzJtgAA kver21/pgECurt7GZBG53gAA 9QG1BnJ2V0q2ln4E65yUtgAA 4 QufB22ic5ESeONKTe3mwdAAA DN0sYuK1QkqdhwBEym8qgwAA O4lTCsnYEkmgkzYrIASjiQAA 9o0nLdTrKESytvLc88enKQAA ================================================ FILE: note/flows/spring_application_run.gliffy ================================================ {"contentType":"application/gliffy+json","version":"1.1","metadata":{"title":"untitled","revision":0,"exportBorder":false},"embeddedResources":{"index":0,"resources":[]},"stage":{"objects":[{"x":541,"y":993,"rotation":0,"id":61,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":61,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[-1,-3],[-1,32],[306,32],[306,67]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":55,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":58,"px":0.5,"py":0}}},"linkMap":[]},{"x":797,"y":1060,"rotation":0,"id":58,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.start_end","width":100,"height":40,"lockAspectRatio":false,"lockShape":false,"order":58,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.start_end.flowchart_v1","strokeWidth":2,"strokeColor":"#990000","fillColor":"#990000","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":60,"uid":null,"width":96,"height":20,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

finished

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":544,"y":900,"rotation":0,"id":57,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":57,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":false,"interpolationType":"linear","cornerRadius":null,"controlPath":[[-4,0],[-4,50]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":52,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":55,"px":0.5,"py":0}}},"linkMap":[]},{"x":853,"y":820,"rotation":0,"id":54,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":33,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[-6,0],[-6,20],[-313,20],[-313,40]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":49,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":52,"px":0.5,"py":0}}},"linkMap":[]},{"x":849,"y":739,"rotation":0,"id":51,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":30,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":false,"interpolationType":"linear","cornerRadius":null,"controlPath":[[-2,1],[-2,41]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":45,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":49,"px":0.5,"py":0}}},"linkMap":[]},{"x":539,"y":661,"rotation":0,"id":47,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":27,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[1,-1],[1,19],[308,19],[308,39]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":35,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":45,"px":0.5,"py":0}}},"linkMap":[]},{"x":848,"y":414,"rotation":0,"id":43,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":24,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[-1,-4],[-1,16],[-308,16],[-308,36]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":38,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":26,"px":0.5,"py":0}}},"linkMap":[]},{"x":542,"y":325,"rotation":0,"id":41,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":23,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[-2,-5],[-2,20],[305,20],[305,45]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":21,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":38,"px":0.5,"py":0}}},"linkMap":[]},{"x":847,"y":236,"rotation":0,"id":24,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":12,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[0,-6],[0,19],[-307,19],[-307,44]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":12,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":21,"px":0.5,"py":0}}},"linkMap":[]},{"x":490,"y":280,"rotation":0,"id":21,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":100,"height":40,"lockAspectRatio":false,"lockShape":false,"order":10,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#0B599F","fillColor":"#1c4587","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":23,"uid":null,"width":96,"height":20,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

环境准备

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":851,"y":191,"rotation":0,"id":19,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":9,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":2,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[-4,-1],[-4,-21],[-311,-21],[-311,-41]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":12,"px":0.5,"py":0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":9,"px":0.5,"py":1}}},"linkMap":[]},{"x":797,"y":190,"rotation":0,"id":12,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":100,"height":40,"lockAspectRatio":false,"lockShape":false,"order":7,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#ffffff","fillColor":"#990000","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":14,"uid":null,"width":96,"height":27,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

starting

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":490,"y":120,"rotation":0,"id":9,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.start_end","width":100,"height":30,"lockAspectRatio":false,"lockShape":false,"order":5,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.start_end.flowchart_v1","strokeWidth":2,"strokeColor":"#0B599F","fillColor":"#0B599F","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":11,"uid":null,"width":96,"height":20,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

进入

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":436,"y":80,"rotation":0,"id":5,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":231,"height":20,"lockAspectRatio":false,"lockShape":false,"order":2,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

SpringApplication

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":390,"y":82,"rotation":0,"id":1,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":0,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"none","dashStyle":"4.0,4.0","startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":false,"interpolationType":"linear","cornerRadius":0,"controlPath":[[0,0],[2.8421709430404007e-13,1062.0169490172932]],"lockSegments":{}}},"children":null,"linkMap":[]},{"x":690,"y":82,"rotation":0,"id":4,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":1,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"none","dashStyle":"4.0,4.0","startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":false,"interpolationType":"linear","cornerRadius":0,"controlPath":[[0,0],[0,1067.0074976306398]],"lockSegments":{}}},"children":null,"linkMap":[]},{"x":987,"y":87,"rotation":0,"id":7,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":3,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"none","dashStyle":"4.0,4.0","startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":false,"interpolationType":"linear","cornerRadius":0,"controlPath":[[0,0],[-1.1368683772161603e-13,1051.0171264066062]],"lockSegments":{}}},"children":null,"linkMap":[]},{"x":720,"y":70,"rotation":0,"id":8,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":250.00000000000003,"height":40,"lockAspectRatio":false,"lockShape":false,"order":4,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

SpringApplicationRunListener

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":722,"y":370,"rotation":0,"id":38,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":250,"height":40,"lockAspectRatio":false,"lockShape":false,"order":21,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#ffffff","fillColor":"#990000","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":4.999999999999998,"y":0,"rotation":0,"id":39,"uid":null,"width":239.99999999999997,"height":27,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

environmentPrepared

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":541,"y":583,"rotation":0,"id":37,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":20,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":false,"interpolationType":"linear","cornerRadius":null,"controlPath":[[-1,-3],[-1,37]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":31,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":35,"px":0.5,"py":0}}},"linkMap":[]},{"x":480,"y":620,"rotation":0,"id":35,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":120,"height":40,"lockAspectRatio":false,"lockShape":false,"order":18,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#0B599F","fillColor":"#1c4587","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2.4,"y":0,"rotation":0,"id":36,"uid":null,"width":115.19999999999999,"height":20,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

context准备

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":542,"y":494,"rotation":0,"id":33,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":17,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":false,"interpolationType":"linear","cornerRadius":null,"controlPath":[[-2,-4],[-2,46]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":26,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":31,"px":0.5,"py":0}}},"linkMap":[]},{"x":480,"y":540,"rotation":0,"id":31,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":120,"height":40,"lockAspectRatio":false,"lockShape":false,"order":15,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#0B599F","fillColor":"#1c4587","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2.4,"y":0,"rotation":0,"id":32,"uid":null,"width":115.19999999999999,"height":20,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

context创建

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":480,"y":450,"rotation":0,"id":26,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":120,"height":40,"lockAspectRatio":false,"lockShape":false,"order":13,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#0B599F","fillColor":"#1c4587","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2.4,"y":0,"rotation":0,"id":27,"uid":null,"width":115.19999999999999,"height":20,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

Banner打印

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":737,"y":700,"rotation":0,"id":45,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":220,"height":40,"lockAspectRatio":false,"lockShape":false,"order":25,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#ffffff","fillColor":"#990000","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":4.399999999999999,"y":0,"rotation":0,"id":46,"uid":null,"width":211.2,"height":27,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

contextPrepared

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":737,"y":780,"rotation":0,"id":49,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":220,"height":40,"lockAspectRatio":false,"lockShape":false,"order":28,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#ffffff","fillColor":"#990000","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":4.399999999999999,"y":0,"rotation":0,"id":50,"uid":null,"width":211.2,"height":27,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

contextLoaded

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":470,"y":860,"rotation":0,"id":52,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":140,"height":40,"lockAspectRatio":false,"lockShape":false,"order":31,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#0B599F","fillColor":"#1c4587","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2.8000000000000003,"y":0,"rotation":0,"id":53,"uid":null,"width":134.4,"height":20,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

refreshContext

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":470,"y":950,"rotation":0,"id":55,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":140,"height":40,"lockAspectRatio":false,"lockShape":false,"order":35,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#0B599F","fillColor":"#1c4587","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2.8000000000000003,"y":0,"rotation":0,"id":56,"uid":null,"width":134.4,"height":20,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

runner调用

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]}],"background":"#FFFFFF","width":992,"height":1154,"maxWidth":5000,"maxHeight":5000,"nodeIndex":62,"autoFit":true,"exportBorder":false,"gridOn":true,"snapToGrid":true,"drawingGuidesOn":true,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"shapeStyles":{"com.gliffy.shape.flowchart.flowchart_v1.default":{"fill":"#990000","stroke":"#990000","strokeWidth":2}},"lineStyles":{"global":{"stroke":"#0B599F","strokeWidth":2,"dashStyle":null,"orthoMode":0,"fill":"none","startArrow":0,"endArrow":2}},"textStyles":{},"themeData":{"uid":"com.gliffy.theme.blueprint","name":"Blueprint","shape":{"primary":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"#DDE6F1","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#08233F","bold":null,"italic":null,"underline":null}},"secondary":{"strokeWidth":2,"strokeColor":"#08233F","fillColor":"#424D76","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#FFFFFF","bold":null,"italic":null,"underline":null}},"tertiary":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#08233F","bold":null,"italic":null,"underline":null}},"highlight":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"#0B599F","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#ffffff","bold":null,"italic":null,"underline":null}}},"line":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"none","arrowType":2,"interpolationType":"linear","cornerRadius":0,"text":{"color":"#08233F","bold":null,"italic":null,"underline":null}},"text":{"color":"#08233F","bold":null,"italic":null,"underline":null},"stage":{"color":"#FFFFFF"}}}} ================================================ FILE: note/guava-cache.md ================================================ **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* - [创建](#%E5%88%9B%E5%BB%BA) - [数据结构](#%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84) - [segments](#segments) - [ReferenceEntry](#referenceentry) - [初始化](#%E5%88%9D%E5%A7%8B%E5%8C%96) - [ReferenceEntry数组](#referenceentry%E6%95%B0%E7%BB%84) - [引用队列](#%E5%BC%95%E7%94%A8%E9%98%9F%E5%88%97) - [put](#put) - [Hash算法](#hash%E7%AE%97%E6%B3%95) - [ReHash](#rehash) - [Segment选取](#segment%E9%80%89%E5%8F%96) - [Segment.put](#segmentput) - [线程安全性](#%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E6%80%A7) - [过期/垃圾缓存清理](#%E8%BF%87%E6%9C%9F%E5%9E%83%E5%9C%BE%E7%BC%93%E5%AD%98%E6%B8%85%E7%90%86) - [垃圾缓存](#%E5%9E%83%E5%9C%BE%E7%BC%93%E5%AD%98) - [善后](#%E5%96%84%E5%90%8E) - [writeQueue移除](#writequeue%E7%A7%BB%E9%99%A4) - [accessQueue移除](#accessqueue%E7%A7%BB%E9%99%A4) - [加载终止](#%E5%8A%A0%E8%BD%BD%E7%BB%88%E6%AD%A2) - [移除算法](#%E7%A7%BB%E9%99%A4%E7%AE%97%E6%B3%95) - [过期缓存](#%E8%BF%87%E6%9C%9F%E7%BC%93%E5%AD%98) - [扩容](#%E6%89%A9%E5%AE%B9) - [设值](#%E8%AE%BE%E5%80%BC) - [get(key)](#getkey) - [get(key,hash,loader)](#getkeyhashloader) - [参考](#%E5%8F%82%E8%80%83) - [总结](#%E6%80%BB%E7%BB%93) # 创建 以CacheLoader的方式为例: ```java LoadingCache cache = CacheBuilder.newBuilder().maximumSize(2) .build(new CacheLoader() { @Override public String load(String s) throws Exception { return "Hello: " + s; } }); ``` 创建的关键便在于build方法,build方法的核心逻辑位于LocalCache构造器,构造器完成了两件事: - 将设置的属性从CacheBuilder复制到LocalCache。 - 构造缓存存储的数据结构,此数据结构可以理解为一个自己实现的ConcurrentHashMap(分段锁)。 数据结构的示意图: ![guava-cache](images/guava-cache.jpg) ## 数据结构 ### segments Segment代表了其中的一段。其类图(部分): ![Segment类图](images/Segment.jpg) 此类继承ReentrantLock的目的在于方便的进行加锁操作。 那么Segment的个数是如何确定的呢? **取最小的大于等于目的并行度的2的整次幂,如果设置了按权重大小的淘汰策略,那么还应注意总的权重值不超过给定的上限,每个Segment的权重按20计**。 相关源码: ```java LocalCache( CacheBuilder builder, @Nullable CacheLoader loader) { concurrencyLevel = Math.min(builder.getConcurrencyLevel(), MAX_SEGMENTS); int segmentCount = 1; while (segmentCount < concurrencyLevel && (!evictsBySize() || segmentCount * 20 <= maxWeight)) { ++segmentShift; segmentCount <<= 1; } } ``` 并行度即并发修改缓存值的线程数,可以通过CacheBuilder的concurrencyLevel方法进行设置,默认4. ### ReferenceEntry ReferenceEntry是guava-cache中实际进行存储的数据结构,其类图: ![ReferenceEntry类图](images/ReferenceEntry.jpg) 那么在初始状态下,每个Segment中有多少个ReferenceEntry呢? **取最小的大于等于(initialCapacity / segmentCount)的2的整次幂的值**。关键代码: ```java LocalCache( CacheBuilder builder, @Nullable CacheLoader loader) { int segmentCapacity = initialCapacity / segmentCount; if (segmentCapacity * segmentCount < initialCapacity) { ++segmentCapacity; } int segmentSize = 1; while (segmentSize < segmentCapacity) { segmentSize <<= 1; } } ``` initialCapacity由CacheBuilder的同名方法进行设置,默认16. ## 初始化 关键代码: ```java LocalCache( CacheBuilder builder, @Nullable CacheLoader loader) { if (evictsBySize()) { // Ensure sum of segment max weights = overall max weights long maxSegmentWeight = maxWeight / segmentCount + 1; long remainder = maxWeight % segmentCount; for (int i = 0; i < this.segments.length; ++i) { if (i == remainder) { maxSegmentWeight--; } this.segments[i] = createSegment(segmentSize, maxSegmentWeight, builder.getStatsCounterSupplier().get()); } } else { for (int i = 0; i < this.segments.length; ++i) { this.segments[i] = createSegment(segmentSize, UNSET_INT, builder.getStatsCounterSupplier().get()); } } } ``` 可以看出,初始化根据是否启用了权重大小限制分为了两种情况,两种情况的区别在于maxSegmentWeight参数,用以指定此Segment的权重上限。 createSegment其实就是对Segment构造器的调用,此构造器主要做了两件事: - 初始化ReferenceEntry数组数据结构。 - 初始化引用队列。 下面分开对其进行说明。 ### ReferenceEntry数组 关键代码: ```java Segment(LocalCache map, int initialCapacity, long maxSegmentWeight, StatsCounter statsCounter) { initTable(newEntryArray(initialCapacity)); } ``` newEntryArray方法只是创建了一个initialCapacity大小的数组,关键在于initTable: ```java void initTable(AtomicReferenceArray> newTable) { this.threshold = newTable.length() * 3 / 4; // 0.75 if (!map.customWeigher() && this.threshold == maxSegmentWeight) { // prevent spurious expansion before eviction this.threshold++; } this.table = newTable; } ``` 这里完成的是对临界值的设置,超过此值数据将进行扩张。 ### 引用队列 关键代码: ```java Segment(LocalCache map, int initialCapacity, long maxSegmentWeight, StatsCounter statsCounter) { //当不是强引用的时候成立 keyReferenceQueue = map.usesKeyReferences() ? new ReferenceQueue() : null; valueReferenceQueue = map.usesValueReferences() ? new ReferenceQueue() : null; recencyQueue = map.usesAccessQueue() ? new ConcurrentLinkedQueue>() : LocalCache.>discardingQueue(); writeQueue = map.usesWriteQueue() ? new WriteQueue() : LocalCache.>discardingQueue(); accessQueue = map.usesAccessQueue() ? new AccessQueue() : LocalCache.>discardingQueue(); } ``` keyReferenceQueue和valueReferenceQueue用于结合软引用、弱引用以及虚引用使用,关于java中四种引用的区别以及ReferenceQueue的用途,参考: [Java对象的强、软、弱和虚引用原理+结合ReferenceQueue对象构造Java对象的高速缓存器](http://blog.csdn.net/lyfi01/article/details/6415726) usesKeyReferences源码: ```java boolean usesKeyReferences() { return keyStrength != Strength.STRONG; } ``` keyStrength通过CacheBuilder.getKeyStrength获取: ```java Strength getKeyStrength() { return MoreObjects.firstNonNull(keyStrength, Strength.STRONG); } ``` 可以看出,**默认采用强引用的方式**。我们可以通过CacheBuilder的softValues、weakKeys,weakValues方法对其进行设置。 recencyQueue等队列将在后面结合get方法进行说明。 # put LocalCache.put: ```java @Override public V put(K key, V value) { checkNotNull(key); checkNotNull(value); int hash = hash(key); return segmentFor(hash).put(key, hash, value, false); } ``` ## Hash算法 LocalCache.hash: ```java int hash(@Nullable Object key) { int h = keyEquivalence.hash(key); return rehash(h); } ``` keyEquivalence是策略模式的体现,针对不同的引用方式(LocalCache.Strength)提供不同的hash算法实现。 Equivalence接口类图: ![Equivalence类图](images/Equivalence.jpg) keyEquivalence属性由CacheBuilder的getKeyEquivalence方法获得: ```java Equivalence getKeyEquivalence() { return MoreObjects.firstNonNull(keyEquivalence, getKeyStrength().defaultEquivalence()); } ``` 可以看出,**使用的hash算法与Strength相关联**。Strength部分源码(仅展示defaultEquivalence方法): ```java enum Strength { STRONG { @Override Equivalence defaultEquivalence() { return Equivalence.equals(); } }, SOFT { @Override Equivalence defaultEquivalence() { return Equivalence.identity(); } }, WEAK { @Override Equivalence defaultEquivalence() { return Equivalence.identity(); } } }; ``` 以强引用为例。Equivalence.equals()返回的其实是一个单例的Equals对象,由上面类图可以看出,Equals是Equivalence的子类,源码: ```java static final class Equals extends Equivalence implements Serializable { static final Equals INSTANCE = new Equals(); @Override protected boolean doEquivalent(Object a, Object b) { return a.equals(b); } @Override protected int doHash(Object o) { return o.hashCode(); } private Object readResolve() { return INSTANCE; } } ``` 可以看出,对于强引用来说,其哈希算法就是JDK Object的hashCode方法。 而对于weak和soft引用来说,对应的是Identity实例,源码: ```java static final class Identity extends Equivalence implements Serializable { static final Identity INSTANCE = new Identity(); @Override protected boolean doEquivalent(Object a, Object b) { return false; } @Override protected int doHash(Object o) { return System.identityHashCode(o); } private Object readResolve() { return INSTANCE; } } ``` identityHashCode返回的是**默认hashCode方法的计算结果,即根据内存地址计算而来的结果**。 至于为什么要分开处理,暂时未知。 ## ReHash guava cache采用了和ConcurrentHashMap同样的算法。 ## Segment选取 LocalCache.segmentFor: ```java Segment segmentFor(int hash) { return segments[(hash >>> segmentShift) & segmentMask]; } ``` segmentShift和segmentMask的取值,LocalCache构造器源码: ```java int segmentShift = 0; int segmentCount = 1; while (segmentCount < concurrencyLevel && (!evictsBySize() || segmentCount * 20 <= maxWeight)) { ++segmentShift; segmentCount <<= 1; } this.segmentShift = 32 - segmentShift; segmentMask = segmentCount - 1; ``` 可以看出,寻找Segment的过程其实是对**hashCode先取高n位,再取余的过程**。 ## Segment.put 源码很长,下面分部分说明。 ### 线程安全性 部分源码: ```java @Nullable V put(K key, int hash, V value, boolean onlyIfAbsent) { lock(); try { //... } finally { unlock(); postWriteCleanup(); } } ``` 可见,核心逻辑都位于锁的保护之中。 ### 过期/垃圾缓存清理 相关源码: ```java long now = map.ticker.read(); preWriteCleanup(now); ``` ticker.read方法返回的实际上就是System.nanoTime的值。preWriteCleanup最终调用runLockedCleanup方法: ```java void runLockedCleanup(long now) { //必定通过 if (tryLock()) { try { drainReferenceQueues(); expireEntries(now); // calls drainRecencyQueue readCount.set(0); } finally { unlock(); } } } ``` #### 垃圾缓存 当引用类型是弱引用或是虚引用,垃圾缓存才会存在,当JVM对这些缓存进行回收时,会将已经失效的**引用对象**放到特定的ReferenceQueue中,清理便是针对此队列进行,防止无用的引用对象浪费内存空间。 drainReferenceQueues: ```java @GuardedBy("this") void drainReferenceQueues() { if (map.usesKeyReferences()) { drainKeyReferenceQueue(); } if (map.usesValueReferences()) { drainValueReferenceQueue(); } } ``` 以drainKeyReferenceQueue为例: ```java @GuardedBy("this") void drainKeyReferenceQueue() { Reference ref; int i = 0; while ((ref = keyReferenceQueue.poll()) != null) { @SuppressWarnings("unchecked") ReferenceEntry entry = (ReferenceEntry) ref; map.reclaimKey(entry); if (++i == DRAIN_MAX) { break; } } } ``` DRAIN_MAX取值16,猜测这样做的目的在于降低开销,防止一次put操作耗费过多的时间。 reclaimKey用于清理ReferenceEntry对象,因为**keyReference和valueReference是保存在此类中的**。 ```java boolean reclaimKey(ReferenceEntry entry, int hash) { lock(); try { int newCount = count - 1; AtomicReferenceArray> table = this.table; int index = hash & (table.length() - 1); ReferenceEntry first = table.get(index); for (ReferenceEntry e = first; e != null; e = e.getNext()) { if (e == entry) { ++modCount; ReferenceEntry newFirst = removeValueFromChain( first, e, e.getKey(), hash, e.getValueReference().get(), e.getValueReference(), RemovalCause.COLLECTED); newCount = this.count - 1; table.set(index, newFirst); this.count = newCount; // write-volatile return true; } } return false; } finally { unlock(); postWriteCleanup(); } } ``` 注意两点: - guava cache也是**采用链表的形式解决hash冲突的**。源码中for循环便是遍历链表寻找指定的引用的过程。 - removeValueFromChain方法真正的完成移除value的操作。 removeValueFromChain: ```java ReferenceEntry removeValueFromChain( ReferenceEntry first, ReferenceEntry entry, @Nullable K key, int hash, V value, ValueReference valueReference, RemovalCause cause) { enqueueNotification(key, hash, value, valueReference.getWeight(), cause); writeQueue.remove(entry); accessQueue.remove(entry); if (valueReference.isLoading()) { valueReference.notifyNewValue(null); return first; } else { return removeEntryFromChain(first, entry); } } ``` ##### 善后 enqueueNotification用于进行一些移除之后的善后工作(然而却是在 移除之前执行的): ```java @GuardedBy("this") void enqueueNotification(@Nullable K key, int hash, @Nullable V value, int weight, RemovalCause cause) { //减少权重 totalWeight -= weight; //分析统计 if (cause.wasEvicted()) { statsCounter.recordEviction(); } if (map.removalNotificationQueue != DISCARDING_QUEUE) { RemovalNotification notification = RemovalNotification.create(key, value, cause); map.removalNotificationQueue.offer(notification); } } ``` 加入removalNotificationQueue的目的在于通知我们自定义的**移除监听器**,LocalCache构造器相关源码回顾: ```java //... removalListener = builder.getRemovalListener(); removalNotificationQueue = (removalListener == NullListener.INSTANCE) ? LocalCache.>discardingQueue() : new ConcurrentLinkedQueue>(); //... ``` 可以通过CacheBuilder的removalListener方法指定监听器。 ##### writeQueue移除 初始化在Segment构造器,相关源码: ```java writeQueue = map.usesWriteQueue() ? new WriteQueue() : LocalCache.>discardingQueue(); ``` usesWriteQueue最终的逻辑在expiresAfterWrite: ```java boolean expiresAfterWrite() { return expireAfterWriteNanos > 0; } ``` 这其实是guava cache提供的一种缓存淘汰策略,即**记录最后一次执行写入的时间,按照此时间间隔进行淘汰**,WriteQueue用于按照写入的顺序进行排序,直接继承自JDK的AbstractQueue。 此策略可以通过CacheBuilder的expireAfterWrite方法进行开启。 WriteQueue利用了双端队列实现了时间轴的概念,即**每次在队列前段插入新节点**,示意: > ----进入时间最短-----Enter-->--D-->--C-->--B-->--A-->--进入时间最久----- 当需要进行回收的时候,只需要从前往后遍历队列,只要找到一个过期的缓存,那么可以保证**此缓存后续的所有缓存都已过期.** ##### accessQueue移除 原理和writeQueue一样,此策略通过CacheBuilder的expireAfterAccess方法进行开启。 ##### 加载终止 如果已被回收的key对应的value尚处于正在加载的状态,那么将终止加载过程。有意义的实现位于LoadingValueReference (其它类均是空实现): ```java @Override public void notifyNewValue(@Nullable V newValue) { if (newValue != null) { // The pending load was clobbered by a manual write. // Unblock all pending gets, and have them return the new value. set(newValue); } else { // The pending load was removed. Delay notifications until loading completes. oldValue = unset(); } // TODO(fry): could also cancel loading if we had a handle on its future } ``` unset方法返回一个占位符对象,此对象用以说明此ValueReference将被加载。 ##### 移除算法 真正的移除位于removeEntryFromChain方法中: ```java @GuardedBy("this") @Nullable ReferenceEntry removeEntryFromChain(ReferenceEntry first, ReferenceEntry entry) { int newCount = count; ReferenceEntry newFirst = entry.getNext(); for (ReferenceEntry e = first; e != entry; e = e.getNext()) { ReferenceEntry next = copyEntry(e, newFirst); if (next != null) { newFirst = next; } else { removeCollectedEntry(e); newCount--; } } this.count = newCount; return newFirst; } ``` 移除算法并未采用从前往后遍历的方式,下面以图来说明。 假设链表最初的结构如下所示: ![初始](images/entry_before_remove.png) 处理之后的结构: ![之后](images/entry_after_remove.png) 结合源码看出,**节点移除实际上导致了一条新的链表的创建**,那么为什么不采用直接将2和4连接的方式呢? WeakEntry部分源码: ```java final int hash; final ReferenceEntry next; volatile ValueReference valueReference = unset(); ``` 可以看出,next指针被定义为final,这样可以保证**即使有读线程在并发(读操作是没有加锁的)地读取,也可以读取到数据,只不过是过期的数据**,这里是CopyOnWrite思想的体现。 #### 过期缓存 expireEntries: ```java @GuardedBy("this") void expireEntries(long now) { //recencyQueue和accessQueue区分不清,暂且跳过 drainRecencyQueue(); ReferenceEntry e; while ((e = writeQueue.peek()) != null && map.isExpired(e, now)) { if (!removeEntry(e, e.getHash(), RemovalCause.EXPIRED)) { throw new AssertionError(); } } while ((e = accessQueue.peek()) != null && map.isExpired(e, now)) { if (!removeEntry(e, e.getHash(), RemovalCause.EXPIRED)) { throw new AssertionError(); } } } ``` 逻辑到这里就很明确了。 ### 扩容 相关源码: ```java int newCount = this.count + 1; if (newCount > this.threshold) { // ensure capacity expand(); newCount = this.count + 1; } ``` guava cache扩容仍然采用了ConcurrentHashMap的思想。**扩容是针对Segment进行的,而不是整个Map,这样可以保证一个Segment的扩容不会对其它的Segment访问造成影响。** **扩容都是在原来的基础上进行两倍扩容**,ConcurrentHashMap针对此特性做出了一定的优化措施,以原长度为16,扩容到32为例: 16的Mask: 01111 32的Mask: 11111 也就是说,如果对象的hashCode的高一位是0,那么其在新数组中的位置其实是不变的,这些也就无需复制。 源码不再贴出。 ### 设值 。。。 # get(key) 即LocalLoadingCache.get: ```java @Override public V get(K key) throws ExecutionException { return localCache.getOrLoad(key); } ``` LocalCache.getOrLoad: ```java V getOrLoad(K key) throws ExecutionException { return get(key, defaultLoader); } ``` defaultLoader便是在构造时指定的CacheLoader对象。 LocalCache.get: ```java V get(K key, CacheLoader loader) throws ExecutionException { int hash = hash(checkNotNull(key)); return segmentFor(hash).get(key, hash, loader); } ``` ## get(key,hash,loader) Segment.get简略版源码: ```java V get(K key, int hash, CacheLoader loader) throws ExecutionException { try { //快速判断 if (count != 0) { // read-volatile //遍历寻找 ReferenceEntry e = getEntry(key, hash); if (e != null) { long now = map.ticker.read(); //判断Entry是否已经过期、被回收或是正在加载,如果是,返回null V value = getLiveValue(e, now); if (value != null) { recordRead(e, now); statsCounter.recordHits(1); return scheduleRefresh(e, key, hash, value, now, loader); } ValueReference valueReference = e.getValueReference(); if (valueReference.isLoading()) { //阻塞等待直到加载完成 return waitForLoadingValue(e, key, valueReference); } } } // at this point e is either null or expired; //加锁再次遍历或是加载 return lockedGetOrLoad(key, hash, loader); } catch (ExecutionException ee) { throw ee; } finally { postReadCleanup(); } } ``` 逻辑注释里已经很清楚了,这里只需要补充一点,scheduleRefresh方法: ```java V scheduleRefresh(ReferenceEntry entry,K key,int hash,V oldValue,long now,CacheLoader loader) { if (map.refreshes() && (now - entry.getWriteTime() > map.refreshNanos) && !entry.getValueReference().isLoading()) { V newValue = refresh(key, hash, loader, true); if (newValue != null) { return newValue; } } return oldValue; } ``` refreshes()方法的条件是refreshNanos > 0,这其实是guava cache提供的自动刷新机制,可以通过CacheBuilder的refreshAfterWrite方法进行设置。 # 参考 很好的两篇博客: [为什么ConcurrentHashMap可以这么快?](http://www.cnblogs.com/cm4j/p/cc_1.html) [高并发下数据写入与过期](http://www.cnblogs.com/cm4j/p/cc_2.html) # 总结 Guava cache其实是在ConcurrentHashMap的基础上加入了过期、权重、自动刷新等特性。 ================================================ FILE: note/guava-cache.uml ================================================ guava-cache 1 classes pOVCN04YTkyPBMAjGitVmgAA 3 Segment /9yhICFbz0aYYcPKs97RcwAA Ae2HChCHbkuaIbd7IUcKNwAA 3 clMaroon $00B9FFFF 683 72 94 43 QZk3qccUBkGc0DHmjKfcswAA 1 ReentrantLock False False QZk3qccUBkGc0DHmjKfcswAA QZk3qccUBkGc0DHmjKfcswAA False QZk3qccUBkGc0DHmjKfcswAA clMaroon $00B9FFFF 590 156 281 173 UCER5y6kBE6QWpEiQy0jeAAA 1 Segment False False UCER5y6kBE6QWpEiQy0jeAAA UCER5y6kBE6QWpEiQy0jeAAA False UCER5y6kBE6QWpEiQy0jeAAA clMaroon $00B9FFFF 729,156;729,114 XdlMhmx1+keGjVYmP6FzaQAA Q0vADP6RmkK9TI4HE6j1fgAA i18O71EwwEG36qcvLX4hUgAA False 1.5707963267949 15 XdlMhmx1+keGjVYmP6FzaQAA False 1.5707963267949 30 XdlMhmx1+keGjVYmP6FzaQAA False -1.5707963267949 15 XdlMhmx1+keGjVYmP6FzaQAA ReferenceEntry /9yhICFbz0aYYcPKs97RcwAA YEtjP2o9bkimwGU9oXkmiQAA 23 clMaroon $00B9FFFF 609 80 272 267 sdkNone False lK4+CSxRtkajbVMOKGPgKwAA 1 ReferenceEntry <<interface>> False False lK4+CSxRtkajbVMOKGPgKwAA lK4+CSxRtkajbVMOKGPgKwAA clMaroon $00B9FFFF 527 424 86 43 agGLnepOZUWMGpB9BNV6mQAA 1 WeakEntry False False agGLnepOZUWMGpB9BNV6mQAA agGLnepOZUWMGpB9BNV6mQAA False agGLnepOZUWMGpB9BNV6mQAA clMaroon $00B9FFFF 585,424;644,346 McYxaBMGhUy4kTBjZDjC7wAA +ki7fmgcM0GCyoCem793JAAA TWKYKhaO7k6CDONkeuwJcAAA False 1.5707963267949 15 McYxaBMGhUy4kTBjZDjC7wAA False 1.5707963267949 30 McYxaBMGhUy4kTBjZDjC7wAA False -1.5707963267949 15 McYxaBMGhUy4kTBjZDjC7wAA clMaroon $00B9FFFF 392 84 100 43 Y/fSa5P/F0OedNW2e2gMWgAA 1 WeakReference False False Y/fSa5P/F0OedNW2e2gMWgAA Y/fSa5P/F0OedNW2e2gMWgAA False Y/fSa5P/F0OedNW2e2gMWgAA clMaroon $00B9FFFF 561,424;449,126 tZE72Ra4pUaH2gwymGQsEgAA jzc4+7Um4UWfPTAQJnxzRAAA TWKYKhaO7k6CDONkeuwJcAAA False 1.5707963267949 15 tZE72Ra4pUaH2gwymGQsEgAA False 1.5707963267949 30 tZE72Ra4pUaH2gwymGQsEgAA False -1.5707963267949 15 tZE72Ra4pUaH2gwymGQsEgAA clMaroon $00B9FFFF 352 504 103 43 kFdLEs4enU+SWTAAhNHViAAA 1 WeakWriteEntry False False kFdLEs4enU+SWTAAhNHViAAA kFdLEs4enU+SWTAAhNHViAAA False kFdLEs4enU+SWTAAhNHViAAA clMaroon $00B9FFFF 499 504 142 43 rM9qUYGGT0GXtxCtNsUGLAAA 1 WeakAccessWriteEntry False False rM9qUYGGT0GXtxCtNsUGLAAA rM9qUYGGT0GXtxCtNsUGLAAA False rM9qUYGGT0GXtxCtNsUGLAAA clMaroon $00B9FFFF 690 504 111 43 uWWoGUXUNUCZ/nCl14GKpAAA 1 WeakAccessEntry False False uWWoGUXUNUCZ/nCl14GKpAAA uWWoGUXUNUCZ/nCl14GKpAAA False uWWoGUXUNUCZ/nCl14GKpAAA clMaroon $00B9FFFF 447,504;527,465 NJr59MSZ+Eu+WNfepJas6gAA TWKYKhaO7k6CDONkeuwJcAAA 93jlwp4emEqyy0wHqATQaQAA False 1.5707963267949 15 NJr59MSZ+Eu+WNfepJas6gAA False 1.5707963267949 30 NJr59MSZ+Eu+WNfepJas6gAA False -1.5707963267949 15 NJr59MSZ+Eu+WNfepJas6gAA clMaroon $00B9FFFF 569,504;569,466 OUtrr9xcbkKPu01L2mFcVwAA TWKYKhaO7k6CDONkeuwJcAAA HoXx/yPd3kGajrS6LKEJ8QAA False 1.5707963267949 15 OUtrr9xcbkKPu01L2mFcVwAA False 1.5707963267949 30 OUtrr9xcbkKPu01L2mFcVwAA False -1.5707963267949 15 OUtrr9xcbkKPu01L2mFcVwAA clMaroon $00B9FFFF 699,504;612,465 mp+cKDusa0ux94Om1XDUwwAA TWKYKhaO7k6CDONkeuwJcAAA wNdh0R6Z4EW4MU7FnVIaogAA False 1.5707963267949 15 mp+cKDusa0ux94Om1XDUwwAA False 1.5707963267949 30 mp+cKDusa0ux94Om1XDUwwAA False -1.5707963267949 15 mp+cKDusa0ux94Om1XDUwwAA clMaroon $00B9FFFF 691 424 108 43 vgRC6jT7bEG7I/dbiXB9nAAA 1 NullEntry False False vgRC6jT7bEG7I/dbiXB9nAAA vgRC6jT7bEG7I/dbiXB9nAAA False vgRC6jT7bEG7I/dbiXB9nAAA clMaroon $00B9FFFF 744,424;744,346 iOFSVHRMhUC3qtItzV6gXwAA +ki7fmgcM0GCyoCem793JAAA gm0s7fN7MUGPNG8kJfioDgAA False 1.5707963267949 15 iOFSVHRMhUC3qtItzV6gXwAA False 1.5707963267949 30 iOFSVHRMhUC3qtItzV6gXwAA False -1.5707963267949 15 iOFSVHRMhUC3qtItzV6gXwAA clMaroon $00B9FFFF 878 424 147 43 plpJ+x5Je0aZxAPqt2FPJQAA 3 AbstractReferenceEntry False False plpJ+x5Je0aZxAPqt2FPJQAA plpJ+x5Je0aZxAPqt2FPJQAA False plpJ+x5Je0aZxAPqt2FPJQAA clMaroon $00B9FFFF 905 508 93 43 WHCtmI5bz0WDreb+t7/KYQAA 1 StrongEntry False False WHCtmI5bz0WDreb+t7/KYQAA WHCtmI5bz0WDreb+t7/KYQAA False WHCtmI5bz0WDreb+t7/KYQAA clMaroon $00B9FFFF 691 584 109 43 HqmXjfKZJEmYuOLsPkFXbgAA 1 StrongWriteEntry False False HqmXjfKZJEmYuOLsPkFXbgAA HqmXjfKZJEmYuOLsPkFXbgAA False HqmXjfKZJEmYuOLsPkFXbgAA clMaroon $00B9FFFF 877 584 148 43 Pj9EmAqXv0eBc6q36QWLfgAA 1 StrongAccessWriteEntry False False Pj9EmAqXv0eBc6q36QWLfgAA Pj9EmAqXv0eBc6q36QWLfgAA False Pj9EmAqXv0eBc6q36QWLfgAA clMaroon $00B9FFFF 1068 584 117 43 I96+k1V1HEqhb7q2foQr1wAA 1 StrongAccessEntry False False I96+k1V1HEqhb7q2foQr1wAA I96+k1V1HEqhb7q2foQr1wAA False I96+k1V1HEqhb7q2foQr1wAA clMaroon $00B9FFFF 951,508;951,466 eWb1UfuYREWGyvr2YgoALgAA 61YJIn++5UScbl0gfijb6wAA tv0I6P8mrkCtxCTgycuyJQAA False 1.5707963267949 15 eWb1UfuYREWGyvr2YgoALgAA False 1.5707963267949 30 eWb1UfuYREWGyvr2YgoALgAA False -1.5707963267949 15 eWb1UfuYREWGyvr2YgoALgAA clMaroon $00B9FFFF 950,584;951,550 /2uMaimAd0iVJ1Hpwap42QAA tv0I6P8mrkCtxCTgycuyJQAA L8nJXRa1GkKMXrfuAq2z7wAA False 1.5707963267949 15 /2uMaimAd0iVJ1Hpwap42QAA False 1.5707963267949 30 /2uMaimAd0iVJ1Hpwap42QAA False -1.5707963267949 15 /2uMaimAd0iVJ1Hpwap42QAA clMaroon $00B9FFFF 799,585;905,546 Ihtd0kcPTEGidIvpiKLQJQAA tv0I6P8mrkCtxCTgycuyJQAA KV6QN3/FTkah+EEbdv5LDAAA False 1.5707963267949 15 Ihtd0kcPTEGidIvpiKLQJQAA False 1.5707963267949 30 Ihtd0kcPTEGidIvpiKLQJQAA False -1.5707963267949 15 Ihtd0kcPTEGidIvpiKLQJQAA clMaroon $00B9FFFF 1078,584;997,549 Z8FRSOOb/EqrffjpnY6PzwAA tv0I6P8mrkCtxCTgycuyJQAA 5dwjUdcfZkCDmUyLPsOumAAA False 1.5707963267949 15 Z8FRSOOb/EqrffjpnY6PzwAA False 1.5707963267949 30 Z8FRSOOb/EqrffjpnY6PzwAA False -1.5707963267949 15 Z8FRSOOb/EqrffjpnY6PzwAA clMaroon $00B9FFFF 932,424;863,346 uJQidLqSgU2450xVmQCqCgAA +ki7fmgcM0GCyoCem793JAAA 61YJIn++5UScbl0gfijb6wAA False 1.5707963267949 15 uJQidLqSgU2450xVmQCqCgAA False 1.5707963267949 30 uJQidLqSgU2450xVmQCqCgAA False -1.5707963267949 15 uJQidLqSgU2450xVmQCqCgAA Equivalence /9yhICFbz0aYYcPKs97RcwAA CtEy19ahVkCWrUoRd0BNNAAA 7 clMaroon $00B9FFFF 434 140 108 43 soXdj63WjEyYpm1hGnsv0wAA 3 Equivalence False False soXdj63WjEyYpm1hGnsv0wAA soXdj63WjEyYpm1hGnsv0wAA False soXdj63WjEyYpm1hGnsv0wAA clMaroon $00B9FFFF 440 44 97 45 sdkNone oj0df6D4a0uvwfjBUKl8mQAA 1 BiPredicate <<interface>> False False oj0df6D4a0uvwfjBUKl8mQAA False oj0df6D4a0uvwfjBUKl8mQAA clMaroon $00B9FFFF 384 232 93 43 ueWD21zZf0K0UD1R8/X2/AAA 1 Equals False False ueWD21zZf0K0UD1R8/X2/AAA ueWD21zZf0K0UD1R8/X2/AAA False ueWD21zZf0K0UD1R8/X2/AAA clMaroon $00B9FFFF 512 232 80 43 8bSmc1XxJ0WsiW05YAVjAgAA 1 Identity False False 8bSmc1XxJ0WsiW05YAVjAgAA 8bSmc1XxJ0WsiW05YAVjAgAA False 8bSmc1XxJ0WsiW05YAVjAgAA clMaroon $00B9FFFF 487,140;488,88 5R4kjLaBjUqp6dxjj3e92AAA MiwVDSEYn0GMc2cotbPAjAAA 5YQZWVdnl0GFWQ9WDnFSqAAA False 1.5707963267949 15 5R4kjLaBjUqp6dxjj3e92AAA False 1.5707963267949 30 5R4kjLaBjUqp6dxjj3e92AAA False -1.5707963267949 15 5R4kjLaBjUqp6dxjj3e92AAA clMaroon $00B9FFFF 443,232;474,182 e6m2aNgwH0OZMjB9i3MY3gAA 5YQZWVdnl0GFWQ9WDnFSqAAA QpgoALJjXky3AV4OLR9kGQAA False 1.5707963267949 15 e6m2aNgwH0OZMjB9i3MY3gAA False 1.5707963267949 30 e6m2aNgwH0OZMjB9i3MY3gAA False -1.5707963267949 15 e6m2aNgwH0OZMjB9i3MY3gAA clMaroon $00B9FFFF 536,232;501,182 WngGJQCfiEm1pPksoTBN8wAA 5YQZWVdnl0GFWQ9WDnFSqAAA 2fz1RItq0EC1YtEsbq5XZwAA False 1.5707963267949 15 WngGJQCfiEm1pPksoTBN8wAA False 1.5707963267949 30 WngGJQCfiEm1pPksoTBN8wAA False -1.5707963267949 15 WngGJQCfiEm1pPksoTBN8wAA 36 ReentrantLock /9yhICFbz0aYYcPKs97RcwAA 4 Q0vADP6RmkK9TI4HE6j1fgAA THfZnQzhSEiFPe75wqnJfAAA Q0pnJgHeTEGefulK0t/4JAAA u0p24Efe6UGjOxE1Jk/JNgAA 1 XdlMhmx1+keGjVYmP6FzaQAA Segment /9yhICFbz0aYYcPKs97RcwAA 4 i18O71EwwEG36qcvLX4hUgAA U8PK1QrryU6JGe+h2GDlDgAA RoScRf7xt0CLj4OvdD/C+QAA D5gca/+Epkmy7L338hI6xgAA 1 XdlMhmx1+keGjVYmP6FzaQAA 10 LocalCache<K, V> map vkPrivate UCER5y6kBE6QWpEiQy0jeAAA int count vkPrivate UCER5y6kBE6QWpEiQy0jeAAA long totalWeight vkPrivate UCER5y6kBE6QWpEiQy0jeAAA AtomicReferenceArray<ReferenceEntry<K, V>> table vkPrivate UCER5y6kBE6QWpEiQy0jeAAA ReferenceQueue<K> keyReferenceQueue vkPrivate UCER5y6kBE6QWpEiQy0jeAAA ReferenceQueue<V> valueReferenceQueue vkPrivate UCER5y6kBE6QWpEiQy0jeAAA Queue<ReferenceEntry<K, V>> recencyQueue vkPrivate UCER5y6kBE6QWpEiQy0jeAAA Queue<ReferenceEntry<K, V>> writeQueue vkPrivate UCER5y6kBE6QWpEiQy0jeAAA Queue<ReferenceEntry<K, V>> accessQueue vkPrivate UCER5y6kBE6QWpEiQy0jeAAA StatsCounter statsCounter vkPrivate UCER5y6kBE6QWpEiQy0jeAAA Bae, Rankyoung /9yhICFbz0aYYcPKs97RcwAA Jung, Yoontae /9yhICFbz0aYYcPKs97RcwAA Kim, Hyunsoo /9yhICFbz0aYYcPKs97RcwAA /9yhICFbz0aYYcPKs97RcwAA UCER5y6kBE6QWpEiQy0jeAAA QZk3qccUBkGc0DHmjKfcswAA 4 6FCGgKDs6E6gM1izez0DvwAA B4fXfyBXC0+9OxOukBBgiwAA kWnluZ46cUqW12igA4QyngAA CKlNwOey5EeF/naXI1BoVwAA ReferenceEntry /9yhICFbz0aYYcPKs97RcwAA 3 +ki7fmgcM0GCyoCem793JAAA Ni+mZe42xkOB5cr+DyCkmQAA IQN5gIpr1kSFEynp7H21+AAA 3 McYxaBMGhUy4kTBjZDjC7wAA iOFSVHRMhUC3qtItzV6gXwAA uJQidLqSgU2450xVmQCqCgAA 17 ValueReference<K, V> getValueReference lK4+CSxRtkajbVMOKGPgKwAA void setValueReference lK4+CSxRtkajbVMOKGPgKwAA 2 ValueReference<K 5Lk9gIhiKEekPqoU75qKigAA V> valueReference 5Lk9gIhiKEekPqoU75qKigAA ReferenceEntry<K, V> getNext lK4+CSxRtkajbVMOKGPgKwAA int getHash lK4+CSxRtkajbVMOKGPgKwAA K getKey lK4+CSxRtkajbVMOKGPgKwAA long getAccessTime lK4+CSxRtkajbVMOKGPgKwAA void setAccessTime lK4+CSxRtkajbVMOKGPgKwAA 1 long time tR0aLA5ArU6EPNMA4OpJIwAA ReferenceEntry<K, V> getNextInAccessQueue lK4+CSxRtkajbVMOKGPgKwAA void setNextInAccessQueue lK4+CSxRtkajbVMOKGPgKwAA 2 ReferenceEntry<K /Phpwn+YHkelav1Y9DZZzgAA V> next /Phpwn+YHkelav1Y9DZZzgAA ReferenceEntry<K, V> getPreviousInAccessQueue lK4+CSxRtkajbVMOKGPgKwAA void setPreviousInAccessQueue lK4+CSxRtkajbVMOKGPgKwAA 2 ReferenceEntry<K fEQib/cH2kOn//7q7aajBgAA V> previous fEQib/cH2kOn//7q7aajBgAA long getWriteTime lK4+CSxRtkajbVMOKGPgKwAA void setWriteTime lK4+CSxRtkajbVMOKGPgKwAA 1 long time aIBjlq3dCkmPaHhQDyrDugAA ReferenceEntry<K, V> getNextInWriteQueue lK4+CSxRtkajbVMOKGPgKwAA void setNextInWriteQueue lK4+CSxRtkajbVMOKGPgKwAA 2 ReferenceEntry<K 1prsdTTdEUWrl+VZYlw5AAAA V> next 1prsdTTdEUWrl+VZYlw5AAAA ReferenceEntry<K, V> getPreviousInWriteQueue lK4+CSxRtkajbVMOKGPgKwAA void setPreviousInWriteQueue lK4+CSxRtkajbVMOKGPgKwAA 2 ReferenceEntry<K yOisvJVKHUiGtQjUDyjw3AAA V> previous yOisvJVKHUiGtQjUDyjw3AAA WeakEntry /9yhICFbz0aYYcPKs97RcwAA 4 TWKYKhaO7k6CDONkeuwJcAAA Ko57hNkblEeXt6mQnDnKpQAA Vqt9ZwMZJkqvleaBq8NRvwAA eHpAF1fNv0iNSLOcI+0LuAAA 1 McYxaBMGhUy4kTBjZDjC7wAA 1 tZE72Ra4pUaH2gwymGQsEgAA 3 NJr59MSZ+Eu+WNfepJas6gAA OUtrr9xcbkKPu01L2mFcVwAA mp+cKDusa0ux94Om1XDUwwAA /9yhICFbz0aYYcPKs97RcwAA agGLnepOZUWMGpB9BNV6mQAA lK4+CSxRtkajbVMOKGPgKwAA 4 KLFHbtvznEKPQx/DmHIdngAA GaLG4bGj6EuoADXfMFvsWAAA gbzMn9mfoEG2DIoglgyZtQAA 3uM1DJ6bWkuTRVx8HLsppQAA WeakReference /9yhICFbz0aYYcPKs97RcwAA 4 jzc4+7Um4UWfPTAQJnxzRAAA dEnWsCq43UCaIWcKM/PNhwAA vt02/HAzlEKY2idbsWR0qQAA JgesvN5KSEG//nfEhY8JRwAA 1 tZE72Ra4pUaH2gwymGQsEgAA /9yhICFbz0aYYcPKs97RcwAA agGLnepOZUWMGpB9BNV6mQAA Y/fSa5P/F0OedNW2e2gMWgAA 4 +JWlkeYs50iro7u7wJH8uwAA hxHHtu9uYUGZYfECK6mN0AAA VEMtpYUSqUeWxhN1v+cCsQAA W+CNowzl00Kk+woRnUF4qgAA WeakWriteEntry /9yhICFbz0aYYcPKs97RcwAA 4 93jlwp4emEqyy0wHqATQaQAA Hl/U5sYk50mOBNdTGJPY1wAA wWR53Kjcz0mjeVHUje4RogAA bjs5k00ZoEyx4noM/PNZVAAA 1 NJr59MSZ+Eu+WNfepJas6gAA WeakAccessWriteEntry /9yhICFbz0aYYcPKs97RcwAA 4 HoXx/yPd3kGajrS6LKEJ8QAA 4dvXzwwS9ku0niIgAgOfVQAA ELr8fQk57EK85qQpsUp9ZAAA Os82wj/N0EeIqQN18Tjo2gAA 1 OUtrr9xcbkKPu01L2mFcVwAA WeakAccessEntry /9yhICFbz0aYYcPKs97RcwAA 4 wNdh0R6Z4EW4MU7FnVIaogAA O9X3DLiI0EGzhT1u8djLHQAA gdR7oAW5n0GOjxOrfHVeagAA wILb2EKgx0WPKOg7sHP//gAA 1 mp+cKDusa0ux94Om1XDUwwAA /9yhICFbz0aYYcPKs97RcwAA kFdLEs4enU+SWTAAhNHViAAA agGLnepOZUWMGpB9BNV6mQAA 4 85ZX/mugRkyDAGOuD8IXrAAA S3SLPC7JA0Gm61t03O2W6AAA 7BSZOmOgMUuhsfr0EKv79AAA +J9o0fn2VU2aSTScOBRHUgAA /9yhICFbz0aYYcPKs97RcwAA rM9qUYGGT0GXtxCtNsUGLAAA agGLnepOZUWMGpB9BNV6mQAA 4 njdOz3PX80m3bniHbVdqSQAA bf3iSm8RMk+m1xGMdIoeZQAA feTfHclfnEa2OiyGZ/NW1AAA jvc2H0G0v0aqDf34eE9IHwAA /9yhICFbz0aYYcPKs97RcwAA uWWoGUXUNUCZ/nCl14GKpAAA agGLnepOZUWMGpB9BNV6mQAA 4 InqNioDvLU+f0ebNNoNrpwAA HP5YQ1d010yWHS/qJqrSjgAA 4DSTMgXsVk2hew+aAaXmrQAA RHLfdww2LUankDfaC6yUmQAA NullEntry /9yhICFbz0aYYcPKs97RcwAA 4 gm0s7fN7MUGPNG8kJfioDgAA 1mDJEQdQ/UW73I6IcMZXbgAA kFsW5QWEZ0emIm6+iEzmIwAA PLSQ3oDJIUWOHDgmzxt1vAAA 1 iOFSVHRMhUC3qtItzV6gXwAA /9yhICFbz0aYYcPKs97RcwAA vgRC6jT7bEG7I/dbiXB9nAAA lK4+CSxRtkajbVMOKGPgKwAA 4 kMCAKen2m0ODDDXG8ZEjdgAA QBR02+qph02Kl7VD0ePmdQAA LO3eJg9NmUuHtkkFqiaXEwAA ITlWUNvJFEmvtNtz5EI/lAAA AbstractReferenceEntry True /9yhICFbz0aYYcPKs97RcwAA 4 61YJIn++5UScbl0gfijb6wAA coxHVgbqYE6DIUUUtPVagQAA nCAutfAhqUqsV9bqIocSywAA fvKPnbmqzkG+c89lgvbQgQAA 1 uJQidLqSgU2450xVmQCqCgAA 1 eWb1UfuYREWGyvr2YgoALgAA StrongEntry /9yhICFbz0aYYcPKs97RcwAA 4 tv0I6P8mrkCtxCTgycuyJQAA wtNLlgyNxkahHIzfbs98fgAA VRTLih2iX0CpP2vc41sRnQAA 2zTUUwOe9kaf230d+RrFiAAA 1 eWb1UfuYREWGyvr2YgoALgAA 3 /2uMaimAd0iVJ1Hpwap42QAA Ihtd0kcPTEGidIvpiKLQJQAA Z8FRSOOb/EqrffjpnY6PzwAA StrongWriteEntry /9yhICFbz0aYYcPKs97RcwAA 4 KV6QN3/FTkah+EEbdv5LDAAA UCz2pbMqaU2h9Zn5Z6bHfAAA cFs2utwuBUek+f6NM43cTwAA HJYKa4n7SE6ZXLUZSaoa+AAA 1 Ihtd0kcPTEGidIvpiKLQJQAA StrongAccessWriteEntry /9yhICFbz0aYYcPKs97RcwAA 4 L8nJXRa1GkKMXrfuAq2z7wAA Aq97rD3I4Uai+kUCYu2BugAA cwS1mYk0N0mX1Sy5imDOpgAA M9VRehfK1Ea3WkwT1yjXHwAA 1 /2uMaimAd0iVJ1Hpwap42QAA StrongAccessEntry /9yhICFbz0aYYcPKs97RcwAA 4 5dwjUdcfZkCDmUyLPsOumAAA Jv1pIkJ2iUKligEEsmJTkAAA +Ke9VT5RaUiHxP6UT6f+oAAA igm1z15jwESenrZK4HiZ1QAA 1 Z8FRSOOb/EqrffjpnY6PzwAA /9yhICFbz0aYYcPKs97RcwAA WHCtmI5bz0WDreb+t7/KYQAA plpJ+x5Je0aZxAPqt2FPJQAA 4 gT+Lyu5dNkuq2E0bNMCpxgAA RGvsYGKAAkO27pgbv51IwwAA MccfWSM/kE+66NbGefKmwAAA gG7b+av9l0CGfbAJOAsGlAAA /9yhICFbz0aYYcPKs97RcwAA Pj9EmAqXv0eBc6q36QWLfgAA WHCtmI5bz0WDreb+t7/KYQAA 4 oT624PvS2UOsRwWtbeAD/wAA YAdVE0NGckOdMrUyzDoMDgAA Q+1CEm676EqPnqG2OhPx5AAA PzOZ6r2zBkuHXeaDv2STmAAA /9yhICFbz0aYYcPKs97RcwAA HqmXjfKZJEmYuOLsPkFXbgAA WHCtmI5bz0WDreb+t7/KYQAA 4 WZyfs5TDykOH9pwlqELkigAA 7IAp5VrlRUykgSHf+qvCyAAA YCWGRF7oVkmxhvTdh/avJQAA aDkZDMAv/kyFTsrBseaMMAAA /9yhICFbz0aYYcPKs97RcwAA I96+k1V1HEqhb7q2foQr1wAA WHCtmI5bz0WDreb+t7/KYQAA 4 FftLplGddUWE5roRnETyLwAA KFnza1wkWE61f0CdKBCuzQAA ChgULQicR0uAP4pAHxwHWQAA YwtghXXgSEOFydy2d7HZqAAA /9yhICFbz0aYYcPKs97RcwAA plpJ+x5Je0aZxAPqt2FPJQAA lK4+CSxRtkajbVMOKGPgKwAA 4 OO0HELXCkECXB82GjLg0MgAA mR/5mCeAOUWKAml24ypglgAA WQhQchgOgEeZOdKqTdNORQAA ar0/i8q0oUqpPpTGQR6IuQAA Equivalence True /9yhICFbz0aYYcPKs97RcwAA 4 5YQZWVdnl0GFWQ9WDnFSqAAA oMGICYeeQUudysCha1dxcAAA pzv4EIVi+kq3BsQAyX+ahgAA o43jxHqOR0OUc6rrBUkX0AAA 1 5R4kjLaBjUqp6dxjj3e92AAA 2 e6m2aNgwH0OZMjB9i3MY3gAA WngGJQCfiEm1pPksoTBN8wAA BiPredicate /9yhICFbz0aYYcPKs97RcwAA 3 MiwVDSEYn0GMc2cotbPAjAAA cOWqMSWwZEajFaiLQhoC2gAA tYU9+q/Bkkmvg9EwwqQVXwAA 1 5R4kjLaBjUqp6dxjj3e92AAA Equals /9yhICFbz0aYYcPKs97RcwAA 4 QpgoALJjXky3AV4OLR9kGQAA I67SfyNbpE2HvsdQo6K+eAAA 9yjz/0gtH0eB2FZTV+gnoAAA Ffuh26m4+02lmgk5lym8UQAA 1 e6m2aNgwH0OZMjB9i3MY3gAA Identity /9yhICFbz0aYYcPKs97RcwAA 4 2fz1RItq0EC1YtEsbq5XZwAA d5b0Jl0SrEGdaag42urB+QAA 96elPEAgj0CiZq9Zi/NTPAAA zSYlmGKky0WcxSatWrcNawAA 1 WngGJQCfiEm1pPksoTBN8wAA /9yhICFbz0aYYcPKs97RcwAA soXdj63WjEyYpm1hGnsv0wAA oj0df6D4a0uvwfjBUKl8mQAA 4 YBtOV+cZ3kKQGxcQz0uq0gAA nHAL6guDM0+nCSNZBuP0+QAA yilp62T1FE6rMLcxu780QwAA eFfoBo3AtUKnOgDAUkz9bQAA /9yhICFbz0aYYcPKs97RcwAA ueWD21zZf0K0UD1R8/X2/AAA soXdj63WjEyYpm1hGnsv0wAA 4 c208sblMiEif/jtqDGgQIwAA tbKNGbnzrEuFiOIXaitRFwAA d1oSj8Li4UKrYnru76wEzgAA K44lmZ3mz0q/JZfZuHaWBAAA /9yhICFbz0aYYcPKs97RcwAA 8bSmc1XxJ0WsiW05YAVjAgAA soXdj63WjEyYpm1hGnsv0wAA 4 6QJibPZH30WhLfC+EkCh3gAA 0TAqPlqqTUyugjr5bYKx+wAA g/m47Z7KVEiTSJh+EhgJ2gAA CfuD04+gFEGhcFiQDt3HQgAA ================================================ FILE: note/spring-aop.md ================================================ **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* - [开头](#%E5%BC%80%E5%A4%B4) - [aop:config](#aopconfig) - [解析](#%E8%A7%A3%E6%9E%90) - [proxy-target-class & expose-proxy](#proxy-target-class--expose-proxy) - [aop:pointcut](#aoppointcut) - [aop:advisor](#aopadvisor) - [aop:aspect](#aopaspect) - [aop:declare-parents](#aopdeclare-parents) - [其它](#%E5%85%B6%E5%AE%83) - [MethodLocatingFactoryBean](#methodlocatingfactorybean) - [SimpleBeanFactoryAwareAspectInstanceFactory](#simplebeanfactoryawareaspectinstancefactory) - [总结](#%E6%80%BB%E7%BB%93) - [代理子类生成](#%E4%BB%A3%E7%90%86%E5%AD%90%E7%B1%BB%E7%94%9F%E6%88%90) - [入口](#%E5%85%A5%E5%8F%A3) - [postProcessBeforeInstantiation](#postprocessbeforeinstantiation) - [调用时机](#%E8%B0%83%E7%94%A8%E6%97%B6%E6%9C%BA) - [源码](#%E6%BA%90%E7%A0%81) - [应该代理 ?](#%E5%BA%94%E8%AF%A5%E4%BB%A3%E7%90%86-) - [基础类检测](#%E5%9F%BA%E7%A1%80%E7%B1%BB%E6%A3%80%E6%B5%8B) - [跳过类检测](#%E8%B7%B3%E8%BF%87%E7%B1%BB%E6%A3%80%E6%B5%8B) - [AOP逻辑](#aop%E9%80%BB%E8%BE%91) - [Advisor寻找](#advisor%E5%AF%BB%E6%89%BE) - [适用性检测](#%E9%80%82%E7%94%A8%E6%80%A7%E6%A3%80%E6%B5%8B) - [检测结果缓存](#%E6%A3%80%E6%B5%8B%E7%BB%93%E6%9E%9C%E7%BC%93%E5%AD%98) - [TargetSource](#targetsource) - [postProcessAfterInitialization](#postprocessafterinitialization) - [Advisor寻找](#advisor%E5%AF%BB%E6%89%BE-1) - [适用性判断](#%E9%80%82%E7%94%A8%E6%80%A7%E5%88%A4%E6%96%AD) - [引入](#%E5%BC%95%E5%85%A5) - [其它](#%E5%85%B6%E5%AE%83-1) - [Advisor扩展](#advisor%E6%89%A9%E5%B1%95) - [排序](#%E6%8E%92%E5%BA%8F) - [创建](#%E5%88%9B%E5%BB%BA) - [JDK动态代理 or Cglib](#jdk%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86-or-cglib) - [JDK动态代理](#jdk%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86) - [equals & hashCode](#equals--hashcode) - [链式调用](#%E9%93%BE%E5%BC%8F%E8%B0%83%E7%94%A8) - [Cglib](#cglib) - [aop:scoped-proxy](#aopscoped-proxy) - [解析](#%E8%A7%A3%E6%9E%90-1) - [入口](#%E5%85%A5%E5%8F%A3-1) - [装饰](#%E8%A3%85%E9%A5%B0) - [代理生成](#%E4%BB%A3%E7%90%86%E7%94%9F%E6%88%90) - [Advisor](#advisor) - [引入](#%E5%BC%95%E5%85%A5-1) - [例子](#%E4%BE%8B%E5%AD%90) - [自定义Scope](#%E8%87%AA%E5%AE%9A%E4%B9%89scope) - [配置](#%E9%85%8D%E7%BD%AE) - [测试](#%E6%B5%8B%E8%AF%95) - [原理](#%E5%8E%9F%E7%90%86) - [doGetBean](#dogetbean) - [代理子类](#%E4%BB%A3%E7%90%86%E5%AD%90%E7%B1%BB) - [CallbackFilter & Callback](#callbackfilter--callback) - [Callback](#callback) - [CallbackFilter](#callbackfilter) - [回调](#%E5%9B%9E%E8%B0%83) - [aop:aspectj-autoproxy](#aopaspectj-autoproxy) - [属性](#%E5%B1%9E%E6%80%A7) - [proxy-target-class](#proxy-target-class) - [expose-proxy](#expose-proxy) - [栗子](#%E6%A0%97%E5%AD%90) - [切面](#%E5%88%87%E9%9D%A2) - [被代理类](#%E8%A2%AB%E4%BB%A3%E7%90%86%E7%B1%BB) - [配置](#%E9%85%8D%E7%BD%AE-1) - [解析](#%E8%A7%A3%E6%9E%90-2) - [原理](#%E5%8E%9F%E7%90%86-1) - [总结](#%E6%80%BB%E7%BB%93-1) - [拾遗](#%E6%8B%BE%E9%81%97) - [AOP切面的坑](#aop%E5%88%87%E9%9D%A2%E7%9A%84%E5%9D%91) - [总结](#%E6%80%BB%E7%BB%93-2) # 开头 aop部分的解析器由AopNamespaceHandler注册,其init方法: ```java @Override public void init() { registerBeanDefinitionParser("config", new ConfigBeanDefinitionParser()); registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser()); registerBeanDefinitionDecorator("scoped-proxy", new ScopedProxyBeanDefinitionDecorator()); } ``` # aop:config 此标签用以配置pointcut, advisor, aspect,实例: ```xml ``` ConfigBeanDefinitionParser.parse: ```java @Override public BeanDefinition parse(Element element, ParserContext parserContext) { CompositeComponentDefinition compositeDef = new CompositeComponentDefinition(element.getTagName(), parserContext.extractSource(element)); parserContext.pushContainingComponent(compositeDef); // 是否生成代理类 configureAutoProxyCreator(parserContext, element); List childElts = DomUtils.getChildElements(element); for (Element elt: childElts) { String localName = parserContext.getDelegate().getLocalName(elt); if (POINTCUT.equals(localName)) { parsePointcut(elt, parserContext); } else if (ADVISOR.equals(localName)) { parseAdvisor(elt, parserContext); } else if (ASPECT.equals(localName)) { parseAspect(elt, parserContext); } } parserContext.popAndRegisterContainingComponent(); return null; } ``` ## 解析 解析的过程主要分为以下几个部分。 ### proxy-target-class & expose-proxy 对应着aop:config的两个属性,前者代表是否为被代理这生成CGLIB子类,默认false,只为接口生成代理子类(话说如果不生成子类那么怎么拦截?)。后者代表是否将代理bean暴露给用户,如果暴露,可以通过Spring AopContext类获得,默认不暴露。 解析的过程无非就是属性的读取,不再详细说明。 ### aop:pointcut pointcut的解析是一个生成一个BeanDefinition并将其id, expression等属性保存在BeanDefinition中。注意以下几点: - BeanDefinition的ID来自于id属性,如果没有,那么自动生成。 - BeanDefinition的class是AspectJExpressionPointcut。 - BeanDefinition的scope为prototype。 AspectJExpressionPointcut类图: ![AspectJExpressionPointcut类图](images/AspectJExpressionPointcut.jpg) ### aop:advisor 首先是其所有属性的示例: ```xml ``` advisor概念是Spring独有的,来自于上古时代,应该是较早时候的aop概念的实现: [AOP Alliance (Java/J2EE AOP standards)](http://aopalliance.sourceforge.net/)。Spring官方的说法: [aop-schema-advisors](http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-schema-advisors)。 其相关的包/类就在spring-aop下: ![aopalliance包](images/aopalliance.png) advice-ref是必须的属性,**并且这里的advice必须实现org.aopalliance.aop.Advice的子接口**。这些子接口指的什么呢,见Spring官方文档: [aop-api-advice-types](http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop-api.html#aop-api-advice-types)。比如org.aopalliance.intercept.MethodInterceptor。 最常见的用途就是结合事务使用: ```xml ``` 解析的套路和楼上类似,只不过此处的beanClass是DefaultBeanFactoryPointcutAdvisor,其类图: ![DefaultBeanFactoryPointcutAdvisor类图](images/DefaultBeanFactoryPointcutAdvisor.jpg) 另外注意对于pointcut和pointcut-ref两者处理的区别,对于pointcut属性,Spring会同样创建一个AspectJExpressionPointcut类型的BeanDefinition,对于pointcut-ref会生成一个RuntimeBeanReference对象指向原pointcut的引用。此类的类图: ![RuntimeBeanReference类图](images/RuntimeBeanReference.jpg) 可以看出,这种aop的实现需要实现各种接口,所以不应该再使用此种方式进行aop,除了Spring内部的实现。 ### aop:aspect 配置举例: ```xml ``` 解析形成的BeanDefinition结构如下: ```html AspectComponentDefinition beanRefArray RuntimeBeanReference(aop:aspect的ref属性) beanDefArray // 被注册 RootBeanDefinition(aop:declare-parents) beanClass: DeclareParentsAdvisor ConstructorArg implement-interface types-matching default-impl delegate-ref // 被注册 RootBeanDefinition(aop:before,aop:after...) beanClass: AspectJPointcutAdvisor ConstructorArg RootBeanDefinition beanClass: 由子标签决定 ConstructorArg RootBeanDefinition beanClass: MethodLocatingFactoryBean properties targetBeanName: aspectName methodName: method属性 RootBeanDefinition beanClass: SimpleBeanFactoryAwareAspectInstanceFactory properties aspectBeanName: aspectName //还有pointcut定义和引用... ``` 结构图里面的aspectName来自于aop:aspect的ref属性,此属性是必须配置的,因为Spring要知道aop:before等标签指定的方法是哪个bean/类/对象的方法。 #### aop:declare-parents 对于aop:declare-parents子标签,其决定的是代理子类应该实现哪些接口: ```xml ``` 此标签最终被解析成为beanClass为DeclareParentsAdvisor的BeanDefinition,并注册到容器中。其类图: ![DeclareParentsAdvisor类图](images/DeclareParentsAdvisor.jpg) #### 其它 此处的其它指的是aop:before, aop:after等最核心的标签。其最终被解析为beanClass为AspectJPointcutAdvisor的BeanDefinition,类图: ![AspectJPointcutAdvisor类图](images/AspectJPointcutAdvisor.jpg) 正如上面结构图里所描述的,其构造参数为一个BeanDefintion,此对象的beanClass是不确定的,由aop:before/after中的before和after决定,代码: ```java private Class getAdviceClass(Element adviceElement, ParserContext parserContext) { String elementName = parserContext.getDelegate().getLocalName(adviceElement); if (BEFORE.equals(elementName)) { return AspectJMethodBeforeAdvice.class; } else if (AFTER.equals(elementName)) { return AspectJAfterAdvice.class; } else if (AFTER_RETURNING_ELEMENT.equals(elementName)) { return AspectJAfterReturningAdvice.class; } else if (AFTER_THROWING_ELEMENT.equals(elementName)) { return AspectJAfterThrowingAdvice.class; } else if (AROUND.equals(elementName)) { return AspectJAroundAdvice.class; } } ``` 而此BeanDefintion的构造参数又由以下三个部分组成: ##### MethodLocatingFactoryBean 第一个便是beanClass为此类型的BeanDefinition。其内部有一个methodName属性,存储的便是标签的method属性的值。其类图: ![MethodLocatingFactoryBean类图](images/MethodLocatingFactoryBean.jpg) 这个东西是干什么用的呢?其实是用于在指定的advice(aop:aspect的ref属性)中得到Method对象。入口在setBeanFactory方法: ```java @Override public void setBeanFactory(BeanFactory beanFactory) { Class beanClass = beanFactory.getType(this.targetBeanName); this.method = BeanUtils.resolveSignature(this.methodName, beanClass); } ``` ##### SimpleBeanFactoryAwareAspectInstanceFactory 其类图: ![SimpleBeanFactoryAwareAspectInstanceFactory类图](images/SimpleBeanFactoryAwareAspectInstanceFactory.jpg) 此类用于在BeanFactory中定位aspect bean,这个bean指的是谁? ```xml ``` 就是它!查找很简单: ```java @Override public Object getAspectInstance() { return this.beanFactory.getBean(this.aspectBeanName); } ``` #### 总结 从整个aop:aspect标签最终被解析为一个AspectJPointcutAdvisor来看,Spring在实现上仍将其作为Advisor的概念。 ## 代理子类生成 关键在于AspectJAwareAdvisorAutoProxyCreator,此对象在ConfigBeanDefinitionParser的configureAutoProxyCreator方法中注册,其类图: ![AspectJAwareAdvisorAutoProxyCreator类图](images/AspectJAwareAdvisorAutoProxyCreator.jpg) 那么子类生成的入口在哪里呢? ### 入口 从AspectJAwareAdvisorAutoProxyCreator的类图中可以看出,此类实现了SmartInstantiationAwareBeanPostProcessor接口,所以很容易想到入口应该位于此接口及其父接口(BeanPostProcessor)的相关方法中。实际上确实是这样的。 ### postProcessBeforeInstantiation #### 调用时机 先来回顾一下此方法在Bean创建的过程中的调用时机。 AbstractAutowireCapableBeanFactory.createBean部分源码: ```java //// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance. Object bean = resolveBeforeInstantiation(beanName, mbdToUse); if (bean != null) { return bean; } Object beanInstance = doCreateBean(beanName, mbdToUse, args); ``` 可以看出,调用发生在Bean实例的创建之前。 #### 源码 AbstractAutoProxyCreator.postProcessBeforeInstantiation: ```java @Override public Object postProcessBeforeInstantiation(Class beanClass, String beanName) { Object cacheKey = getCacheKey(beanClass, beanName); if (beanName == null || !this.targetSourcedBeans.contains(beanName)) { if (this.advisedBeans.containsKey(cacheKey)) { return null; } if (isInfrastructureClass(beanClass) || shouldSkip(beanClass, beanName)) { this.advisedBeans.put(cacheKey, Boolean.FALSE); return null; } } if (beanName != null) { TargetSource targetSource = getCustomTargetSource(beanClass, beanName); if (targetSource != null) { this.targetSourcedBeans.add(beanName); Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource); Object proxy = createProxy(beanClass, beanName, specificInterceptors, targetSource); this.proxyTypes.put(cacheKey, proxy.getClass()); return proxy; } } return null; } ``` 下面分部分对其进行说明。 #### 应该代理 ? Spring首先会对当前的beanClass进行检查(是否应该/可以对其进行代理)。 不应该代理的类分为两种情况: - 用于实现AOP的Spring基础类,此种情况在isInfrastructureClass方法中完成检测(单词Infrastructure正是基础设施的意思)。 - 子类定义的应该跳过的类,默认AbstractAutoProxyCreator的实现直接返回false,即都不应该跳过。 ##### 基础类检测 AbstractAutoProxyCreator.isInfrastructureClass: ```java protected boolean isInfrastructureClass(Class beanClass) { boolean retVal = Advice.class.isAssignableFrom(beanClass) || Pointcut.class.isAssignableFrom(beanClass) || Advisor.class.isAssignableFrom(beanClass) || AopInfrastructureBean.class.isAssignableFrom(beanClass); return retVal; } ``` 可以看出,任何Advice、Pointcut、Advisor、AopInfrastructureBean的子类都被当做Spring实现AOP的基础设施类。 ##### 跳过类检测 即shouldSkip方法。前面提到了,AbstractAutoProxyCreator的默认实现直接返回fasle,这一特性被子类AspectJAwareAdvisorAutoProxyCreator重写: ```java @Override protected boolean shouldSkip(Class beanClass, String beanName) { List candidateAdvisors = findCandidateAdvisors(); for (Advisor advisor : candidateAdvisors) { if (advisor instanceof AspectJPointcutAdvisor) { if (((AbstractAspectJAdvice) advisor.getAdvice()).getAspectName().equals(beanName)) { return true; } } } return super.shouldSkip(beanClass, beanName); } ``` 那么此方法跳过的是谁呢? 其实就是我们通过aop:aspect标签配置的切面,即: ```xml ``` 里的aopAdvice。 从前面的aop:aspect一节中可以知道,Spring对于aop:config的解析其实是把aop:before/after等标签解析成为了AspectJPointcutAdvisor类型的BeanDefinition,而aopAdvice以AbstractAspectJAdvice的类型保存在其中。 所以可以得出结论: **Spring跳过的是适用于当前bean的Advisor的Advice/Aspect对象**。 ###### AOP逻辑 ![AOP逻辑图](images/aop_logic.jpg) 那么Spring又是如何找到适用于当前bean的Advisor的呢? ###### Advisor寻找 关键便是findCandidateAdvisors方法,此方法将逻辑委托给BeanFactoryAdvisorRetrievalHelper.findAdvisorBeans: ```java public List findAdvisorBeans() { String[] advisorNames = null; synchronized (this) { // 结果缓存 advisorNames = this.cachedAdvisorBeanNames; if (advisorNames == null) { // 去容器中寻找 advisorNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors( this.beanFactory, Advisor.class, true, false); this.cachedAdvisorBeanNames = advisorNames; } } if (advisorNames.length == 0) { return new LinkedList(); } List advisors = new LinkedList(); for (String name : advisorNames) { if (isEligibleBean(name)) { if (!this.beanFactory.isCurrentlyInCreation(name)) { advisors.add(this.beanFactory.getBean(name, Advisor.class)); } } } return advisors; } ``` 可以看出,首先是从容器中获取到所有的Advisor示例,然后调用isEligibleBean方法逐一判断Advisor是否适用于当前bean。 ###### 适用性检测 指的便是isEligibleBean方法。最终调用的是AbstractAdvisorAutoProxyCreator的同名方法: ```java protected boolean isEligibleAdvisorBean(String beanName) { return true; } ``` 而AbstractAdvisorAutoProxyCreator的子类AspectJAwareAdvisorAutoProxyCreator并没有覆盖此方法,所以此处会对**容器中所有的Advisor的Advice进行跳过**。 ##### 检测结果缓存 因为postProcessBeforeInstantiation方法会在每个bean初始化之前被调用,所以没有必要每次都真的进行基础类检测和跳过类检测,Spring使用了advisedBeans作为缓存用以提高性能。 #### TargetSource 从源码中可以看出,对于自定义的TargetSource,Spring会立即执行代理子类的创建。Spring的代理其实是针对TargetSource的,其类图: ![TargetSource类图](images/TargetSource.jpg) 关于此接口在此不展开叙述。 ### postProcessAfterInitialization AbstractAutoProxyCreator.postProcessAfterInitialization: ```java @Override public Object postProcessAfterInitialization(Object bean, String beanName) { if (bean != null) { Object cacheKey = getCacheKey(bean.getClass(), beanName); if (!this.earlyProxyReferences.contains(cacheKey)) { return wrapIfNecessary(bean, beanName, cacheKey); } } return bean; } ``` 关键便在于wrapIfNecessary方法: ```java protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) { //自定义TargetSource,已经进行过代理子类生成 if (beanName != null && this.targetSourcedBeans.contains(beanName)) { return bean; } if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) { return bean; } if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) { this.advisedBeans.put(cacheKey, Boolean.FALSE); return bean; } // Create proxy if we have advice. Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null); if (specificInterceptors != DO_NOT_PROXY) { this.advisedBeans.put(cacheKey, Boolean.TRUE); // 创建 Object proxy = createProxy( bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean)); this.proxyTypes.put(cacheKey, proxy.getClass()); return proxy; } this.advisedBeans.put(cacheKey, Boolean.FALSE); return bean; } ``` 可以看出,在此方法的开头又进行了基础类以及跳过类的检测,再次不再赘述。 #### Advisor寻找 即getAdvicesAndAdvisorsForBean方法,这里进行的便是去容器中寻找适用于当前bean的Advisor,最终调用的是 AbstractAdvisorAutoProxyCreator.findEligibleAdvisors: ```java protected List findEligibleAdvisors(Class beanClass, String beanName) { List candidateAdvisors = findCandidateAdvisors(); List eligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName); extendAdvisors(eligibleAdvisors); if (!eligibleAdvisors.isEmpty()) { eligibleAdvisors = sortAdvisors(eligibleAdvisors); } return eligibleAdvisors; } ``` findCandidateAdvisors前面已经说过了。 ##### 适用性判断 findAdvisorsThatCanApply最终调用AopUtils.findAdvisorsThatCanApply: ```java public static List findAdvisorsThatCanApply(List candidateAdvisors, Class clazz) { if (candidateAdvisors.isEmpty()) { return candidateAdvisors; } List eligibleAdvisors = new LinkedList(); for (Advisor candidate : candidateAdvisors) { if (candidate instanceof IntroductionAdvisor && canApply(candidate, clazz)) { eligibleAdvisors.add(candidate); } } boolean hasIntroductions = !eligibleAdvisors.isEmpty(); for (Advisor candidate : candidateAdvisors) { if (candidate instanceof IntroductionAdvisor) { // already processed continue; } if (canApply(candidate, clazz, hasIntroductions)) { eligibleAdvisors.add(candidate); } } return eligibleAdvisors; } ``` 关键在于canApply方法,从源码中可以看出,对于Advisor的判断分为了IntroductionAdvisor以及非IntroductionAdvisor两种情况。 这种分开处理导致了**IntroductionAdvisor在Advisor链中总是位于非IntroductionAdvisor前面**。 canApply(candidate, clazz)其实等价于canApply(candidate, clazz, false): ```java public static boolean canApply(Advisor advisor, Class targetClass, boolean hasIntroductions) { if (advisor instanceof IntroductionAdvisor) { return ((IntroductionAdvisor) advisor).getClassFilter().matches(targetClass); } else if (advisor instanceof PointcutAdvisor) { PointcutAdvisor pca = (PointcutAdvisor) advisor; return canApply(pca.getPointcut(), targetClass, hasIntroductions); } else { // It doesn't have a pointcut so we assume it applies. return true; } } ``` 很明显,对于引入Advisor与其它Advisor是两种不同的判断方式。 ###### 引入 引入的概念在下面aop:scoped-proxy中有提到。因为引入的目的在于动态地向一个类添加另一种功能(接口),所以只要判断给定的类是否是要引入到的类即可。 ###### 其它 AopUtils.canApply: ```java public static boolean canApply(Pointcut pc, Class targetClass, boolean hasIntroductions) { //是否Pointcut可以匹配当前类 if (!pc.getClassFilter().matches(targetClass)) { return false; } MethodMatcher methodMatcher = pc.getMethodMatcher(); //是否Pointcut可以匹配所有方法 if (methodMatcher == MethodMatcher.TRUE) { // No need to iterate the methods if we're matching any method anyway... return true; } IntroductionAwareMethodMatcher introductionAwareMethodMatcher = null; if (methodMatcher instanceof IntroductionAwareMethodMatcher) { introductionAwareMethodMatcher = (IntroductionAwareMethodMatcher) methodMatcher; } Set> classes = new LinkedHashSet> (ClassUtils.getAllInterfacesForClassAsSet(targetClass)); classes.add(targetClass); for (Class clazz : classes) { Method[] methods = ReflectionUtils.getAllDeclaredMethods(clazz); for (Method method : methods) { if ((introductionAwareMethodMatcher != null && introductionAwareMethodMatcher .matches(method, targetClass, hasIntroductions)) || methodMatcher.matches(method, targetClass)) { return true; } } } return false; } ``` Spring的Pointcut由ClassFilter和MethodMatcher两部分组成,其中前者用以判断给定的类是否在Pointcut的匹配范围内,后者用以在ClassFilter匹配满足的情况下判断给定的方法是否在Pointcut匹配的范围内。 从源码中可以看出,如果ClassFilter匹配得到满足并且Pointcut并不能匹配此类的任意方法,便会**用反射的方法获取targetClass(被检测类)的全部方法逐一交由Pointcut的MethodMatcher进行检测**。 关于Pointcut表达式是如何解析及存储的在此不再展开。 ##### Advisor扩展 AbstractAdvisorAutoProxyCreator.extendAdvisors允许子类向Advisor链表中添加自己的Advisor。子类AspectJAwareAdvisorAutoProxyCreator重写了此方法,其逻辑是: 如果Advisor链表中的Advisor含有AspectJ Advice,那么将会把一个ExposeInvocationInterceptor添加到链表的表头,目的在于将MethodInvocation以ThreadLocal的方式暴露给后面所有的Advisor,暂不知道具体的用途。 ##### 排序 即sortAdvisors方法,用于对实现了Ordered接口的Advisor进行排序。 #### 创建 AbstractAutoProxyCreator.createProxy(略去非关键代码): ```java protected Object createProxy( Class beanClass, String beanName, Object[] specificInterceptors, TargetSource targetSource) { ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.copyFrom(this); //将interceptor适配为Advisor Advisor[] advisors = buildAdvisors(beanName, specificInterceptors); for (Advisor advisor : advisors) { proxyFactory.addAdvisor(advisor); } return proxyFactory.getProxy(getProxyClassLoader()); } ``` ##### JDK动态代理 or Cglib 由DefaultAopProxyFactory.createAopProxy方法决定使用何种方式创建代理子类。 ```java @Override public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { Class targetClass = config.getTargetClass(); if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy(config); } return new ObjenesisCglibAopProxy(config); } else { return new JdkDynamicAopProxy(config); } } ``` 逻辑很明显,如果指定了(proxy-target-classs设为true)使用Cglib,那么就会使用Cglib的方式,如果没有指定(或为false),那么先回检测被代理类是否实现了自己的接口,如果实现了,那么就采用JDK动态代理的方式。 ##### JDK动态代理 JdkDynamicAopProxy.getProxy: ```java @Override public Object getProxy(ClassLoader classLoader) { //找到可以用来进行代理的接口 Class[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised, true); //用来代理的接口中是否定义了equals或者是hashCode方法? //结果保存在内部equalsDefined和hashCodeDefined两个成员变量中 findDefinedEqualsAndHashCodeMethods(proxiedInterfaces); return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this); } ``` 可以看出,关键的InvocationHandler参数其实就是JdkDynamicAopProxy自身。 其invoke方法较长,源码就不贴了,下面进行分部分说明。 ###### equals & hashCode 如果被代理类实现了equals或者是hashCode方法,那么生成的代理子类的equals、hashCode方法实际上执行的是JdkDynamicAopProxy相应方法的逻辑。 invoke方法部分源码: ```java if (!this.equalsDefined && AopUtils.isEqualsMethod(method)) { // The target does not implement the equals(Object) method itself. return equals(args[0]); } ``` ###### 链式调用 对于切点方法,比如前面aop:aspect示例配置中的beforeSend ```xml ``` Spring会创建一个MethodInvocation对象对所有相关的Advisor进行链式调用。invoke相关源码: ```java List chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass); invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain); Object retVal = invocation.proceed(); ``` ##### Cglib 同样是对于Advisor的链式调用,不再详细展开。 # aop:scoped-proxy 此配置一般是这样使用: ```xml ``` 对于ref属性,**只会在userManager初始化时注入一次**。这会造成什么问题呢?以session的Scope为例,因为只会注入一次,所以,**userManager引用的始终是同一个userPreferences对象,即使现在可能已经过时了**。此配置便可以使userManager引用的其实是一个对代理的引用,所以可以始终获取到最新的userPreferences。 其作用和注解@ScopedProxy相同。 其解析由ScopedProxyBeanDefinitionDecorator完成,类图: ![ScopedProxyBeanDefinitionDecorator类图](images/ScopedProxyBeanDefinitionDecorator.jpg) ## 解析 ### 入口 从类图可以看出,ScopedProxyBeanDefinitionDecorator和之前的解析器都不同,它的调用入口不同以往: DefaultBeanDefinitionDocumentReader.processBeanDefinition: ```java protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) { BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele); if (bdHolder != null) { // 装饰 bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder); } } ``` BeanDefinitionParserDelegate.decorateIfRequired: ```java public BeanDefinitionHolder decorateIfRequired( Node node, BeanDefinitionHolder originalDef, BeanDefinition containingBd) { String namespaceUri = getNamespaceURI(node); if (!isDefaultNamespace(namespaceUri)) { NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver() .resolve(namespaceUri); if (handler != null) { return handler. decorate(node, originalDef, new ParserContext(this.readerContext, this, containingBd)); } } return originalDef; } ``` 一目了然。 这么做(装饰)的原因就是此标签是用在bean内部的,从decorate的方法签名可以看出,第二个便是父(bean)BeanDefinition,所以叫做装饰。 ### 装饰 ```java @Override public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder definition, ParserContext parserContext) { boolean proxyTargetClass = true; if (node instanceof Element) { Element ele = (Element) node; if (ele.hasAttribute(PROXY_TARGET_CLASS)) { proxyTargetClass = Boolean.valueOf(ele.getAttribute(PROXY_TARGET_CLASS)); } } BeanDefinitionHolder holder = ScopedProxyUtils. createScopedProxy(definition, parserContext.getRegistry(), proxyTargetClass); String targetBeanName = ScopedProxyUtils.getTargetBeanName(definition.getBeanName()); // 空实现 parserContext.getReaderContext().fireComponentRegistered( new BeanComponentDefinition(definition.getBeanDefinition(), targetBeanName)); return holder; } ``` 核心便是createScopedProxy方法,其源码较长,但是这个套路之前见识过了,就是一个偷天换日: 创建一个新的BeanDefinition对象,beanName为被代理的bean的名字,被代理的bean名字为scopedTarget.原名字。被代理的bean扔将被注册到容器中。 新的BeanDefintion的beanClass为ScopedProxyFactoryBean,其类图: ![ScopedProxyFactoryBean类图](images/ScopedProxyFactoryBean.jpg) ## 代理生成 入口便是setBeanFactory方法: ```java @Override public void setBeanFactory(BeanFactory beanFactory) { ConfigurableBeanFactory cbf = (ConfigurableBeanFactory) beanFactory; this.scopedTargetSource.setBeanFactory(beanFactory); ProxyFactory pf = new ProxyFactory(); pf.copyFrom(this); pf.setTargetSource(this.scopedTargetSource); Class beanType = beanFactory.getType(this.targetBeanName); if (!isProxyTargetClass() || beanType.isInterface() || Modifier.isPrivate(beanType.getModifiers())) { // JDK动态代理可用的接口 pf.setInterfaces(ClassUtils.getAllInterfacesForClass(beanType, cbf.getBeanClassLoader())); } // Add an introduction that implements only the methods on ScopedObject. ScopedObject scopedObject = new DefaultScopedObject (cbf, this.scopedTargetSource.getTargetBeanName()); pf.addAdvice(new DelegatingIntroductionInterceptor(scopedObject)); // Add the AopInfrastructureBean marker to indicate that the scoped proxy // itself is not subject to auto-proxying! Only its target bean is. pf.addInterface(AopInfrastructureBean.class); this.proxy = pf.getProxy(cbf.getBeanClassLoader()); } ``` 这个套路上面也见过了。 ### Advisor 核心的拦截逻辑是通过DelegatingIntroductionInterceptor来完成的,其类图: ![DelegatingIntroductionInterceptor类图](images/DelegatingIntroductionInterceptor.jpg) AdvisedSupport.addAdvice方法将其转化为Advisor: ```java @Override public void addAdvice(int pos, Advice advice) throws AopConfigException { if (advice instanceof IntroductionInfo) { // We don't need an IntroductionAdvisor for this kind of introduction: // It's fully self-describing. addAdvisor(pos, new DefaultIntroductionAdvisor(advice, (IntroductionInfo) advice)); } else if (advice instanceof DynamicIntroductionAdvice) { // We need an IntroductionAdvisor for this kind of introduction. } else { addAdvisor(pos, new DefaultPointcutAdvisor(advice)); } } ``` 显然,DelegatingIntroductionInterceptor被包装为DefaultIntroductionAdvisor对象。 DelegatingIntroductionInterceptor到底是个什么东西呢?这其实就引出了Spring的Introduction(引入)概念。 ### 引入 通常意义上的Spring AOP一般是在方法层面上进行逻辑的改变,而引入指的是在不修改类源码的情况下,**直接为一个类添加新的功能**。下面是一个引入使用的例子: [SpringAOP中的IntroductionInterceptor](http://blog.csdn.net/lzghxjt/article/details/51974336) ## 例子 ### 自定义Scope 为了便于测试,我们定义一个生存周期仅仅在于一次调用的Scope,源码: ```java public class OneScope implements Scope { private int index = 0; @Override public Object get(String name, ObjectFactory objectFactory) { System.out.println("get被调用"); return new Student("skywalker-" + (index++), index); } //忽略其它方法 } ``` 将其注册到容器中,有两种方法: - 在代码中: ```java context.getBeanFactory().registerScope("one", new OneScope()); ``` - 配置文件: ```xml ``` ### 配置 此时就可以使用我们自己的Scope了: ```xml ``` ### 测试 执行以下代码: ```java SimpleBean simpleBean = context.getBean(SimpleBean.class); System.out.println(simpleBean.getStudent().getName()); System.out.println(simpleBean.getStudent().getName()); ``` 可以看到以下输出: ```html get被调用 skywalker-0 get被调用 skywalker-1 ``` 可以得出结论: **当调用被代理的bean的方法时才会触发Scoped的语义,只是获得其对象(getStudent)没有效果**。 ## 原理 ### doGetBean 从根本上来说在于AbstractBeanFactory.doGetBean,部分源码: ```java //scope非prototype和Singleton else { String scopeName = mbd.getScope(); final Scope scope = this.scopes.get(scopeName); Object scopedInstance = scope.get(beanName, new ObjectFactory() { @Override public Object getObject() throws BeansException { beforePrototypeCreation(beanName); try { return createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } } }); bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd); } ``` scopes是BeanFactory内部的一个 LinkedHashMap类型的对象。scope.get实际上调用的就是我们的OneSocpe的get方法,没有用到ObjectFactory。 所以,**每调用一次getBean,就会导致一个新的Sudent被创建并返回**。 ### 代理子类 还有一个关键的问题,从上面可以知道SimpleBean内部的student引用其实是一个CGLIB代理子类的对象,那么当调用这个代理对象的相应方法(比如getName)时,是怎样导致Student重新创建(或是getBean被调用)的? ### CallbackFilter & Callback 必须首先理解下CGLIB的这两个概念。 #### Callback **Callback是Cglib所有自定义逻辑(增强)的共同接口**。 其简略类图: ![Callback类图](images/Callback.jpg) #### CallbackFilter **在CGLib回调时可以设置对不同方法执行不同的回调逻辑,或者根本不执行回调。** jdk并不支持这么搞,只支持设置一个InvocationHandler处理(拦截)所有的方法。其类图: ![CallbackFilter类图](images/CallbackFilter.jpg) Cglib的Enhancer可以指定一个Callback数组,而accept方法的返回值是一个int值,其实就是Callback数组的下标,这样便达到了指定回调逻辑的目的。 参考: [CGLIB介绍与原理](http://blog.csdn.net/zghwaicsdn/article/details/50957474) ### 回调 一般的方法使用的是DynamicAdvisedInterceptor作为回调逻辑,其intercept关键源码: ```java @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) { Object target = getTarget(); } ``` target就是被代理对象。 getTarget: ```java protected Object getTarget() throws Exception { return this.advised.getTargetSource().getTarget(); } ``` TargetSource前面说过了,默认是SimpleBeanTargetSource: ```java @Override public Object getTarget() throws Exception { return getBeanFactory().getBean(getTargetBeanName()); } ``` 至此,真相大白。 # aop:aspectj-autoproxy 此标签用以开启对于@AspectJ注解风格AOP的支持。 ## 属性 ### proxy-target-class 你懂的。 ### expose-proxy 是否应该把代理对象暴露给AopContext,默认false。 ## 栗子 ### 切面 ```java @Aspect public class AspectDemo { @Pointcut("execution(void base.aop.AopDemo.send(..))") public void beforeSend() {} @Before("beforeSend()") public void before() { System.out.println("send之前"); } } ``` ### 被代理类 ```java public class AopDemo implements AopDemoInter { public void send() { System.out.println("send from aopdemo"); } public void receive() { System.out.println("receive from aopdemo"); } @Override public void inter() { System.out.println("inter"); } } ``` ### 配置 ```xml ``` 因为AopDemo实现了AopDemoInter接口,但做实验的send方法又不在此接口里定义,所以只能用cglib的方式代理。 可以看出,**即使标注了@Aspect注解,仍然需要将切面自己配置到Spring容器中。** ## 解析 AspectJAutoProxyBeanDefinitionParser.parse: ```java @Override public BeanDefinition parse(Element element, ParserContext parserContext) { AopNamespaceUtils. registerAspectJAnnotationAutoProxyCreatorIfNecessary(parserContext, element); extendBeanDefinition(element, parserContext); return null; } ``` 注册最终在AopConfigUtils.registerOrEscalateApcAsRequired方法中完成,创建器实际上是一个AnnotationAwareAspectJAutoProxyCreator类的对象,此类是前面AspectJAwareAdvisorAutoProxyCreator的子类。 ## 原理 既然是AspectJAwareAdvisorAutoProxyCreator的子类,那么其代理子类的创建等核心逻辑自然是一样的。这里所需要关注的地方自然是所不一样的地方: 即是如何体现其注解的特性的。 前面说过,AspectJAwareAdvisorAutoProxyCreator通过findCandidateAdvisors方法来找到适用于bean的Advisor,所以注解的特性也是通过重写此方法来体现。 AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors: ```java @Override protected List findCandidateAdvisors() { List advisors = super.findCandidateAdvisors(); //这里 advisors.addAll(this.aspectJAdvisorsBuilder.buildAspectJAdvisors()); return advisors; } ``` buildAspectJAdvisors方法所做的便是**从容器中得到所有的bean,逐一判断是不是一个Aspect**。那么判断Aspect的依据是什么? AbstractAspectJAdvisorFactory.isAspect: ```java @Override public boolean isAspect(Class clazz) { return (hasAspectAnnotation(clazz) && !compiledByAjc(clazz)); } ``` 至于其它的实现细节不再探究。 ## 总结 Spring对于AspectJ风格AOP的支持停留在外表(注解)上面,内部的实现仍然是自己的东西。 # 拾遗 ## AOP切面的坑 1. 定义在private方法上的切面不会被执行,这个很容易理解,毕竟子类不能覆盖父类的私有方法。 2. 同一个代理子类内部的方法相互调用不会再次执行切面。 这里以Cglib为例对第二点进行说明,cglib的相关核心组件可以参考前面CallbackFilter & Callback部分。对于配置了一个切面的典型场景,Spring内部的执行流程可总结如下图: ![Cglib调用流程](images/cglib_invocation.png) 核心便是对目标方法的调用上,这里由CglibMethodInvocation的invokeJoinpoint实现: ```java @Override protected Object invokeJoinpoint() throws Throwable { if (this.publicMethod) { return this.methodProxy.invoke(this.target, this.arguments); } else { return super.invokeJoinpoint(); } } ``` 如果是非public方法,那么Spring将使用反射的方法对其进行调用,因为反射将其可访问性设为true。MethodProxy是Cglib对方法代理的抽象,这里的关键是**方法调用的对象(目标)是我们的原生类对象,而不是Cglib代理子类的对象,这就从根本上决定了对同类方法的调用不会再次经过切面**。 ### 总结 前面aop:aspectj-autoproxy-属性-expose-proxy一节提到了,Spring允许我们将代理子类暴露出来,可以进行如下配置: ```xml ``` 当我们需要在一个被代理方法中调用同类的方法时(此方法也需要经过切面),可以这样调用: ```java public void testB() { System.out.println("testB执行"); ((SimpleAopBean) AopContext.currentProxy()).testC(); } ``` 这里其实是一个ThreadLocal,当Cglib代理子类创建调用链之间便会将代理类设置到其中,DynamicAdvisedInterceptor.intercept相关源码: ```java if (this.advised.exposeProxy) { // Make invocation available if necessary. oldProxy = AopContext.setCurrentProxy(proxy); setProxyContext = true; } ``` ================================================ FILE: note/spring-boot.md ================================================ **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* - [SpringApplication](#springapplication) - [web环境检测](#web%E7%8E%AF%E5%A2%83%E6%A3%80%E6%B5%8B) - [ApplicationContextInitializer](#applicationcontextinitializer) - [ApplicationListener](#applicationlistener) - [SpringApplicationRunListener](#springapplicationrunlistener) - [run](#run) - [starting](#starting) - [环境准备](#%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87) - [属性来源](#%E5%B1%9E%E6%80%A7%E6%9D%A5%E6%BA%90) - [profile配置](#profile%E9%85%8D%E7%BD%AE) - [environmentPrepared](#environmentprepared) - [配置文件加载](#%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD) - [SpringApplicationJsonEnvironmentPostProcessor](#springapplicationjsonenvironmentpostprocessor) - [CloudFoundryVcapEnvironmentPostProcessor](#cloudfoundryvcapenvironmentpostprocessor) - [ConfigFileApplicationListener](#configfileapplicationlistener) # SpringApplication 启动程序首先初始化了一个SpringApplication对象。来看一看在它的构造器了发生了什么。 ```java public SpringApplication(ResourceLoader resourceLoader, Object... sources) { this.resourceLoader = resourceLoader; initialize(sources); } ``` initialize方法: ```java private void initialize(Object[] sources) { if (sources != null && sources.length > 0) { this.sources.addAll(Arrays.asList(sources)); } this.webEnvironment = deduceWebEnvironment(); setInitializers((Collection) getSpringFactoriesInstances( ApplicationContextInitializer.class)); setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); this.mainApplicationClass = deduceMainApplicationClass(); } ``` ## web环境检测 deduceWebEnvironment方法用于检测当前是否是web工程环境,检测的标准也很简单,classpath中必须同时存在下面这两个类: - javax.servlet.Servlet - org.springframework.web.context.ConfigurableWebApplicationContext ## ApplicationContextInitializer 下一步便是检测应当使用哪些ApplicationContextInitializer,这货并不是spring-boot的专属,而是定义在context下,这东西是在喜闻乐见的refesh方法执行之前留给我们进行自定义初始化的钩子。典型的使用的场景是注册我们自己的属性来源、设置激活的profile。 在简单的web应用场景下(没有数据库/mybatis),共最终引入了下列的类: ![ApplicationContextInitializer](images/ApplicationContextInitializer.png) 来自于三个jar包: - spring-boot - spring-boot-autoconfigure - spring-beans ## ApplicationListener 这货是典型的观察者模式实现,类图: ![ApplicationListener](images/ApplicationListener.png) 在简单的web应用场景下,系统共初始化了这些监听器: ![ApplicationListener](images/ApplicationListener_used.png) ## SpringApplicationRunListener 就像它长得那样,就是用来监听SpringApplication的run方法的监听器。看看这货用到了哪些实现类: ![SpringApplicationRunListener](images/SpringApplicationRunListener.png) # run 从这一节开始,就进入了SpringApplication的run方法的势力范围。整个方法的流程总结如下图: ![SpringApplication.run](images/spring_application_run.png) ## starting SpringApplicationRunListener其实起一个广播器的作用,将消息广播给ApplicationListener一节初始化的10个Listener中的某几个。 debug可以发现,对启动事件感兴趣的只有LoggingApplicationListener一个。 当LoggingApplicationListener监听到启动事件时,所作的主要工作便是决定采用哪一个日志框架,其判断逻辑如下: - 如果系统变量`org.springframework.boot.logging.LoggingSystem`存在,那么由其决定。 - 依次检测classpath中这些类是否存在: ```java ch.qos.logback.core.Appender; org.apache.logging.log4j.core.impl.Log4jContextFactory; java.util.logging.LogManager; ``` ## 环境准备 相关源码: ```java ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments); ``` Spring里面的Environment到底是个什么东西,详细参考隔壁(Spring.md)Environment接口一节,总结来说,这货就是属性配置来源(比如系统变量)和profile的综合体。 ### 属性来源 在web环境下共初始化了以下4个属性来源: - System.getProperties() - System.getenv() - servlet-context-init-params - servlet-config-init-params 有意思的问题:此时servlet-context-init-params和servlet-config-init-params实际上是一个占位符,无法从这两个来源获得任何真实的属性,等到refresh方法执行时才会被真实的来源替换。 ### profile配置 SpringApplication.configureProfiles方法: ```java protected void configureProfiles(ConfigurableEnvironment environment, String[] args) { environment.getActiveProfiles(); // ensure they are initialized // But these ones should go first (last wins in a property key clash) // 默认空 Set profiles = new LinkedHashSet(this.additionalProfiles); profiles.addAll(Arrays.asList(environment.getActiveProfiles())); environment.setActiveProfiles(profiles.toArray(new String[profiles.size()])); } ``` active profile取自上一节中的属性来源,key为`spring.profiles.active`. ## environmentPrepared ### 配置文件加载 监听器ConfigFileApplicationListener负责spring-boot配置文件的加载,ConfigFileApplicationListener默认会从以下的位置搜索配置文件: 1. classpath下的application.properties或application.yml 2. file:./下的application.properties或application.yml 3. classpath:config目录下的application.properties或application.yml 4. file:./config目录下的application.properties或application.yml 此监听器是如何加载的?源码: ```java private void onApplicationEnvironmentPreparedEvent(ApplicationEnvironmentPreparedEvent event) { List postProcessors = loadPostProcessors(); postProcessors.add(this); AnnotationAwareOrderComparator.sort(postProcessors); for (EnvironmentPostProcessor postProcessor : postProcessors) { postProcessor.postProcessEnvironment(event.getEnvironment(), event.getSpringApplication()); } } ``` 显然核心的加载操作是通过EnvironmentPostProcessor接口实现的,此接口允许我们在context刷新之前自定义配置加载,并且Spring推荐此接口的实现类同时实现Ordered接口。类图: ![EnvironmentPostProcessor](images/EnvironmentPostProcessor.png) 加上ConfigFileApplicationListener自己,spring-boot默认共初始化了三个加载器,其它两个是SpringApplicationJsonEnvironmentPostProcessor和CloudFoundryVcapEnvironmentPostProcessor,下面按照其优先级顺序进行说明。 #### SpringApplicationJsonEnvironmentPostProcessor 尝试读取spring.application.json或SPRING_APPLICATION_JSON系统指定的json配置文件,从这里加载的配置具有最高的优先级,当然,默认是没有的。 #### CloudFoundryVcapEnvironmentPostProcessor 从Cloud Foundry加载配置,这是什么东西问度娘。 #### ConfigFileApplicationListener 这里就是加载配置文件加载一节所说的配置文件的过程。 TODO: 多profile配置文件加载 ================================================ FILE: note/spring-boot.uml ================================================ spring-boot 1 classes qZA94hFdS0SLO4Ma0W4NXAAA 2 SpringApplicationRunListener 69VGSXSIBUW7p8ufeBl/9gAA /njh2Q/xeUGIf6Vw8nEdJAAA 1 clMaroon $00B9FFFF 508 96 177 59 sdkNone 4NdjgA17bE2i/3g5wzvqpwAA 1 SpringApplicationRunListener <<interface>> False False 4NdjgA17bE2i/3g5wzvqpwAA 4NdjgA17bE2i/3g5wzvqpwAA EnvironmentPostProcessor 69VGSXSIBUW7p8ufeBl/9gAA qm+rHb6SNkqLBiTGk7pzbwAA 11 clMaroon $00B9FFFF 576 68 494 59 sdkNone yKVxOflA2UaI4FHsb8TGJQAA 1 EnvironmentPostProcessor <<interface>> False False yKVxOflA2UaI4FHsb8TGJQAA yKVxOflA2UaI4FHsb8TGJQAA clMaroon $00B9FFFF 232 236 267 43 jCjCGZgJxk+c3RZE5Qq57gAA 1 CloudFoundryVcapEnvironmentPostProcessor False False jCjCGZgJxk+c3RZE5Qq57gAA jCjCGZgJxk+c3RZE5Qq57gAA False jCjCGZgJxk+c3RZE5Qq57gAA clMaroon $00B9FFFF 619 236 288 43 W0cRRKVVBkCp+2Q9SH3UxgAA 1 SpringApplicationJsonEnvironmentPostProcessor False False W0cRRKVVBkCp+2Q9SH3UxgAA W0cRRKVVBkCp+2Q9SH3UxgAA False W0cRRKVVBkCp+2Q9SH3UxgAA clMaroon $00B9FFFF 1027 236 173 43 Vw0ZAZppPEm7AlpNNggtGgAA 1 ConfigFileApplicationListener False False Vw0ZAZppPEm7AlpNNggtGgAA Vw0ZAZppPEm7AlpNNggtGgAA False Vw0ZAZppPEm7AlpNNggtGgAA clMaroon $00B9FFFF 360 68 86 59 sdkNone 7GxYzq4AIkizabw6oPygqQAA 1 Ordered <<interface>> False False 7GxYzq4AIkizabw6oPygqQAA 7GxYzq4AIkizabw6oPygqQAA clMaroon $00B9FFFF 370,236;395,126 4SbHHRophkuTs8QFsOr8fQAA +k8WnQ0zkEC8VT9QQz9+OgAA P6KG9fgsi06u+3WM6dvcmwAA False 1.5707963267949 15 4SbHHRophkuTs8QFsOr8fQAA False 1.5707963267949 30 4SbHHRophkuTs8QFsOr8fQAA False -1.5707963267949 15 4SbHHRophkuTs8QFsOr8fQAA clMaroon $00B9FFFF 425,236;739,126 yYUBNggzPUG/3YZMjF72QQAA lqFX6n755k6Hba7ST1jy1wAA P6KG9fgsi06u+3WM6dvcmwAA False 1.5707963267949 15 yYUBNggzPUG/3YZMjF72QQAA False 1.5707963267949 30 yYUBNggzPUG/3YZMjF72QQAA False -1.5707963267949 15 yYUBNggzPUG/3YZMjF72QQAA clMaroon $00B9FFFF 715,236;445,116 sdi/nrb10kCJ64hqARaXWAAA +k8WnQ0zkEC8VT9QQz9+OgAA E4P16TqYkUG2+qH+WaJtbwAA False 1.5707963267949 15 sdi/nrb10kCJ64hqARaXWAAA False 1.5707963267949 30 sdi/nrb10kCJ64hqARaXWAAA False -1.5707963267949 15 sdi/nrb10kCJ64hqARaXWAAA clMaroon $00B9FFFF 770,236;811,126 fzumzPlz/0iBgpfrrvOhJQAA lqFX6n755k6Hba7ST1jy1wAA E4P16TqYkUG2+qH+WaJtbwAA False 1.5707963267949 15 fzumzPlz/0iBgpfrrvOhJQAA False 1.5707963267949 30 fzumzPlz/0iBgpfrrvOhJQAA False -1.5707963267949 15 fzumzPlz/0iBgpfrrvOhJQAA clMaroon $00B9FFFF 1027,238;445,107 rG+WOaqFYkG6GXUZeUtgRAAA +k8WnQ0zkEC8VT9QQz9+OgAA 3yHZR7jfDUqU/q5rcoobfgAA False 1.5707963267949 15 rG+WOaqFYkG6GXUZeUtgRAAA False 1.5707963267949 30 rG+WOaqFYkG6GXUZeUtgRAAA False -1.5707963267949 15 rG+WOaqFYkG6GXUZeUtgRAAA clMaroon $00B9FFFF 1075,236;875,126 WvChNZk63UG/CiWuRWPIIwAA lqFX6n755k6Hba7ST1jy1wAA 3yHZR7jfDUqU/q5rcoobfgAA False 1.5707963267949 15 WvChNZk63UG/CiWuRWPIIwAA False 1.5707963267949 30 WvChNZk63UG/CiWuRWPIIwAA False -1.5707963267949 15 WvChNZk63UG/CiWuRWPIIwAA 12 SpringApplicationRunListener 69VGSXSIBUW7p8ufeBl/9gAA 3 7pos0T+U7062k2pRb9krYQAA vZkbhaFErUiZYOVv+9sHpwAA 030TeKKn3EuzD7i4zkelCQAA 1 void starting 4NdjgA17bE2i/3g5wzvqpwAA EnvironmentPostProcessor 69VGSXSIBUW7p8ufeBl/9gAA 3 lqFX6n755k6Hba7ST1jy1wAA XWuGtHMimECYIFoc8Id7dAAA PuXfMWbnrkmQIc3bXK6+QwAA 3 yYUBNggzPUG/3YZMjF72QQAA fzumzPlz/0iBgpfrrvOhJQAA WvChNZk63UG/CiWuRWPIIwAA 1 void postProcessEnvironment yKVxOflA2UaI4FHsb8TGJQAA 2 ConfigurableEnvironment environment bqCtvisSyEimrYDDokeTzAAA SpringApplication application bqCtvisSyEimrYDDokeTzAAA CloudFoundryVcapEnvironmentPostProcessor 69VGSXSIBUW7p8ufeBl/9gAA 4 P6KG9fgsi06u+3WM6dvcmwAA fwYEhFbAhUW3txmAgc6qEgAA XgsnnzJS3kOgNGcfKe2LEAAA 7HVPFqKJv0OTq86odgxmrAAA 2 4SbHHRophkuTs8QFsOr8fQAA yYUBNggzPUG/3YZMjF72QQAA SpringApplicationJsonEnvironmentPostProcessor 69VGSXSIBUW7p8ufeBl/9gAA 4 E4P16TqYkUG2+qH+WaJtbwAA HAwEJWdWF0eLnSxluskdBAAA QFvkquiBMUiXeeNJe0VS3QAA P6UaJPEPAE6fmOFcWEi3iwAA 2 sdi/nrb10kCJ64hqARaXWAAA fzumzPlz/0iBgpfrrvOhJQAA ConfigFileApplicationListener 69VGSXSIBUW7p8ufeBl/9gAA 4 3yHZR7jfDUqU/q5rcoobfgAA sdZbRO+xb0uDTPgTM6Lz+gAA KMRwxm47bUyte4AAmIEBnAAA Mvw1MqFvQUW8zi2QVAw1/wAA 2 rG+WOaqFYkG6GXUZeUtgRAAA WvChNZk63UG/CiWuRWPIIwAA Ordered 69VGSXSIBUW7p8ufeBl/9gAA 3 +k8WnQ0zkEC8VT9QQz9+OgAA qEDeKjCCC021n71FXBamZgAA MSfclWLhBEit3GHQJwf2+wAA 3 4SbHHRophkuTs8QFsOr8fQAA sdi/nrb10kCJ64hqARaXWAAA rG+WOaqFYkG6GXUZeUtgRAAA 1 int getOrder 7GxYzq4AIkizabw6oPygqQAA 69VGSXSIBUW7p8ufeBl/9gAA jCjCGZgJxk+c3RZE5Qq57gAA 7GxYzq4AIkizabw6oPygqQAA 4 64DFsXJ9JEeMUdpHsp+BugAA y4EYtuEhC0ejkpIFceijzwAA ZqEP5ycHu0aULbvZeaAu5wAA QZ3NELwfEEOEgDHx4Ad/0AAA 69VGSXSIBUW7p8ufeBl/9gAA jCjCGZgJxk+c3RZE5Qq57gAA yKVxOflA2UaI4FHsb8TGJQAA 4 eMyi+V4XhU+fT2JcvxNy4gAA 0mI/GAzW3U2+8VVBXIA5cgAA MpO/Kw7VvkyRo4J+uIMuMQAA Fu8EySBCT0+2rffldBqC+AAA 69VGSXSIBUW7p8ufeBl/9gAA W0cRRKVVBkCp+2Q9SH3UxgAA 7GxYzq4AIkizabw6oPygqQAA 4 3KueoVb0B0GJo5g0vX1NwAAA cY+m06Faz0atMYj13QVUYAAA yGAvTLcEFkCW/6F7LIIqzwAA 4nqMprd7tk6rMmDSKpyW7wAA 69VGSXSIBUW7p8ufeBl/9gAA W0cRRKVVBkCp+2Q9SH3UxgAA yKVxOflA2UaI4FHsb8TGJQAA 4 HEBTMl5oFUifogqi0PAFVwAA vvwUyIq6CEaFxWnsUq45aQAA 91vML38v0km69tVVLw1gOAAA oJZMrIQ9EEieSvWnR8uABQAA 69VGSXSIBUW7p8ufeBl/9gAA Vw0ZAZppPEm7AlpNNggtGgAA 7GxYzq4AIkizabw6oPygqQAA 4 LM843eYjt0C96pmFrb1MDgAA lxiHS0IIwEGS3Qvj/RsQWAAA 1evGo2PIFE2NlPSch++0xAAA uabWPM723027n3XYs7lbtgAA 69VGSXSIBUW7p8ufeBl/9gAA Vw0ZAZppPEm7AlpNNggtGgAA yKVxOflA2UaI4FHsb8TGJQAA 4 EmKsh5dzpEicXS/RjKzVjwAA DfiAwKtWlEiz8tMZurmB4wAA JG6V5rxzlEyDNR1rZluiMQAA eQzpRi6zz02EOalo8lsBVgAA ================================================ FILE: note/spring-context.md ================================================ **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* - [开头](#%E5%BC%80%E5%A4%B4) - [annotation-config](#annotation-config) - [BeanPostProcessor注册](#beanpostprocessor%E6%B3%A8%E5%86%8C) - [AnnotationAwareOrderComparator](#annotationawareordercomparator) - [ContextAnnotationAutowireCandidateResolver](#contextannotationautowirecandidateresolver) - [ConfigurationClassPostProcessor](#configurationclasspostprocessor) - [AutowiredAnnotationBeanPostProcessor](#autowiredannotationbeanpostprocessor) - [RequiredAnnotationBeanPostProcessor](#requiredannotationbeanpostprocessor) - [CommonAnnotationBeanPostProcessor](#commonannotationbeanpostprocessor) - [PersistenceAnnotationBeanPostProcessor](#persistenceannotationbeanpostprocessor) - [EventListenerMethodProcessor](#eventlistenermethodprocessor) - [DefaultEventListenerFactory](#defaulteventlistenerfactory) - [逻辑关系整理](#%E9%80%BB%E8%BE%91%E5%85%B3%E7%B3%BB%E6%95%B4%E7%90%86) - [运行](#%E8%BF%90%E8%A1%8C) - [ConfigurationClassPostProcessor](#configurationclasspostprocessor-1) - [postProcessBeanDefinitionRegistry](#postprocessbeandefinitionregistry) - [BeanPostProcessor注册](#beanpostprocessor%E6%B3%A8%E5%86%8C-1) - [ImportAwareBeanPostProcessor](#importawarebeanpostprocessor) - [EnhancedConfigurationBeanPostProcessor](#enhancedconfigurationbeanpostprocessor) - [类解析](#%E7%B1%BB%E8%A7%A3%E6%9E%90) - [bean名字生成策略](#bean%E5%90%8D%E5%AD%97%E7%94%9F%E6%88%90%E7%AD%96%E7%95%A5) - [postProcessBeanFactory](#postprocessbeanfactory) - [AutowiredAnnotationBeanPostProcessor](#autowiredannotationbeanpostprocessor-1) - [postProcessMergedBeanDefinition](#postprocessmergedbeandefinition) - [入口](#%E5%85%A5%E5%8F%A3) - [源码](#%E6%BA%90%E7%A0%81) - [变量扫描](#%E5%8F%98%E9%87%8F%E6%89%AB%E6%8F%8F) - [方法扫描](#%E6%96%B9%E6%B3%95%E6%89%AB%E6%8F%8F) - [bridge方法](#bridge%E6%96%B9%E6%B3%95) - [PropertyDescriptor](#propertydescriptor) - [postProcessPropertyValues](#postprocesspropertyvalues) - [入口](#%E5%85%A5%E5%8F%A3-1) - [注入](#%E6%B3%A8%E5%85%A5) - [Field注入](#field%E6%B3%A8%E5%85%A5) - [方法注入](#%E6%96%B9%E6%B3%95%E6%B3%A8%E5%85%A5) - [RequiredAnnotationBeanPostProcessor](#requiredannotationbeanpostprocessor-1) - [postProcessMergedBeanDefinition](#postprocessmergedbeandefinition-1) - [postProcessPropertyValues](#postprocesspropertyvalues-1) - [结果缓存](#%E7%BB%93%E6%9E%9C%E7%BC%93%E5%AD%98) - [PropertyDescriptor](#propertydescriptor-1) - [测试](#%E6%B5%8B%E8%AF%95) - [CommonAnnotationBeanPostProcessor](#commonannotationbeanpostprocessor-1) - [postProcessMergedBeanDefinition](#postprocessmergedbeandefinition-2) - [父类](#%E7%88%B6%E7%B1%BB) - [子类](#%E5%AD%90%E7%B1%BB) - [postProcessPropertyValues](#postprocesspropertyvalues-2) - [postProcessBeforeInitialization](#postprocessbeforeinitialization) - [postProcessBeforeDestruction](#postprocessbeforedestruction) - [EventListenerMethodProcessor](#eventlistenermethodprocessor-1) - [入口](#%E5%85%A5%E5%8F%A3-2) - [源码](#%E6%BA%90%E7%A0%81-1) - [component-scan](#component-scan) - [初始化](#%E5%88%9D%E5%A7%8B%E5%8C%96) - [use-default-filters](#use-default-filters) - [扫描器:创建 & 初始化](#%E6%89%AB%E6%8F%8F%E5%99%A8%E5%88%9B%E5%BB%BA--%E5%88%9D%E5%A7%8B%E5%8C%96) - [resource-pattern](#resource-pattern) - [name-generator](#name-generator) - [scope-resolver](#scope-resolver) - [scoped-proxy](#scoped-proxy) - [exclude-filter/include-filter](#exclude-filterinclude-filter) - [annotation-config](#annotation-config-1) - [扫描](#%E6%89%AB%E6%8F%8F) - [逐包扫描/BeanDefinition解析](#%E9%80%90%E5%8C%85%E6%89%AB%E6%8F%8Fbeandefinition%E8%A7%A3%E6%9E%90) - [@Scope解析](#scope%E8%A7%A3%E6%9E%90) - [bean名字生成](#bean%E5%90%8D%E5%AD%97%E7%94%9F%E6%88%90) - [根据注解](#%E6%A0%B9%E6%8D%AE%E6%B3%A8%E8%A7%A3) - [默认策略](#%E9%BB%98%E8%AE%A4%E7%AD%96%E7%95%A5) - [其它注解解析](#%E5%85%B6%E5%AE%83%E6%B3%A8%E8%A7%A3%E8%A7%A3%E6%9E%90) - [冲突检测](#%E5%86%B2%E7%AA%81%E6%A3%80%E6%B5%8B) - [代理生成](#%E4%BB%A3%E7%90%86%E7%94%9F%E6%88%90) - [BeanDefinition注册](#beandefinition%E6%B3%A8%E5%86%8C) - [Component注册](#component%E6%B3%A8%E5%86%8C) - [property-override](#property-override) - [作用](#%E4%BD%9C%E7%94%A8) - [类图](#%E7%B1%BB%E5%9B%BE) - [解析](#%E8%A7%A3%E6%9E%90) - [properties-ref](#properties-ref) - [order](#order) - [ignore-resource-not-found](#ignore-resource-not-found) - [ignore-unresolvable](#ignore-unresolvable) - [local-override](#local-override) - [BeanDefinition](#beandefinition) - [运行](#%E8%BF%90%E8%A1%8C-1) - [属性加载](#%E5%B1%9E%E6%80%A7%E5%8A%A0%E8%BD%BD) - [属性转换](#%E5%B1%9E%E6%80%A7%E8%BD%AC%E6%8D%A2) - [属性设置](#%E5%B1%9E%E6%80%A7%E8%AE%BE%E7%BD%AE) - [property-placeholder](#property-placeholder) - [解析](#%E8%A7%A3%E6%9E%90-1) - [system-properties-mode](#system-properties-mode) - [value-separator](#value-separator) - [null-value](#null-value) - [trim-values](#trim-values) - [BeanDefinition](#beandefinition-1) - [运行](#%E8%BF%90%E8%A1%8C-2) - [处理](#%E5%A4%84%E7%90%86) - [load-time-weaver & spring-configured](#load-time-weaver--spring-configured) - [javaagent](#javaagent) - [解析](#%E8%A7%A3%E6%9E%90-2) - [LoadTimeWeaver](#loadtimeweaver) - [LoadTimeWeaverBeanDefinitionParser](#loadtimeweaverbeandefinitionparser) - [aspectj-weaving](#aspectj-weaving) - [是否开启](#%E6%98%AF%E5%90%A6%E5%BC%80%E5%90%AF) - [AspectJWeavingEnabler](#aspectjweavingenabler) - [SpringConfiguredBeanDefinitionParser](#springconfiguredbeandefinitionparser) - [切点(pointcut)](#%E5%88%87%E7%82%B9pointcut) - [inConfigurableBean](#inconfigurablebean) - [beanConstruction](#beanconstruction) - [preConstructionCondition](#preconstructioncondition) - [leastSpecificSuperTypeConstruction](#leastspecificsupertypeconstruction) - [preConstructionConfiguration](#preconstructionconfiguration) - [postConstructionCondition](#postconstructioncondition) - [advise](#advise) - [前置](#%E5%89%8D%E7%BD%AE) - [运行](#%E8%BF%90%E8%A1%8C-3) - [LoadTimeWeaverAware](#loadtimeweaveraware) - [BeanClassLoaderAware](#beanclassloaderaware) - [入口](#%E5%85%A5%E5%8F%A3-3) - [setBeanClassLoader](#setbeanclassloader) - [服务器agent](#%E6%9C%8D%E5%8A%A1%E5%99%A8agent) - [Spring agent](#spring-agent) - [反射](#%E5%8F%8D%E5%B0%84) - [总结](#%E6%80%BB%E7%BB%93) - [ClassFileTransformer](#classfiletransformer) - [Aj](#aj) - [缓存](#%E7%BC%93%E5%AD%98) - [WeavingAdaptor初始化](#weavingadaptor%E5%88%9D%E5%A7%8B%E5%8C%96) - [aop.xml](#aopxml) - [解析](#%E8%A7%A3%E6%9E%90-3) - [注册](#%E6%B3%A8%E5%86%8C) - [总结](#%E6%80%BB%E7%BB%93-1) # 开头 入口方法在BeanDefinitionParserDelegate.parseCustomElement: ```java return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd)); ``` parse方法由各种NamespaceHandler的父类NamespaceHandlerSupport实现: ```java @Override public BeanDefinition parse(Element element, ParserContext parserContext) { return findParserForElement(element, parserContext).parse(element, parserContext); } ``` findParserForElement方法用以寻找适用于此元素的BeanDefinitionParser对象: ```java private BeanDefinitionParser findParserForElement(Element element, ParserContext parserContext) { String localName = parserContext.getDelegate().getLocalName(element); BeanDefinitionParser parser = this.parsers.get(localName); if (parser == null) { parserContext.getReaderContext().fatal( "Cannot locate BeanDefinitionParser for element [" + localName + "]", element); } return parser; } ``` localName是个什么东西呢,比如对于context:annotation-config标签就是annotation-config。 # annotation-config AnnotationConfigBeanDefinitionParser.parse: ```java @Override public BeanDefinition parse(Element element, ParserContext parserContext) { //返回null Object source = parserContext.extractSource(element); // Obtain bean definitions for all relevant BeanPostProcessors. Set processorDefinitions = AnnotationConfigUtils. registerAnnotationConfigProcessors(parserContext.getRegistry(), source); // Register component for the surrounding element. CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source); parserContext.pushContainingComponent(compDefinition); // Nest the concrete beans in the surrounding component. for (BeanDefinitionHolder processorDefinition : processorDefinitions) { parserContext.registerComponent(new BeanComponentDefinition(processorDefinition)); } // Finally register the composite component. // 空实现 parserContext.popAndRegisterContainingComponent(); return null; } ``` ## BeanPostProcessor注册 AnnotationConfigUtils.registerAnnotationConfigProcessors源码: ```java //第一个参数其实就是DefaultListableBeanFactory,第二个参数为null public static Set registerAnnotationConfigProcessors( BeanDefinitionRegistry registry, Object source) { //将registery强转为DefaultListableBeanFactory类型 DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry); if (beanFactory != null) { if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) { beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE); } if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) { beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver()); } } Set beanDefs = new LinkedHashSet(4); if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) { RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class); def.setSource(source); beanDefs.add(registerPostProcessor(registry, def,CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)); } if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) { RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class); def.setSource(source); beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)); } if (!registry.containsBeanDefinition(REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) { RootBeanDefinition def = new RootBeanDefinition(RequiredAnnotationBeanPostProcessor.class); def.setSource(source); beanDefs.add(registerPostProcessor(registry, def, REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME)); } // Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor. if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) { RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class); def.setSource(source); beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)); } // Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor. if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) { RootBeanDefinition def = new RootBeanDefinition(); def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, AnnotationConfigUtils.class.getClassLoader())); def.setSource(source); beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)); } if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) { RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class); def.setSource(source); beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME)); } if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) { RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class); def.setSource(source); beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME)); } return beanDefs; } ``` ### AnnotationAwareOrderComparator 其继承体系如下: ![Comparator继承体系](images/Comparator.jpg) 其作用是比较标注了@Order或是javax.annotation.Priority @Priority注解的元素的优先级。这两种注解的一个常用功能就是设置配置加载的优先级。例子可以参考: [Spring 4.2新特性-使用@Order调整配置类加载顺序](http://www.tuicool.com/articles/VnqUv2) ### ContextAnnotationAutowireCandidateResolver 此类用以决定一个bean是否可以当作一个依赖的候选者。其类图: ![ContextAnnotationAutowireCandidateResolver类图](images/ContextAnnotationAutowireCandidateResolver.jpg) ### ConfigurationClassPostProcessor 此类用于处理标注了@Configuration注解的类。类图: ![ConfigurationClassPostProcessor类图](images/ConfigurationClassPostProcessor.jpg) ### AutowiredAnnotationBeanPostProcessor 此类便用于对标注了@Autowire等注解的bean或是方法进行注入。 ![AutowiredAnnotationBeanPostProcessor类图](images/AutowiredAnnotationBeanPostProcessor.jpg) ### RequiredAnnotationBeanPostProcessor 对应Spring @Require注解,此注解被用在setter方法上,意味着此setter方法对应的属性必须被Spring所注入,但是不会检查是否是null。其继承体系和上面的AutowiredAnnotationBeanPostProcessor完全一样。 ### CommonAnnotationBeanPostProcessor 用于开启对JSR-250的支持,开启的先决条件是当前classpath中有其类,检测的源码: ```java private static final boolean jsr250Present = ClassUtils.isPresent("javax.annotation.Resource", AnnotationConfigUtils.class.getClassLoader()); ``` 此注解就在rt.jar下,所以默认情况下都是开启JSR-250支持的,所以我们就可以使用喜闻乐见的@Resource注解了。其类图: ![CommonAnnotationBeanPostProcessor类图](images/CommonAnnotationBeanPostProcessor.jpg) ### PersistenceAnnotationBeanPostProcessor 用于提供JPA支持,开启的先决条件仍然是检测classpath下是否有其类存在,源码: ```java private static final boolean jpaPresent = ClassUtils.isPresent("javax.persistence.EntityManagerFactory", AnnotationConfigUtils.class.getClassLoader()) && //org.springframework.orm包 ClassUtils.isPresent(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, AnnotationConfigUtils.class.getClassLoader()); ``` rt.jar下面并没有JPA的包,所以此Processor默认是没有被注册的。其类图和上面CommonAnnotationBeanPostProcessor如出一辙。 ### EventListenerMethodProcessor 提供对于注解@EventListener的支持,此注解在Spring4.2被添加,用于监听ApplicationEvent事件。其继承体系: ![EventListenerMethodProcessor类图](images/EventListenerMethodProcessor.jpg) ### DefaultEventListenerFactory 此类应该是和上面的配合使用,用以产生EventListener对象,也是从Spring4.2加入,类图: ![DefaultEventListenerFactory类图](images/DefaultEventListenerFactory.jpg) ## 逻辑关系整理 普通的bean元素(XML)其实都有一个BeanDefinition对象与之对应,但是对于context开头的这种的特殊的元素,它所对应的一般不再是普通意义上的BeanDefinition,而是配合起来一起完成某种功能的组件(比如各种BeanPostProcessor)。这种组件Spring抽象成为ComponentDefinition接口,组件的集合表示成为CompositeComponentDefinition,类图: ![CompositeComponentDefinition类图](images/CompositeComponentDefinition.jpg) 最终形成的数据结构如下图: ![数据结构](images/context_annotation_stack.png) 不过这个数据结构貌似也没什么用,因为调用的是XmlBeanDefinitionReader中的eventListener的componentRegistered方法,然而这里的eventListener是EmptyReaderEventListener,也就是空实现。 ## 运行 ### ConfigurationClassPostProcessor 本身是一个BeanFactoryPostProcessor对象,其执行入口在AbstractApplicationContext.refresh方法: ```java invokeBeanFactoryPostProcessors(beanFactory); ``` 注意,因为ConfigurationClassPostProcessor实现自BeanDefinitionRegistryPostProcessor接口,所以在此处会首先调用其postProcessBeanDefinitionRegistry方法,再调用其postProcessBeanFactory方法。 #### postProcessBeanDefinitionRegistry 此方法大体由两部分组成。 ##### BeanPostProcessor注册 此部分源码: ```java @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { RootBeanDefinition iabpp = new RootBeanDefinition(ImportAwareBeanPostProcessor.class); iabpp.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); registry.registerBeanDefinition(IMPORT_AWARE_PROCESSOR_BEAN_NAME, iabpp); RootBeanDefinition ecbpp = new RootBeanDefinition(EnhancedConfigurationBeanPostProcessor.class); ecbpp.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); registry.registerBeanDefinition(ENHANCED_CONFIGURATION_PROCESSOR_BEAN_NAME, ecbpp); } ``` ###### ImportAwareBeanPostProcessor 是ConfigurationClassPostProcessor的私有内部类。其类图: ![ImportAwareBeanPostProcessor类图](images/ImportAwareBeanPostProcessor.jpg) 此类用于处理实现了ImportAware接口的类。ImportAware接口是做什么的要从使用java源文件作为Spring配置说起: 有一个类负责生成Student bean: ```java @Configuration public class StudentConfig implements ImportAware { @Bean public Student student() { Student student = new Student(); student.setAge(22); student.setName("skywalker"); return student; } @Override public void setImportMetadata(AnnotationMetadata importMetadata) { System.out.println("importaware"); } } ``` 生成的bean就以所在的方法名命名。还有一个类负责生成SimpleBean: ```java @Configuration @Import(StudentConfig.class) public class SimpleBeanConfig { @Autowired private StudentConfig studentConfig; @Bean public SimpleBean getSimpleBean() { //bean依赖 SimpleBean simpleBean = new SimpleBean(studentConfig.student()); return simpleBean; } } ``` 启动代码: ```java public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SimpleBeanConfig.class); SimpleBean simpleBean = context.getBean(SimpleBean.class); System.out.println(simpleBean.getStudent().getName()); } ``` 所以ImportAware接口的作用就是**使被引用的配置类可以获得引用类的相关信息**。 ###### EnhancedConfigurationBeanPostProcessor 用于为实现了EnhancedConfiguration接口的类设置BeanFactory对象,所有的@Configuration Cglib子类均实现了此接口,为什么要这么做不太明白。 ##### 类解析 这里便是对标注了@Configuration注解的类及进行解析,通过调用ConfigurationClassPostProcessor的processConfigBeanDefinitions方法来实现,具体怎么解析就不详细说明了。 ###### bean名字生成策略 对于配置类,Spring也会将其当作一个bean放到容器中,这就关系到bean的起名了,其实这部分对于@Component, @Controller等注解都是一样的。 ConfigurationClassPostProcessor.processConfigBeanDefinitions相关代码: ```java // Detect any custom bean name generation strategy supplied through the enclosing application context SingletonBeanRegistry singletonRegistry = null; if (registry instanceof SingletonBeanRegistry) { singletonRegistry = (SingletonBeanRegistry) registry; if (!this.localBeanNameGeneratorSet && //org.springframework.context.annotation.internalConfigurationBeanNameGenerator singletonRegistry.containsSingleton(CONFIGURATION_BEAN_NAME_GENERATOR)) { BeanNameGenerator generator = (BeanNameGenerator) singletonRegistry. getSingleton(CONFIGURATION_BEAN_NAME_GENERATOR); this.componentScanBeanNameGenerator = generator; this.importBeanNameGenerator = generator; } } ``` 默认是一个AnnotationBeanNameGenerator对象,其类图: ![BeanNameGenerator类图](images/BeanNameGenerator.jpg) 那我们可以通过向Spring容器添加一个自定义BeanNameGenerator对象的方式自定义beanName生成策略吗,答案是不可以,这也是为什么此bean的ID前面以internal开头。从代码上来看,不可以的原因在于BeanFactoryPostProcessor的触发时机: **配置解析、BeanDefinition加载之后,Singleton初始化之前**,所以即使配置了此接口的实现,但是此时此bean尚未初始化,所以根本看不到此实例。 #### postProcessBeanFactory 此方法调用了enhanceConfigurationClasses,其实就是将@Configuration的beanClass转换为CGLIB代理子类。简略版的源码: ```java public void enhanceConfigurationClasses(ConfigurableListableBeanFactory beanFactory) { Map configBeanDefs = new LinkedHashMap(); //寻找@Configuration的BeanDefinition for (String beanName : beanFactory.getBeanDefinitionNames()) { BeanDefinition beanDef = beanFactory.getBeanDefinition(beanName); if (ConfigurationClassUtils.isFullConfigurationClass(beanDef)) { configBeanDefs.put(beanName, (AbstractBeanDefinition) beanDef); } } if (configBeanDefs.isEmpty()) { // nothing to enhance -> return immediately return; } ConfigurationClassEnhancer enhancer = new ConfigurationClassEnhancer(); for (Map.Entry entry : configBeanDefs.entrySet()) { AbstractBeanDefinition beanDef = entry.getValue(); // If a @Configuration class gets proxied, always proxy the target class beanDef.setAttribute(AutoProxyUtils.PRESERVE_TARGET_CLASS_ATTRIBUTE, Boolean.TRUE); // Set enhanced subclass of the user-specified bean class Class configClass = beanDef.resolveBeanClass(this.beanClassLoader); Class enhancedClass = enhancer.enhance(configClass, this.beanClassLoader); if (configClass != enhancedClass) { //替换 beanDef.setBeanClass(enhancedClass); } } } ``` ConfigurationClassEnhancer.newEnhancer: ```java private Enhancer newEnhancer(Class superclass, ClassLoader classLoader) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(superclass); //这里印证了前面EnhancedConfigurationBeanPostProcessor的说明 enhancer.setInterfaces(new Class[] {EnhancedConfiguration.class}); enhancer.setUseFactory(false); enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE); enhancer.setStrategy(new BeanFactoryAwareGeneratorStrategy(classLoader)); //关键 enhancer.setCallbackFilter(CALLBACK_FILTER); enhancer.setCallbackTypes(CALLBACK_FILTER.getCallbackTypes()); return enhancer; } ``` CALLBACK_FILTER是个什么东西呢: ```java private static final ConditionalCallbackFilter CALLBACK_FILTER = new ConditionalCallbackFilter(CALLBACKS); private static final Callback[] CALLBACKS = new Callback[] { new BeanMethodInterceptor(), new BeanFactoryAwareMethodInterceptor(), NoOp.INSTANCE }; ``` 这么做的原因有两个: - 提供Scope支持: 我们可以使用@Scope注解来使用注解的方式配置其Scope: ```java @Bean @Scope("prototype") public Student student() { Student student = new Student(); student.setAge(22); student.setName("skywalker"); return student; } ``` Spring正是通过生成CGLIB子类的方式来提供Scope的语义。更确切的说,是上面源码里面的BeanMethodInterceptor。 - 实现EnhancedConfiguration接口 ### AutowiredAnnotationBeanPostProcessor 类图见上面,由于Adapter的存在,真正实现的是postProcessMergedBeanDefinition和postProcessPropertyValues两个方法。 #### postProcessMergedBeanDefinition ##### 入口 其中前者首先被调用,时机是已创建Bean实例但还没有对实例执行初始化操作。回顾下其调用入口: AbstractAutowireCapableBeanFactory.doCreateBean(简略): ```java protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) { // Instantiate the bean. BeanWrapper instanceWrapper = null; if (mbd.isSingleton()) { instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper == null) { instanceWrapper = createBeanInstance(beanName, mbd, args); } final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null); Class beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null); // Allow post-processors to modify the merged bean definition. synchronized (mbd.postProcessingLock) { if (!mbd.postProcessed) { applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); mbd.postProcessed = true; } } } ``` applyMergedBeanDefinitionPostProcessors: ```java protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class beanType, String beanName) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof MergedBeanDefinitionPostProcessor) { MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp; bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName); } } } ``` ##### 源码 ```java @Override public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class beanType, String beanName) { if (beanType != null) { InjectionMetadata metadata = findAutowiringMetadata(beanName, beanType, null); metadata.checkConfigMembers(beanDefinition); } } ``` findAutowiringMetadata: ```java private InjectionMetadata findAutowiringMetadata(String beanName, Class clazz, PropertyValues pvs) { // Fall back to class name as cache key, for backwards compatibility with custom callers. String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName()); // Quick check on the concurrent map first, with minimal locking. InjectionMetadata metadata = this.injectionMetadataCache.get(cacheKey); if (InjectionMetadata.needsRefresh(metadata, clazz)) { synchronized (this.injectionMetadataCache) { metadata = this.injectionMetadataCache.get(cacheKey); if (InjectionMetadata.needsRefresh(metadata, clazz)) { if (metadata != null) { metadata.clear(pvs); } metadata = buildAutowiringMetadata(clazz); this.injectionMetadataCache.put(cacheKey, metadata); } } } return metadata; } ``` injectionMetadataCache是一个ConcurrentHashMap对象,个人认为设置此缓存有以下几个原因: - 假设有多线程同时调用针对某一个bean的getBean方法,那么这样可以保证只有一个线程执行一次@Autowire注解的扫描工作。 - 对于非singleton(比如prototype)类型的bean,这样同样可以保证只解析一次,防止做无用功。 可以看到,Spring使用了代价更小的ConcurrentHashMap来先做一个预检测,这样尽可能的减小锁的使用以及粒度,值得借鉴。 @Autowire注解的扫描在buildAutowiringMetadata方法: ```java private InjectionMetadata buildAutowiringMetadata(final Class clazz) { LinkedList elements = new LinkedList(); Class targetClass = clazz; //循环检测父类 do { final LinkedList currElements = new LinkedList(); ReflectionUtils.doWithLocalFields(targetClass, new ReflectionUtils.FieldCallback() { @Override public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { AnnotationAttributes ann = findAutowiredAnnotation(field); if (ann != null) { //不支持静态变量 if (Modifier.isStatic(field.getModifiers())) { return; } boolean required = determineRequiredStatus(ann); currElements.add(new AutowiredFieldElement(field, required)); } } }); ReflectionUtils.doWithLocalMethods(targetClass, new ReflectionUtils.MethodCallback() { @Override public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException { Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method); if (!BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) { return; } AnnotationAttributes ann = findAutowiredAnnotation(bridgedMethod); if (ann != null && method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) { if (Modifier.isStatic(method.getModifiers())) { return; } if (method.getParameterTypes().length == 0) { if (logger.isWarnEnabled()) { logger.warn("Autowired annotation should be used on methods with parameters: " + method); } } boolean required = determineRequiredStatus(ann); PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz); currElements.add(new AutowiredMethodElement(method, required, pd)); } } }); elements.addAll(0, currElements); targetClass = targetClass.getSuperclass(); } while (targetClass != null && targetClass != Object.class); return new InjectionMetadata(clazz, elements); } ``` 可以看出,Spring使用了一个do while循环来一直检测其父类,直到Object,这就说明,**Spring注入注解可以配置在此bean的父类上**。其实,最开始的时候网站的Service层和Dao层一直都是这么做的。 ##### 变量扫描 之后便是逐一扫描当前类的成员变量,检测是否有@Autowire注解。 ReflectionUtils的实现其实就是访问者模式,其源码: ```java public static void doWithLocalFields(Class clazz, FieldCallback fc) { for (Field field : getDeclaredFields(clazz)) { try { fc.doWith(field); } catch (IllegalAccessException ex) {} } } ``` determineRequiredStatus方法用以判断是否是必须的,所谓的必须是指: 如果容器里没有需要的bean,那么会抛出异常,否则就忽略了,默认是必须的。原理很简单,不说了。 ##### 方法扫描 ###### bridge方法 就是方法扫描的第一行源码: ```java Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method); ``` 此句代码的作用是**判断method是否是bridge方法,如果是,寻找其真正的方法。**这里的bridge方法并不是所谓的bridge模式。 有这样的demo代码: ```java public class JavaTest { private class MyList extends ArrayList { //注意父类的返回类型是Object @Override public String get(int index) { return ""; } } public static void main(String[] args) { for (Method method : MyList.class.getDeclaredMethods()) { System.out.println("name: " + method.getName() + ", return: " + method.getReturnType()); } } } ``` 子类重写父类的方法但是返回值不同在java语言里是合法的。此程序的输出: ```html name: get, return: class java.lang.String name: get, return: class java.lang.Object ``` 通过javap反编译命令也可以看到有两个get方法。其中返回Object的便是bridge方法。jdk从1.5开始便提供了方法判断是否是此种方法: Method: ```java /** * Returns {@code true} if this method is a bridge * method; returns {@code false} otherwise. * * @return true if and only if this method is a bridge * method as defined by the Java Language Specification. * @since 1.5 */ public boolean isBridge() { return (getModifiers() & Modifier.BRIDGE) != 0; } ``` 可以看出,bridge和static之类一样,在java内部也是有一个修饰符的,只不过只在jvm内部可见。 可以参考: [Java那些不为人知的特殊方法](http://ifeve.com/syntethic-and-bridge-methods/) 到这里寻找真正方法的原理也好理解了,就是在所有Method中寻找方法名相同、参数列表相同但返回值不同的。 ###### PropertyDescriptor 用于描述java bean,如果被标注@Autowire的方法是一个getter或setter方法,那么Spring会保存下来其PropertyDescriptor对象,如果不是,那么就是空。 #### postProcessPropertyValues ##### 入口 AbstractAutowireCapableBeanFactory.populateBean方法,执行时机是在bean的属性都已经计算(根据xml配置进行完autowire)完毕,设置到bean实例之前。 ##### 注入 源码: ```java public void processInjection(Object bean) throws BeansException { Class clazz = bean.getClass(); // 查找缓存 InjectionMetadata metadata = findAutowiringMetadata(clazz.getName(), clazz, null); metadata.inject(bean, null, null); } ``` 根据上面postProcessMergedBeanDefinition一节的说明,解析的结果最终保存为一个InjectionMetadata对象,其内部含有一个InjectionMetadata.InjectedElement类型的List,所以注入的过程实际上便是遍历此List调用每一个InjectionMetadata.InjectedElement的inject的过程。 ###### Field注入 实现类是AutowiredFieldElement。注入的原理就是从容器中查找相关的依赖,用反射的方法调用Field的set方法,不在详细说了。 ###### 方法注入 实现类是AutowiredMethodElement。注入的原理是遍历此方法的参数列表,针对每一个参数都去容器中寻找相应的bean,之后调用Method的invoke方法即可。 ### RequiredAnnotationBeanPostProcessor 上面提到了,此类的类图和上面的邻居类似,所以调用的方法的顺序、时机都是一样,所以不再赘述。 #### postProcessMergedBeanDefinition 空实现,就是这么任性: ```java @Override public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class beanType, String beanName) { } ``` #### postProcessPropertyValues 源码: ```java @Override public PropertyValues postProcessPropertyValues( PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException { if (!this.validatedBeanNames.contains(beanName)) { if (!shouldSkip(this.beanFactory, beanName)) { List invalidProperties = new ArrayList(); for (PropertyDescriptor pd : pds) { if (isRequiredProperty(pd) && !pvs.contains(pd.getName())) { invalidProperties.add(pd.getName()); } } if (!invalidProperties.isEmpty()) { throw new BeanInitializationException(buildExceptionMessage (invalidProperties, beanName)); } } this.validatedBeanNames.add(beanName); } return pvs; } ``` ##### 结果缓存 validatedBeanNames是一个Set类型,对于已经检查过的bean,将其name加入Set,防止做无用功。 ##### PropertyDescriptor 从源码可以看出,校验是通过PropertyDescriptor完成的,那么这个数组是从哪里来的呢? AbstractAutowireCapableBeanFactory.populateBean相关代码: ```java PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching); if (hasInstAwareBpps) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof InstantiationAwareBeanPostProcessor) { InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp; pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName); if (pvs == null) { return; } } } } ``` filterPropertyDescriptorsForDependencyCheck单参数方法: ```java protected PropertyDescriptor[] filterPropertyDescriptorsForDependencyCheck(BeanWrapper bw) { List pds = new LinkedList(Arrays.asList(bw.getPropertyDescriptors())); for (Iterator it = pds.iterator(); it.hasNext();) { PropertyDescriptor pd = it.next(); if (isExcludedFromDependencyCheck(pd)) { it.remove(); } } return pds.toArray(new PropertyDescriptor[pds.size()]); } ``` 可以看出,最终来自于BeanWrapper。那么BeanWrapper又是从哪里弄来的呢? BeanWrapperImpl.getPropertyDescriptors: ```java @Override public PropertyDescriptor[] getPropertyDescriptors() { return getCachedIntrospectionResults().getPropertyDescriptors(); } private CachedIntrospectionResults getCachedIntrospectionResults() { Assert.state(getWrappedInstance() != null, "BeanWrapper does not hold a bean instance"); if (this.cachedIntrospectionResults == null) { this.cachedIntrospectionResults = CachedIntrospectionResults.forClass(getWrappedClass()); } return this.cachedIntrospectionResults; } ``` 所以,这时BeanWrapper便会把自己"内省"一遍。这从侧面说明@Reqired注解只对setter方法有效。 ##### 测试 有一个bean如下: ```java @Component("simpleBean") public class SimpleBean { @Autowired(required = false) private Student student; public SimpleBean() {} public SimpleBean(Student student) { this.student = student; } public Student getStudent() { return student; } @Required public void setStudent(Student student) { this.student = student; } } ``` 注意先关闭@Autowire的检测,否则用不到@Required注解便会报错。运行之后的结果: ![@Required测试](images/@required_test.png) ### CommonAnnotationBeanPostProcessor 从其类图可以看出,此类主要是整合了MergedBeanDefinitionPostProcessor和DestructionAwareBeanPostProcessor的功能。其功能体现在以下几个方法,按调用顺序进行说明。 #### postProcessMergedBeanDefinition 此方法的执行入口以及调用时机上面已经说过了。其源码: ```java @Override public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class beanType, String beanName) { super.postProcessMergedBeanDefinition(beanDefinition, beanType, beanName); if (beanType != null) { InjectionMetadata metadata = findResourceMetadata(beanName, beanType, null); metadata.checkConfigMembers(beanDefinition); } } ``` ##### 父类 可以看出,首先调用了其父类InitDestroyAnnotationBeanPostProcessor的postProcessMergedBeanDefinition方法,源码: ```java @Override public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class beanType, String beanName) { if (beanType != null) { LifecycleMetadata metadata = findLifecycleMetadata(beanType); metadata.checkConfigMembers(beanDefinition); } } ``` findLifecycleMetadata的套路和上面运行-AutowiredAnnotationBeanPostProcessor-源码一节中所说完全一样,所不同的是此处是**遍历所有method寻找初始化和销毁方法标记**。这两个标记很有意思,Spring允许我们自定义是哪两个标记(getter/setter方法)。子类CommonAnnotationBeanPostProcessor在构造器中设置了其值: ```java public CommonAnnotationBeanPostProcessor() { setInitAnnotationType(PostConstruct.class); setDestroyAnnotationType(PreDestroy.class); } ``` 这两个标签来自于javax.annotation包。那么怎么自定义呢? CommonAnnotationBeanPostProcessor本质上是一个BeanPostProcessor,所以我们可以自己注入,配置文件: ```xml ``` Init是一个很简单的自定义注解: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Init {} ``` 在自己的bean中使用此注解: ```java @Init public void init() { System.out.println("Init!"); } ``` 运行Spring便可以看到效果。 另外注意一点,从前面annotation-config-BeanPostProcessor注册一节的源码中可以看出,**Spring在向容器中添加CommonAnnotationBeanPostProcessor时只是检测其ID(org.springframework.context.annotation.internalCommonAnnotationProcessor)是否存在,这就造成了一个问题: 如果按上面所说的配置,那么在容器中实际上有两个CommonAnnotationProcessor存在,也就是说,@PostConstruct和@PreDestroy注解此时依然被支持**。为了达到只有一个实例的目的,需要为前面的配置加上ID。 ##### 子类 findResourceMetadata的套路还是一样,就是在属性和方法上寻找@Resource标签。 #### postProcessPropertyValues 源码: ```java @Override public PropertyValues postProcessPropertyValues( PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) { InjectionMetadata metadata = findResourceMetadata(beanName, bean.getClass(), pvs); metadata.inject(bean, beanName, pvs); return pvs; } ``` 套路很明显了。 #### postProcessBeforeInitialization 实现在父类InitDestroyAnnotationBeanPostProcessor: ```java @Override public Object postProcessBeforeInitialization(Object bean, String beanName) { LifecycleMetadata metadata = findLifecycleMetadata(bean.getClass()); metadata.invokeInitMethods(bean, beanName); return bean; } ``` invokeInitMethods: ```java public void invokeInitMethods(Object target, String beanName) throws Throwable { Collection initMethodsToIterate = (this.checkedInitMethods != null ? this.checkedInitMethods : this.initMethods); if (!initMethodsToIterate.isEmpty()) { for (LifecycleElement element : initMethodsToIterate) { // 反射调用 element.invoke(target); } } } ``` 不过从源码来看应该支持多个init方法。 #### postProcessBeforeDestruction 反射调用销毁方法,没啥说的了。 ### EventListenerMethodProcessor 就一个值得关注的方法: afterSingletonsInstantiated。 ##### 入口 DefaultListableBeanFactory.preInstantiateSingletons相关源码: ```java // 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() { @Override public Object run() { smartSingleton.afterSingletonsInstantiated(); return null; } }, getAccessControlContext()); } else { smartSingleton.afterSingletonsInstantiated(); } } } ``` ##### 源码 略过。 # component-scan ComponentScanBeanDefinitionParser.parse源码: ```java @Override public BeanDefinition parse(Element element, ParserContext parserContext) { // base-package属性 String basePackage = element.getAttribute(BASE_PACKAGE_ATTRIBUTE); // 解析占位符 basePackage = parserContext.getReaderContext().getEnvironment() .resolvePlaceholders(basePackage); //分割成数据 String[] basePackages = StringUtils.tokenizeToStringArray(basePackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS); // Actually scan for bean definitions and register them. ClassPathBeanDefinitionScanner scanner = configureScanner(parserContext, element); Set beanDefinitions = scanner.doScan(basePackages); registerComponents(parserContext.getReaderContext(), beanDefinitions, element); return null; } ``` ## 初始化 此部分负责初始化包扫描用到的扫描器,是一个ClassPathBeanDefinitionScanner对象,configureScanner方法源码: ```java protected ClassPathBeanDefinitionScanner configureScanner(ParserContext parserContext, Element element) { boolean useDefaultFilters = true; if (element.hasAttribute(USE_DEFAULT_FILTERS_ATTRIBUTE)) { useDefaultFilters = Boolean.valueOf(element.getAttribute(USE_DEFAULT_FILTERS_ATTRIBUTE)); } // Delegate bean definition registration to scanner class. ClassPathBeanDefinitionScanner scanner = createScanner (parserContext.getReaderContext(), useDefaultFilters); scanner.setResourceLoader(parserContext.getReaderContext().getResourceLoader()); scanner.setEnvironment(parserContext.getReaderContext().getEnvironment()); scanner.setBeanDefinitionDefaults(parserContext.getDelegate().getBeanDefinitionDefaults()); scanner.setAutowireCandidatePatterns(parserContext.getDelegate().getAutowireCandidatePatterns()); if (element.hasAttribute(RESOURCE_PATTERN_ATTRIBUTE)) { scanner.setResourcePattern(element.getAttribute(RESOURCE_PATTERN_ATTRIBUTE)); } parseBeanNameGenerator(element, scanner); parseScope(element, scanner); parseTypeFilters(element, scanner, parserContext); return scanner; } ``` 下面开始按顺序分部分说明。 ### use-default-filters component-scan注解会默认扫描喜闻乐见的@Component、@Repository、@Service和@Controller四大金刚。如果此属性设为false,那么就不会扫描这几个属性。 ### 扫描器:创建 & 初始化 就是createScanner方法和下面那一坨setter方法,没啥好说的。 ### resource-pattern 用以配置扫描器扫描的路径,默认`**/*.class`。 ### name-generator 可以指定命名策略,这个在前面运行-ConfigurationClassPostProcessor-类解析一节中说过。Spring在parseBeanNameGenerator方法会直接使用反射的方法生成其对象。 ### scope-resolver 指定使用的ScopeMetadataResolver。此接口用于解析bean的scope定义,其类图: ![ScopeMetadataResolver类图](images/ScopeMetadataResolver.jpg) 默认是AnnotationScopeMetadataResolver,也就是解析@Scope标签。 ### scoped-proxy 此配置的意思应该是是否为检测到的bean生成代理子类,共有三个选项: interfaces, no, targetClasses,默认no。原理应该就像对@Configuration类的处理,Spring自己说是实现proxy style,不知所云。 ### exclude-filter/include-filter 用法示例: ```xml ``` parseTypeFilters方法负责此部分的解析,只贴部分源码: ```java if (INCLUDE_FILTER_ELEMENT.equals(localName)) { TypeFilter typeFilter = createTypeFilter((Element) node, classLoader, parserContext); scanner.addIncludeFilter(typeFilter); } else if (EXCLUDE_FILTER_ELEMENT.equals(localName)) { TypeFilter typeFilter = createTypeFilter((Element) node, classLoader, parserContext); scanner.addExcludeFilter(typeFilter); } ``` ### annotation-config 此属性等同于配置,默认就是true,也就是说,如果配置了context:component-scan其实就没有必要配置annotation-config 了。 ## 扫描 入口方法便是ClassPathBeanDefinitionScanner.doScan: ```java protected Set doScan(String... basePackages) { Assert.notEmpty(basePackages, "At least one base package must be specified"); Set beanDefinitions = new LinkedHashSet(); for (String basePackage : basePackages) { // 逐包扫描 Set candidates = findCandidateComponents(basePackage); for (BeanDefinition candidate : candidates) { ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate); candidate.setScope(scopeMetadata.getScopeName()); String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry); if (candidate instanceof AbstractBeanDefinition) { // 为BeanDefinition设置默认的属性 postProcessBeanDefinition((AbstractBeanDefinition) candidate, beanName); } if (candidate instanceof AnnotatedBeanDefinition) { AnnotationConfigUtils.processCommonDefinitionAnnotations ((AnnotatedBeanDefinition) candidate); } if (checkCandidate(beanName, candidate)) { BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(candidate, beanName); definitionHolder = AnnotationConfigUtils.applyScopedProxyMode (scopeMetadata, definitionHolder, this.registry); beanDefinitions.add(definitionHolder); registerBeanDefinition(definitionHolder, this.registry); } } } return beanDefinitions; } ``` ### 逐包扫描/BeanDefinition解析 扫描其实就是在classpath下直接读取class文件。读取到的class文件被Spring用Resource接口表示。之后交由MetadataReader进行解析,其类图: ![MetadataReader类图](images/MetadataReader.jpg) 对class文件的读取、分析是通过ASM完成的,入口在SimpleMetadataReader的构造器: ```java SimpleMetadataReader(Resource resource, ClassLoader classLoader) throws IOException { InputStream is = new BufferedInputStream(resource.getInputStream()); ClassReader classReader; classReader = new ClassReader(is); AnnotationMetadataReadingVisitor visitor = new AnnotationMetadataReadingVisitor(classLoader); classReader.accept(visitor, ClassReader.SKIP_DEBUG); this.annotationMetadata = visitor; // (since AnnotationMetadataReadingVisitor extends ClassMetadataReadingVisitor) this.classMetadata = visitor; this.resource = resource; } ``` 解析的关键便在于AnnotationMetadataReadingVisitor,其类图: ![AnnotationMetadataReadingVisitor类图](images/AnnotationMetadataReadingVisitor.jpg) 核心在于其visitAnnotation方法: ```java @Override public AnnotationVisitor visitAnnotation(final String desc, boolean visible) { String className = Type.getType(desc).getClassName(); this.annotationSet.add(className); return new AnnotationAttributesReadingVisitor( className, this.attributesMap, this.metaAnnotationMap, this.classLoader); } ``` 返回一个AnnotationVisitor表示对此注解的属性感兴趣,用于解析其属性。最终得到的BeanDefinition集合是ScannedGenericBeanDefinition类型,其类图: ![ScannedGenericBeanDefinition类图](images/ScannedGenericBeanDefinition.jpg) ### @Scope解析 AnnotationScopeMetadataResolver.resolveScopeMetadata: ```java @Override public ScopeMetadata resolveScopeMetadata(BeanDefinition definition) { ScopeMetadata metadata = new ScopeMetadata(); if (definition instanceof AnnotatedBeanDefinition) { AnnotatedBeanDefinition annDef = (AnnotatedBeanDefinition) definition; // 寻找Scope相关的属性,AnnotationAttributes是LinkedHashMap的子类 AnnotationAttributes attributes = AnnotationConfigUtils.attributesFor( annDef.getMetadata(), this.scopeAnnotationType); if (attributes != null) { // @Scope值 metadata.setScopeName(attributes.getString("value")); ScopedProxyMode proxyMode = attributes.getEnum("proxyMode"); if (proxyMode == null || proxyMode == ScopedProxyMode.DEFAULT) { proxyMode = this.defaultProxyMode; } metadata.setScopedProxyMode(proxyMode); } } return metadata; } ``` proxyMode和xml的scoped-proxy属性是一个概念: ```java @Scope(value = "singleton", proxyMode = ScopedProxyMode.DEFAULT) ``` **XML的属性是全局的配置,这个是局部(针对单个bean)的配置**,和XML属性相比对了一个default选项,这个就表示使用XML属性的配置。 ### bean名字生成 AnnotationBeanNameGenerator.generateBeanName: ```java @Override public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) { if (definition instanceof AnnotatedBeanDefinition) { String beanName = determineBeanNameFromAnnotation((AnnotatedBeanDefinition) definition); if (StringUtils.hasText(beanName)) { // Explicit bean name found. return beanName; } } // Fallback: generate a unique default bean name. return buildDefaultBeanName(definition, registry); } ``` #### 根据注解 默认会首先尝试根据@Component、@Service、@Controller、@Repository、@ManagedBean、@Named的value属性生成,determineBeanNameFromAnnotation: ```java protected String determineBeanNameFromAnnotation(AnnotatedBeanDefinition annotatedDef) { AnnotationMetadata amd = annotatedDef.getMetadata(); Set types = amd.getAnnotationTypes(); String beanName = null; // 遍历当前bean拥有的所有类级注解 for (String type : types) { // 获取此注解所有的属性 AnnotationAttributes attributes = AnnotationConfigUtils.attributesFor(amd, type); if (isStereotypeWithNameValue(type, amd.getMetaAnnotationTypes(type), attributes)) { Object value = attributes.get("value"); if (value instanceof String) { String strVal = (String) value; if (StringUtils.hasLength(strVal)) { if (beanName != null && !strVal.equals(beanName)) { throw new IllegalStateException(); } beanName = strVal; } } } } return beanName; } ``` isStereotypeWithNameValue方法用于判断此注解是否可以用来生成beanName,比如@Scope便不适合: ```java protected boolean isStereotypeWithNameValue(String annotationType, Set metaAnnotationTypes, Map attributes) { // org.springframework.stereotype.Component boolean isStereotype = annotationType.equals(COMPONENT_ANNOTATION_CLASSNAME) || (metaAnnotationTypes != null && metaAnnotationTypes.contains(COMPONENT_ANNOTATION_CLASSNAME)) || annotationType.equals("javax.annotation.ManagedBean") || annotationType.equals("javax.inject.Named"); return (isStereotype && attributes != null && attributes.containsKey("value")); } ``` metaAnnotationTypes用以判断元注解,针对这种情况: ```java @Component public @interface Controller {} ``` 可以看出,判断是否可以用来生成名字的依据便是注解类型是否在上面提到的6种之列并且value属性不为空。 #### 默认策略 如果上面提到的条件不满足,那么便会用默认策略生成beanName,buildDefaultBeanName: ```java protected String buildDefaultBeanName(BeanDefinition definition) { // base.SimpleBean -> SimpleBean String shortClassName = ClassUtils.getShortName(definition.getBeanClassName()); //SimpleBean -> simpleBean return Introspector.decapitalize(shortClassName); } ``` 注意,对于内部类: OuterClassName.InnerClassName -> outerClassName.InnerClassName. ### 其它注解解析 入口在AnnotationConfigUtils.processCommonDefinitionAnnotations,其它指的是这几个: ```java @Lazy @Primary @DependsOn("student") @Role(BeanDefinition.ROLE_APPLICATION) @Description("This is a simple bean.") public class SimpleBean {} ``` 这里面就是@Role没见过,默认就是上面那个值,Spring说这是一个"hint",可能没啥卵用,希望不要被打脸。解析之后设置到BeanDefinition,没啥好说的。 ### 冲突检测 Spring会检测容器中是否已经存在同名的BeanDefinition。ClassPathBeanDefinitionScanner.checkCandidate: ```java protected boolean checkCandidate(String beanName, BeanDefinition beanDefinition) { // 没有同名的,直接返回 if (!this.registry.containsBeanDefinition(beanName)) { return true; } BeanDefinition existingDef = this.registry.getBeanDefinition(beanName); BeanDefinition originatingDef = existingDef.getOriginatingBeanDefinition(); if (originatingDef != null) { existingDef = originatingDef; } if (isCompatible(beanDefinition, existingDef)) { return false; } throw new ConflictingBeanDefinitionException("冲突啦!"); } ``` isCompatible用于判断和之前的BeanDefinition是否兼容: ```java protected boolean isCompatible(BeanDefinition newDefinition, BeanDefinition existingDefinition) { //// explicitly registered overriding bean return (!(existingDefinition instanceof ScannedGenericBeanDefinition) || //// scanned same file twice newDefinition.getSource().equals(existingDefinition.getSource()) || // scanned equivalent class twice newDefinition.equals(existingDefinition)); } ``` 可以看出,**如果已经存在的BeanDefinition不是扫描来的,如果是由同一个class文件解析来的,如果两者equals,Spring都认为是兼容的,即Spring会用新的替换之前的。** ### 代理生成 入口: ClassPathBeanDefinitionScanner.doScan: ```java BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(candidate, beanName); definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry); ``` AnnotationConfigUtils.applyScopedProxyMode: ```java static BeanDefinitionHolder applyScopedProxyMode( ScopeMetadata metadata, BeanDefinitionHolder definition, BeanDefinitionRegistry registry) { ScopedProxyMode scopedProxyMode = metadata.getScopedProxyMode(); // 基本都是从这里跑了 if (scopedProxyMode.equals(ScopedProxyMode.NO)) { return definition; } boolean proxyTargetClass = scopedProxyMode.equals(ScopedProxyMode.TARGET_CLASS); return ScopedProxyCreator.createScopedProxy(definition, registry, proxyTargetClass); } ``` 最终调用的是ScopedProxyUtils.createScopedProxy,源码很多,这里说下重点: - 这里所做的是生成了一个新的BeanDefinition对象,作为代理者,其属性拷贝自被代理者,代理者的beanClass为ScopedProxyFactoryBean,代理者的名字设置为被代理者的名字,而被代理者的名字改为scopedTarget.原名字,代理者内部有一个targetBeanName属性,就是被代理者的名字。 - 被代理者的autowireCandidate和primary属性被设为false,不能再当作其它bean的注入候选者。 - 将被代理者以scopedTarget.原名字注册到容器,返回代理者。 - 代理者和被代理者同时存在于容器中。 可以看出,这其实是一个偷天换日的过程。 做个实验: ```java public class Boostrap { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("config.xml"); SimpleBean bean = SimpleBean.class.cast(context.getBean(SimpleBean.class)); System.out.println(bean.getClass().getName()); context.close(); } } ``` SimpleBean已开启代理,输出的结果: ```html base.SimpleBean$$EnhancerBySpringCGLIB$$27256c61 ``` 那么问题来了,对于以class寻找的方式,必定会找到两个,那么怎么做出选择呢? DefaultListableBeanFactory.getBean(Class requiredType, Object... args)部分源码: ```java String[] beanNames = getBeanNamesForType(requiredType); //不止一个满足条件(代理者和被代理者) if (beanNames.length > 1) { ArrayList autowireCandidates = new ArrayList(); for (String beanName : beanNames) { // here if (!containsBeanDefinition(beanName) || getBeanDefinition(beanName).isAutowireCandidate()) { autowireCandidates.add(beanName); } } if (autowireCandidates.size() > 0) { beanNames = autowireCandidates.toArray(new String[autowireCandidates.size()]); } } ``` 可以看出,是上面提到过的autowireCandidate设为了false的缘故导致了被代理者被pass。 ### BeanDefinition注册 你懂的。 ## Component注册 套路和annotation-config-逻辑关系整理一节完全一样,不再赘述。 # property-override ## 作用 允许我们使用属性文件(.properties)的形式对bean的属性进行替换。下面是一个简单的demo: 定义如下的属性文件(property.properties): ```properties student.name=dog ``` 格式为: bean名字.属性名字=值。由如下的bean: ```xml ``` 进行如下的配置: ```xml ``` 运行如下的代码: ```java public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("config.xml"); SimpleBean bean = SimpleBean.class.cast(context.getBean(SimpleBean.class)); System.out.println(bean.getStudent().getName()); context.close(); } ``` 打印的便是dog,而不是skywalker。 ## 类图 具体的实现类是PropertyOverrideBeanDefinitionParser,其类图如下: ![PropertyOverrideBeanDefinitionParser类图](images/PropertyOverrideBeanDefinitionParser.jpg) ## 解析 解析的原理是将此配置相关的信息保存到BeanDefinition中,更准确的说是一个GenericBeanDefinition。解析的源码: AbstractPropertyLoadingBeanDefinitionParser.doParse: ```java @Override protected void doParse(Element element, BeanDefinitionBuilder builder) { String location = element.getAttribute("location"); if (StringUtils.hasLength(location)) { String[] locations = StringUtils.commaDelimitedListToStringArray(location); builder.addPropertyValue("locations", locations); } String propertiesRef = element.getAttribute("properties-ref"); if (StringUtils.hasLength(propertiesRef)) { builder.addPropertyReference("properties", propertiesRef); } String fileEncoding = element.getAttribute("file-encoding"); if (StringUtils.hasLength(fileEncoding)) { builder.addPropertyValue("fileEncoding", fileEncoding); } String order = element.getAttribute("order"); if (StringUtils.hasLength(order)) { builder.addPropertyValue("order", Integer.valueOf(order)); } builder.addPropertyValue("ignoreResourceNotFound", Boolean.valueOf(element.getAttribute("ignore-resource-not-found"))); builder.addPropertyValue("localOverride", Boolean.valueOf(element.getAttribute("local-override"))); builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); } ``` ### properties-ref 此属性允许我们直接引用一个java.util.Properties类型的bean作为数据源,示例: ```xml cat ``` 这样便可以看到结果。 ### order 此属性用以指定其优先级,假设配置了多个context:property-override并且里面有相同的字段,那么将依赖order决定结果。 ### ignore-resource-not-found 如果设为true,那么对于没有找到的属性文件将会忽略,否则会抛出异常,默认为false,抛异常。 ### ignore-unresolvable 如果设为true,那么对于没有找到对应的key将会忽略,否则抛出异常,默认false。 ### local-override 这个属性让我很迷惑。Spring说是此选项决定"local"的属性是否可以覆盖属性文件中的值。正如下面说的,实际上属性文件被解析到了PropertyOverrideConfigurer对象,其父类PropertiesLoaderSupport有一个字段: ```java protected Properties[] localProperties; /** * Set local properties, e.g. via the "props" tag in XML bean definitions. * These can be considered defaults, to be overridden by properties * loaded from files. */ public void setProperties(Properties properties) { this.localProperties = new Properties[] {properties}; } ``` 可以看出,这应该就是Spring所说的"local"属性。好,我们来注入一下: ```xml cat ``` 然而Spring在注册PropertyOverrideConfigurer的时候根本没有检查容器中是否已经有此类型的BeanDefinition存在,这就导致容器中会同时存在两个!在此种情况下local-override根本没什么卵用,因为后面的PropertyOverrideConfigurer始终会覆盖前一个,local-override是针对一个PropertyOverrideConfigurer来说的,那么问题来了,除此之外如何通过XML向"local"注入?(context:property-override不允许子标签存在) ### BeanDefinition 保存的BeanDefinition的beanClass为PropertyOverrideConfigurer,其类图: ![PropertyOverrideConfigurer类图](images/PropertyOverrideConfigurer.jpg) ## 运行 入口当然是BeanFactoryPostProcessor.postProcessBeanFactory(PropertyResourceConfigurer): ```java @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { try { // 属性加载 Properties mergedProps = mergeProperties(); // Convert the merged properties, if necessary. convertProperties(mergedProps); // Let the subclass process the properties. processProperties(beanFactory, mergedProps); } catch (IOException ex) { throw new BeanInitializationException("Could not load properties", ex); } } ``` ### 属性加载 PropertiesLoaderSupport.mergeProperties: ```java protected Properties mergeProperties() throws IOException { Properties result = new Properties(); if (this.localOverride) { // Load properties from file upfront, to let local properties override. loadProperties(result); } if (this.localProperties != null) { for (Properties localProp : this.localProperties) { CollectionUtils.mergePropertiesIntoMap(localProp, result); } } if (!this.localOverride) { // Load properties from file afterwards, to let those properties override. loadProperties(result); } return result; } ``` 可以看出,对local-override的支持是通过改变local和文件两者的加载顺序来实现的。 ### 属性转换 convertProperties是个空实现,因为这里并不需要,在bean实际生成的时候才会转换。 ### 属性设置 就是逐个属性调用PropertyOverrideConfigurer.applyPropertyValue: ```java protected void applyPropertyValue( ConfigurableListableBeanFactory factory, String beanName, String property, String value) { BeanDefinition bd = factory.getBeanDefinition(beanName); while (bd.getOriginatingBeanDefinition() != null) { bd = bd.getOriginatingBeanDefinition(); } PropertyValue pv = new PropertyValue(property, value); pv.setOptional(this.ignoreInvalidKeys); bd.getPropertyValues().addPropertyValue(pv); } ``` addPropertyValue会遍历PropertyValue链表,找到name相同的进行value替换。 # property-placeholder 这个怎么用已经喜闻乐见了 ## 解析 解析的实现类是PropertyPlaceholderBeanDefinitionParser,此类的父类继承体系和property-override的PropertyOverrideBeanDefinitionParser完全一样,所以整体的处理套路也是基本一致。为什么会一致呢,查看此配置拥有的属性就会发现,和property-override很多都是一样的,所以这里只对不一样的而进行说明。 PropertyPlaceholderBeanDefinitionParser.doParse: ```java @Override protected void doParse(Element element, BeanDefinitionBuilder builder) { super.doParse(element, builder); builder.addPropertyValue("ignoreUnresolvablePlaceholders", Boolean.valueOf(element.getAttribute("ignore-unresolvable"))); String systemPropertiesModeName = element.getAttribute(SYSTEM_PROPERTIES_MODE_ATTRIBUTE); if (StringUtils.hasLength(systemPropertiesModeName) && !systemPropertiesModeName.equals(SYSTEM_PROPERTIES_MODE_DEFAULT)) { builder.addPropertyValue("systemPropertiesModeName", "SYSTEM_PROPERTIES_MODE_" + systemPropertiesModeName); } if (element.hasAttribute("value-separator")) { builder.addPropertyValue("valueSeparator", element.getAttribute("value-separator")); } if (element.hasAttribute("trim-values")) { builder.addPropertyValue("trimValues", element.getAttribute("trim-values")); } if (element.hasAttribute("null-value")) { builder.addPropertyValue("nullValue", element.getAttribute("null-value")); } } ``` ### system-properties-mode Spring会将java的System.getProperties也当做属性的来源,此配置用于设置系统的和本地文件的同名属性的覆盖方式(谁覆盖谁),自己看文档去。 ### value-separator 用于配置默认的值的分隔符: ```xml ``` 如果属性文件里没有student.name,那么就是skywalker。默认就是:。 ### null-value 遇到哪些值应该当做空处理,比如可以把空串""设为这个,默认不对任何值进行处理。 ### trim-values 是否移除开头和结尾的空格,按理说应该是布尔值,但是Spring没有提供可以选择的值,经过测试发现设为true或是false都会把空格干掉,不知道什么鬼。 ### BeanDefinition 这次是PropertySourcesPlaceholderConfigurer,其类图: ![PropertySourcesPlaceholderConfigurer类图](images/PropertySourcesPlaceholderConfigurer.jpg) ## 运行 PropertySourcesPlaceholderConfigurer.postProcessBeanFactory: ```java @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { if (this.propertySources == null) { this.propertySources = new MutablePropertySources(); if (this.environment != null) { this.propertySources.addLast( new PropertySource(ENVIRONMENT_PROPERTIES_PROPERTY_SOURCE_NAME, this.environment) { @Override public String getProperty(String key) { return this.source.getProperty(key); } } ); } PropertySource localPropertySource = new PropertiesPropertySource(LOCAL_PROPERTIES_PROPERTY_SOURCE_NAME, mergeProperties()); if (this.localOverride) { this.propertySources.addFirst(localPropertySource); } else { this.propertySources.addLast(localPropertySource); } } processProperties(beanFactory, new PropertySourcesPropertyResolver(this.propertySources)); this.appliedPropertySources = this.propertySources; } ``` 从源码中可以看出,如果其内部的propertySources属性不为空(当然默认是空),那么属性文件和系统属性都会被忽略。它的使用场景应该是这样: 不使用property-placeholder标签,以显式的bean定义代替。 ### 处理 处理的过程就是遍历全部BeanDefinition,替换${},不再详细进行详细说明。 # load-time-weaver & spring-configured 这两个配置是紧密相关的,所以在一起说了。 load-time-weaver用以开启aspectj类加载期织入,实际上是利用jdk1.6提供的instrument API实现的,原理就是jvm会在类加载之前将class暴露给我们制定的类,允许我们在此时对类进行修改。aspectj便利用此机会根据我们的配置生成对应的满足需求的子类。 可以参考: [Spring之LoadTimeWeaver——一个需求引发的思考](http://sexycoding.iteye.com/blog/1062372) [Spring LoadTimeWeaver 的那些事儿](http://www.iteye.com/topic/481813) ## javaagent 要想使用此功能需要配置jvm参数javaagent指定代理类的jar包,示例: -javaagent:D:\Software\maven-repos\org\springframework\spring-agent\2.5.6.SEC03\spring-agent-2.5.6.SEC03.jar 此jar包的META-INF/MANIFEST.MF文件需要配置如下一行: Premain-Class: org.springframework.instrument.InstrumentationSavingAge nt Spring的这个jar包只有这一个类,premain方法便是jvm调用的入口,方法参数是固定的。源码: ```java public class InstrumentationSavingAgent { private static volatile Instrumentation instrumentation; public static void premain(String agentArgs, Instrumentation inst) { instrumentation = inst; } public static Instrumentation getInstrumentation() { return instrumentation; } } ``` 所以,Spring在这里把Instrumentation给暴露了出来,供其它的类使用。 ## 解析 解析的实现类是LoadTimeWeaverBeanDefinitionParser,其继承体系和property-override的PropertyOverrideBeanDefinitionParser类似。 ### LoadTimeWeaver 此接口用于向ClassLoader添加ClassFileTransformer对象,其继承体系: ![LoadTimeWeaver继承体系](images/LoadTimeWeaver.jpg) LoadTimeWeaverBeanDefinitionParser的父类初始化了一个DefaultContextLoadTimeWeaver类型的BeanDefinition放入容器,类型的决定位于LoadTimeWeaverBeanDefinitionParser.getBeanClassName: ```java @Override protected String getBeanClassName(Element element) { // 如果配置了weaver-class属性,那么使用其值 if (element.hasAttribute(WEAVER_CLASS_ATTRIBUTE)) { return element.getAttribute(WEAVER_CLASS_ATTRIBUTE); } // org.springframework.context.weaving.DefaultContextLoadTimeWeaver return DEFAULT_LOAD_TIME_WEAVER_CLASS_NAME; } ``` 那么这个BeanDefinition的id/name又是什么呢? LoadTimeWeaverBeanDefinitionParser.resolveId: ```java @Override protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) { // loadTimeWeaver return ConfigurableApplicationContext.LOAD_TIME_WEAVER_BEAN_NAME; } ``` DefaultContextLoadTimeWeaver其实是个包装类,包装了真正的LoadTimeWeaver,使用这层包装的目的就是可以根据外部环境(服务器代理或是Spring自己的代理)确定内部LoadTimeWeaver的实现,具体参见后面运行-BeanClassLoaderAware-setBeanClassLoadery一节。 ### LoadTimeWeaverBeanDefinitionParser LoadTimeWeaverBeanDefinitionParser.doParse: ```java @Override protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); if (isAspectJWeavingEnabled(element.getAttribute(ASPECTJ_WEAVING_ATTRIBUTE), parserContext)) { if (!parserContext.getRegistry().containsBeanDefinition(ASPECTJ_WEAVING_ENABLER_BEAN_NAME)) { RootBeanDefinition def = new RootBeanDefinition(ASPECTJ_WEAVING_ENABLER_CLASS_NAME); parserContext.registerBeanComponent( new BeanComponentDefinition(def, ASPECTJ_WEAVING_ENABLER_BEAN_NAME)); } if (isBeanConfigurerAspectEnabled(parserContext.getReaderContext().getBeanClassLoader())) { new SpringConfiguredBeanDefinitionParser().parse(element, parserContext); } } } ``` ### aspectj-weaving 这里便是加载其织入的开关,共有三个选项: on, off, autodect。前两个自不必说,autodect表示自动去检测/META-INF下是否存在aop.xml,如果有,那么开启。 此功能依赖于spring-aspectj包,此jar包下有aop.xml,所以autodect也是开启的。 ### 是否开启 isAspectJWeavingEnabled方法用于判断是否启用: ```java protected boolean isAspectJWeavingEnabled(String value, ParserContext parserContext) { if ("on".equals(value)) { return true; } else if ("off".equals(value)) { return false; } else { // 寻找aop.xml ClassLoader cl = parserContext.getReaderContext().getResourceLoader().getClassLoader(); return (cl.getResource(AspectJWeavingEnabler.ASPECTJ_AOP_XML_RESOURCE) != null); } } ``` ### AspectJWeavingEnabler 从源码中可以看出,Spring向容器放了一个这东西,名字叫org.springframework.context.config.internalAspectJWeavingEnabler。这东西用来向LoadTimeWeaver设置aspectj的ClassPreProcessorAgentAdapter对象。其类图: ![AspectJWeavingEnabler类图](images/AspectJWeavingEnabler.jpg) ### SpringConfiguredBeanDefinitionParser 如果isBeanConfigurerAspectEnabled方法返回true,那么将会生成一个此对象并调用其parse方法,查看ContextNamespaceHandler的init方法源码可以发现,spring-configured对应的解析器其实就是它: ```java registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser()); ``` 其parse方法: ```java @Override public BeanDefinition parse(Element element, ParserContext parserContext) { // org.springframework.context.config.internalBeanConfigurerAspect if (!parserContext.getRegistry().containsBeanDefinition(BEAN_CONFIGURER_ASPECT_BEAN_NAME)) { RootBeanDefinition def = new RootBeanDefinition(); // org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect def.setBeanClassName(BEAN_CONFIGURER_ASPECT_CLASS_NAME); def.setFactoryMethodName("aspectOf"); def.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); def.setSource(parserContext.extractSource(element)); parserContext.registerBeanComponent(new BeanComponentDefinition (def, BEAN_CONFIGURER_ASPECT_BEAN_NAME)); } return null; } ``` 很明显,把org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect添加到容器里了,这其实是一个切面,其类图: ![AnnotationBeanConfigurerAspect类图](images/AnnotationBeanConfigurerAspect.jpg) AnnotationBeanConfigurerAspect及其父类其实是由aspectj源文件(.aj)编译而来,所以在spring-aspectj的源码包中看到的是.aj文件而不是.java。 下面就去aj文件中看看到底定义了哪些pointcut以及advise。 语法可以参考: [Spring 之AOP AspectJ切入点详解](http://jinnianshilongnian.iteye.com/blog/1415606) #### 切点(pointcut) ##### inConfigurableBean 在AnnotationBeanConfigurerAspect中定义,源码: ```java public pointcut inConfigurableBean() : @this(Configurable); ``` @this没找到相关说明,结合@以及this的语义,猜测是匹配**带有@Configurable注解(以及作为元注解)的类**。 ##### beanConstruction 源码: ```java public pointcut beanConstruction(Object bean) : initialization(ConfigurableObject+.new(..)) && this(bean); ``` initialization表示匹配构造器的调用,ConfigurableObject+表示ConfigurableObject及其子类,这就说明可以用实现ConfigurableObject接口的方式代替@Configurable注解。this(bean)表示this必须满足this instanceof bean,也就是说被代理的对象必须是bean的子类。 ##### preConstructionCondition ```java private pointcut preConstructionCondition() : leastSpecificSuperTypeConstruction() && preConstructionConfiguration(); ``` 由两个pointcut与运算而来。 ##### leastSpecificSuperTypeConstruction ```java public pointcut leastSpecificSuperTypeConstruction() : initialization(ConfigurableObject.new(..)); ``` ##### preConstructionConfiguration ```java public pointcut preConstructionConfiguration() : preConstructionConfigurationSupport(*); private pointcut preConstructionConfigurationSupport(Configurable c) : @this(c) && if (c.preConstruction()); ``` preConstruction表示@Configurable注解的preConstruction属性,此属性表示是否注入操作可以发生在构造之前,默认false。 ##### postConstructionCondition ```java private pointcut postConstructionCondition() : mostSpecificSubTypeConstruction() && !preConstructionConfiguration(); ``` mostSpecificSubTypeConstruction: ```java public pointcut mostSpecificSubTypeConstruction() : if (thisJoinPoint.getSignature().getDeclaringType() == thisJoinPoint.getThis().getClass()); ``` advise可以声明JoinPoint类型的方法参数,thisJoinpoint指的就是这个。此pointcut的目的是匹配接口/抽象类的最具体的实现。 #### advise ##### 前置 ```java before(Object bean) : beanConstruction(bean) && preConstructionCondition() && inConfigurableBean() { configureBean(bean); } ``` ## 运行 AspectJWeavingEnabler.postProcessBeanFactory: ```java @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { enableAspectJWeaving(this.loadTimeWeaver, this.beanClassLoader); } ``` enableAspectJWeaving: ```java public static void enableAspectJWeaving(LoadTimeWeaver weaverToUse, ClassLoader beanClassLoader) { // 不为空 if (weaverToUse == null) { if (InstrumentationLoadTimeWeaver.isInstrumentationAvailable()) { weaverToUse = new InstrumentationLoadTimeWeaver(beanClassLoader); } else { throw new IllegalStateException("No LoadTimeWeaver available"); } } weaverToUse.addTransformer( new AspectJClassBypassingClassFileTransformer(new ClassPreProcessorAgentAdapter())); } ``` ### LoadTimeWeaverAware AspectJWeavingEnabler实现了LoadTimeWeaverAware接口,那么何时由谁进行注入的呢? 当Context初始化时,AbstractApplicationContext.prepareBeanFactory部分源码: ```java // loadTimeWeaver 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())); } ``` 很明显,关键在于LoadTimeWeaverAwareProcessor,类图: ![LoadTimeWeaverAwareProcessor类图](images/LoadTimeWeaverAwareProcessor.jpg) postProcessBeforeInitialization方法: ```java @Override public Object postProcessBeforeInitialization(Object bean, String beanName) { if (bean instanceof LoadTimeWeaverAware) { LoadTimeWeaver ltw = this.loadTimeWeaver; if (ltw == null) { Assert.state(this.beanFactory != null, "BeanFactory required if no LoadTimeWeaver explicitly specified"); // 去容器找 ltw = this.beanFactory.getBean( ConfigurableApplicationContext.LOAD_TIME_WEAVER_BEAN_NAME, LoadTimeWeaver.class); } ((LoadTimeWeaverAware) bean).setLoadTimeWeaver(ltw); } return bean; } ``` 可以看出,如果本地的loadTimeWeaver为空,那么会去容器找,调用了getBean方法,也就是说DefaultContextLoadTimeWeaver就是在这里初始化的。 BeanFactoryPostProcessor也是一个bean,所以它的初始化也会BeanPostProcessor的处理。不过注意一点: BeanPostProcessor的注册是在BeanFactoryPostProcessor的调用之后进行的: AbstractApplicationContext.refresh: ```java // Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory); // Register bean processors that intercept bean creation. registerBeanPostProcessors(beanFactory); ``` 那么BeanFactoryPostProcessor初始化的时候执行处理的BeanPostProcessor是哪里来的? AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization源码: ```java @Override public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) { Object result = existingBean; for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) { result = beanProcessor.postProcessBeforeInitialization(result, beanName); if (result == null) { return result; } } return result; } ``` getBeanPostProcessors: ```java public List getBeanPostProcessors() { return this.beanPostProcessors; } ``` 可以看出,并没有查找容器的过程,所以此处并不会导致BeanPostProcessor的初始化。问题的关键就在于LoadTimeWeaverAwareProcessor的添加方式: ```java beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory)); ``` 直接将实例添加到BeanFactory中,所以可以得出结论: **我们自定义的BeanPostProcessor不会对BeanFactoryPostProcessor的初始化造成影响,除非使用调用BeanFactory.addBeanPostProcessor的方式进行添加**。 ### BeanClassLoaderAware #### 入口 DefaultContextLoadTimeWeaver同样实现了此接口,那么哪里调用的呢? AbstractAutowireCapableBeanFactory.initializeBean调用了invokeAwareMethods方法,源码: ```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); } } } ``` #### setBeanClassLoader 这个方法很关键,对instrument的获取就是在这里。源码: ```java @Override public void setBeanClassLoader(ClassLoader classLoader) { LoadTimeWeaver serverSpecificLoadTimeWeaver = createServerSpecificLoadTimeWeaver(classLoader); if (serverSpecificLoadTimeWeaver != null) { this.loadTimeWeaver = serverSpecificLoadTimeWeaver; } else if (InstrumentationLoadTimeWeaver.isInstrumentationAvailable()) { this.loadTimeWeaver = new InstrumentationLoadTimeWeaver(classLoader); } else { this.loadTimeWeaver = new ReflectiveLoadTimeWeaver(classLoader); } } ``` 很明显分为三部分。 ##### 服务器agent Spring首先会去检测是否存在服务器的agent代理。按照Spring doc里说的,支持下列服务器: > ``` > Oracle WebLogic 10,GlassFish 3, Tomcat 6, 7 and 8, JBoss AS 5, 6 and 7, IBM WebSphere 7 and 8. > ``` createServerSpecificLoadTimeWeaver源码: ```java protected LoadTimeWeaver createServerSpecificLoadTimeWeaver(ClassLoader classLoader) { String name = classLoader.getClass().getName(); if (name.startsWith("weblogic")) { return new WebLogicLoadTimeWeaver(classLoader); } else if (name.startsWith("org.glassfish")) { return new GlassFishLoadTimeWeaver(classLoader); } else if (name.startsWith("org.apache.catalina")) { return new TomcatLoadTimeWeaver(classLoader); } else if (name.startsWith("org.jboss")) { return new JBossLoadTimeWeaver(classLoader); } else if (name.startsWith("com.ibm")) { return new WebSphereLoadTimeWeaver(classLoader); } return null; } ``` 可以看出,**对于服务器的判断是通过检测当前的类加载器来实现的,因为这些服务器都使用了自己的类加载器实现**。 这也从侧面说明,如果当前处于以上服务器所在的web应用环境,不需要spring-agent.jar便可以实现LTW(载入期织入)。 ##### Spring agent 这个也是测试时使用的。InstrumentationLoadTimeWeaver.isInstrumentationAvailable: ```java public static boolean isInstrumentationAvailable() { return (getInstrumentation() != null); } private static Instrumentation getInstrumentation() { if (AGENT_CLASS_PRESENT) { return InstrumentationAccessor.getInstrumentation(); } else { return null; } } ``` AGENT_CLASS_PRESENT是一个布尔变量,就是判断org.springframework.instrument.InstrumentationSavingAgent是否存在,这个便是spring-agent.jar中唯一的类。 InstrumentationAccessor是InstrumentationLoadTimeWeaver的内部类: ```java private static class InstrumentationAccessor { public static Instrumentation getInstrumentation() { return InstrumentationSavingAgent.getInstrumentation(); } } ``` 这里便是获取spring-agent.jar暴露的Instrumentation对象的地方了。 ##### 反射 在这种情况中,Spring寄托于当前的ClassLoader实现了LoadTimeWeaver的功能,也就是必须有addTransformer方法,如果有,Spring便会把LoadTimeWeaver的职责委托给ClassLoader,如果没有只能抛异常了(抱歉,我们没法支持LTW...),检测的源码位于ReflectiveLoadTimeWeaver的构造器: ```java public ReflectiveLoadTimeWeaver() { this(ClassUtils.getDefaultClassLoader()); } public ReflectiveLoadTimeWeaver(ClassLoader classLoader) { Assert.notNull(classLoader, "ClassLoader must not be null"); this.classLoader = classLoader; this.addTransformerMethod = ClassUtils.getMethodIfAvailable( this.classLoader.getClass(), ADD_TRANSFORMER_METHOD_NAME, ClassFileTransformer.class); if (this.addTransformerMethod == null) { throw new IllegalStateException(); } } ``` ##### 总结 其实可以不用Spring,只使用aspectj自己便可以实现LTW,只需要把代理jar包设为aspect-weaver.jar,并自己编写aop.xml文件以及相应的aspect类即可。可以参考官方文档: [Chapter 5. Load-Time Weaving](http://www.eclipse.org/aspectj/doc/released/devguide/ltw-configuration.html#enabling-load-time-weaving) ### ClassFileTransformer 从enableAspectJWeaving方法的源码可以看出,实际上就是向DefaultContextLoadTimeWeaver添加了一个AspectJClassBypassingClassFileTransformer对象。根据java instrument API的定义,每当一个Class被加载的时候都会去调用挂在Instrumentation上的ClassFileTransformer的transform方法。所以LTW的核心便在这里了。 AspectJClassBypassingClassFileTransformer.transform: ```java @Override public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) { // aspectj自身的类无需检测(织入),直接跳过 if (className.startsWith("org.aspectj") || className.startsWith("org/aspectj")) { return classfileBuffer; } return this.delegate.transform(loader, className, classBeingRedefined, protectionDomain, classfileBuffer); } ``` delegate是一个org.aspectj.weaver.loadtime.ClassPreProcessorAgentAdapter对象。这是一个适配器模式,其类图: ![ClassPreProcessorAgentAdapter类图](images/ClassPreProcessorAgentAdapter.jpg) 根据Aspectj的doc,ClassPreProcessor用于将Aspectj 5对于jdk5依赖代码抽取出来以便可以支持jdk1.3/1.4. ### Aj Aj的preProcess方法很长,其实只干了两件事,都是围绕着WeavingAdaptor进行的。对类的处理也转交给WeavingAdaptor的weaveClass方法。 #### 缓存 Aj使用了WeavingAdaptor缓存机制,确保一个ClassLoader只有一个WeavingAdaptor对象,因为其初始化的成本很高,缓存利用一个key为AdaptorKey(包装了ClassLoader), value为WeavingAdaptor的HashMap来实现。 #### WeavingAdaptor初始化 初始化就是ClassLoaderWeavingAdaptor.initialize方法,初始化分部分来进行说明。Aspectj部分不再详细展开,只对关键的部分进行说明。 ##### aop.xml ###### 解析 aop.xml的解析便是在这里进行。解析的过程无非是xml的解析,下面是其结果如何存储的: 以org.aspectj.weaver.loadtime.definition.Definition为载体,我们以spring-aspects.jar下的aop.xml为例: ```xml ``` 那么解析后的结果: ![aop.xml解析结果](images/aop_xml_parse.png) ###### 注册 入口方法在ClassLoaderWeavingAdaptor.registerDefinitions: ```java private boolean registerDefinitions(final BcelWeaver weaver, final ClassLoader loader, List definitions) { //对应 registerOptions(weaver, loader, definitions); //对应标签 registerAspectExclude(weaver, loader, definitions); //对应标签 registerAspectInclude(weaver, loader, definitions); // success = registerAspects(weaver, loader, definitions); registerIncludeExclude(weaver, loader, definitions); //对应标签 registerDump(weaver, loader, definitions); //忽略返回 } ``` #### 总结 Spring将切面以编译过的Aspectj语言形式定义,不过也可以用原生java类。spring-aspectj包定义的是供各个模块进行LTW的切面。Aspectj部分不再继续向下深入探究。 ================================================ FILE: note/spring-mvc.md ================================================ **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* - [初始化](#%E5%88%9D%E5%A7%8B%E5%8C%96) - [容器初始化](#%E5%AE%B9%E5%99%A8%E5%88%9D%E5%A7%8B%E5%8C%96) - [根容器查找](#%E6%A0%B9%E5%AE%B9%E5%99%A8%E6%9F%A5%E6%89%BE) - [容器创建](#%E5%AE%B9%E5%99%A8%E5%88%9B%E5%BB%BA) - [ApplicationContextInitializer](#applicationcontextinitializer) - [配置解析](#%E9%85%8D%E7%BD%AE%E8%A7%A3%E6%9E%90) - [注解驱动](#%E6%B3%A8%E8%A7%A3%E9%A9%B1%E5%8A%A8) - [静态资源处理](#%E9%9D%99%E6%80%81%E8%B5%84%E6%BA%90%E5%A4%84%E7%90%86) - [拦截器](#%E6%8B%A6%E6%88%AA%E5%99%A8) - [视图](#%E8%A7%86%E5%9B%BE) - [Scope/处理器注册](#scope%E5%A4%84%E7%90%86%E5%99%A8%E6%B3%A8%E5%86%8C) - [MVC初始化](#mvc%E5%88%9D%E5%A7%8B%E5%8C%96) - [文件上传支持](#%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E6%94%AF%E6%8C%81) - [地区解析器](#%E5%9C%B0%E5%8C%BA%E8%A7%A3%E6%9E%90%E5%99%A8) - [主题解析器](#%E4%B8%BB%E9%A2%98%E8%A7%A3%E6%9E%90%E5%99%A8) - [HandlerMapping检查](#handlermapping%E6%A3%80%E6%9F%A5) - [HandlerAdapter检查](#handleradapter%E6%A3%80%E6%9F%A5) - [HandlerExceptionResolver检查](#handlerexceptionresolver%E6%A3%80%E6%9F%A5) - [RequestToViewNameTranslator](#requesttoviewnametranslator) - [ViewResolver检查](#viewresolver%E6%A3%80%E6%9F%A5) - [FlashMapManager](#flashmapmanager) - [HandlerMapping初始化](#handlermapping%E5%88%9D%E5%A7%8B%E5%8C%96) - [RequestMappingHandlerMapping](#requestmappinghandlermapping) - [跨域请求](#%E8%B7%A8%E5%9F%9F%E8%AF%B7%E6%B1%82) - [拦截器初始化](#%E6%8B%A6%E6%88%AA%E5%99%A8%E5%88%9D%E5%A7%8B%E5%8C%96) - [HandlerAdapter初始化](#handleradapter%E5%88%9D%E5%A7%8B%E5%8C%96) - [@ControllerAdvice](#controlleradvice) - [参数解析器](#%E5%8F%82%E6%95%B0%E8%A7%A3%E6%9E%90%E5%99%A8) - [@InitBinder支持](#initbinder%E6%94%AF%E6%8C%81) - [返回结果解析器](#%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E8%A7%A3%E6%9E%90%E5%99%A8) - [请求响应](#%E8%AF%B7%E6%B1%82%E5%93%8D%E5%BA%94) - [请求上下文](#%E8%AF%B7%E6%B1%82%E4%B8%8A%E4%B8%8B%E6%96%87) - [请求分发](#%E8%AF%B7%E6%B1%82%E5%88%86%E5%8F%91) - [处理器查找](#%E5%A4%84%E7%90%86%E5%99%A8%E6%9F%A5%E6%89%BE) - [适配器查找](#%E9%80%82%E9%85%8D%E5%99%A8%E6%9F%A5%E6%89%BE) - [请求处理](#%E8%AF%B7%E6%B1%82%E5%A4%84%E7%90%86) - [Session同步](#session%E5%90%8C%E6%AD%A5) - [参数解析](#%E5%8F%82%E6%95%B0%E8%A7%A3%E6%9E%90) - [策略模式](#%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F) - [自定义参数](#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%8F%82%E6%95%B0) - [参数名是从哪里来的](#%E5%8F%82%E6%95%B0%E5%90%8D%E6%98%AF%E4%BB%8E%E5%93%AA%E9%87%8C%E6%9D%A5%E7%9A%84) - [Model](#model) - [总结](#%E6%80%BB%E7%BB%93) - [返回值解析](#%E8%BF%94%E5%9B%9E%E5%80%BC%E8%A7%A3%E6%9E%90) - [视图渲染](#%E8%A7%86%E5%9B%BE%E6%B8%B2%E6%9F%93) - [ModelAndView](#modelandview) - [渲染](#%E6%B8%B2%E6%9F%93) - [ViewResolver](#viewresolver) - [View](#view) - [拾遗](#%E6%8B%BE%E9%81%97) - [@ResponseBody](#responsebody) - [HttpMessageConverter](#httpmessageconverter) - [自定义](#%E8%87%AA%E5%AE%9A%E4%B9%89) - [默认](#%E9%BB%98%E8%AE%A4) - [转换](#%E8%BD%AC%E6%8D%A2) - [参数解析 & 结果转换](#%E5%8F%82%E6%95%B0%E8%A7%A3%E6%9E%90--%E7%BB%93%E6%9E%9C%E8%BD%AC%E6%8D%A2) - ["纯"对象参数接收](#%E7%BA%AF%E5%AF%B9%E8%B1%A1%E5%8F%82%E6%95%B0%E6%8E%A5%E6%94%B6) - [参数对象构造](#%E5%8F%82%E6%95%B0%E5%AF%B9%E8%B1%A1%E6%9E%84%E9%80%A0) - [参数绑定](#%E5%8F%82%E6%95%B0%E7%BB%91%E5%AE%9A) - [参数校验](#%E5%8F%82%E6%95%B0%E6%A0%A1%E9%AA%8C) - [JSR校验](#jsr%E6%A0%A1%E9%AA%8C) - [自定义校验器](#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A0%A1%E9%AA%8C%E5%99%A8) - [一个有意思的问题](#%E4%B8%80%E4%B8%AA%E6%9C%89%E6%84%8F%E6%80%9D%E7%9A%84%E9%97%AE%E9%A2%98) # 初始化 spring-mvc的核心便是DispatcherServlet,所以初始化也是围绕其展开的。类图: ![DispatcherServlet类图](images/DispatcherServlet.jpg) Servlet标准定义了init方法是其生命周期的初始化方法。 HttpServletBean.init: ```java @Override public final void init() throws ServletException { // Set bean properties from init parameters. PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties); //包装DispatcherServlet,准备放入容器 BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this); //用以加载spring-mvc配置文件 ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext()); bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, getEnvironment())); //没有子类实现此方法 initBeanWrapper(bw); bw.setPropertyValues(pvs, true); // Let subclasses do whatever initialization they like. initServletBean(); } ``` 主要逻辑一目了然。注意**setPropertyValues方法会导致对DispatcherServlet相关setter方法的调用,所以当进行容器初始化时从init-param中读取的参数已被设置到DispatcherServlet的相关字段(Field)中**。 ## 容器初始化 FrameworkServlet.initServletBean简略版源码: ```java @Override protected final void initServletBean() { this.webApplicationContext = initWebApplicationContext(); //空实现,且没有子类覆盖 initFrameworkServlet() } ``` FrameworkServlet.initWebApplicationContext: ```java protected WebApplicationContext initWebApplicationContext() { //根容器查找 WebApplicationContext rootContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext()); WebApplicationContext wac = null; if (this.webApplicationContext != null) { //有可能DispatcherServlet被作为Spring bean初始化,且webApplicationContext已被注入进来 wac = this.webApplicationContext; if (wac instanceof ConfigurableWebApplicationContext) { ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) wac; if (!cwac.isActive()) { if (cwac.getParent() == null) { cwac.setParent(rootContext); } configureAndRefreshWebApplicationContext(cwac); } } } if (wac == null) { //是否已经存在于ServletContext中 wac = findWebApplicationContext(); } if (wac == null) { wac = createWebApplicationContext(rootContext); } if (!this.refreshEventReceived) { onRefresh(wac); } if (this.publishContext) { String attrName = getServletContextAttributeName(); getServletContext().setAttribute(attrName, wac); } return wac; } ``` 下面分部分展开。 ### 根容器查找 spring-mvc支持Spring容器与MVC容器共存,此时,Spring容器即根容器,mvc容器将根容器视为父容器。 Spring容器(根容器)以下列形式进行配置(web.xml): ```xml org.springframework.web.context.ContextLoaderListener ``` 根据Servlet规范,各组件的加载 顺序如下: listener -> filter -> servlet WebApplicationContextUtils.getWebApplicationContext: ```java String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".ROOT"; public static WebApplicationContext getWebApplicationContext(ServletContext sc) { return getWebApplicationContext(sc, WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); } ``` 两参数方法: ```java public static WebApplicationContext getWebApplicationContext(ServletContext sc, String attrName) { Object attr = sc.getAttribute(attrName); if (attr == null) { return null; } return (WebApplicationContext) attr; } ``` 可以得出结论: **如果Spring根容器存在,那么它被保存在ServletContext中,其key为`WebApplicationContext.class.getName() + ".ROOT"`。** ### 容器创建 FrameworkServlet.createWebApplicationContext: ```java protected WebApplicationContext createWebApplicationContext(ApplicationContext parent) { Class contextClass = getContextClass(); if (!ConfigurableWebApplicationContext.class.isAssignableFrom(contextClass)) { throw new ApplicationContextException(); } ConfigurableWebApplicationContext wac = (ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass); wac.setEnvironment(getEnvironment()); wac.setParent(parent); wac.setConfigLocation(getContextConfigLocation()); configureAndRefreshWebApplicationContext(wac); return wac; } ``` 通过对getContextClass方法的调用,Spring允许我们自定义容器的类型,即我们可以在web.xml中如下配置: ```xml SpringMVC org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring-servlet.xml contextClass java.lang.Object ``` configureAndRefreshWebApplicationContext核心源码: ```java protected void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac) { applyInitializers(wac); wac.refresh(); } ``` #### ApplicationContextInitializer ApplicationContextInitializer允许我们在Spring(mvc)容器初始化之前干点坏事,可以通过init-param传入: ```xml contextInitializerClasses 坏事儿 ``` applyInitializers方法正是要触发这些坏事儿。类图: ![ApplicationContextInitializer类图](images/ApplicationContextInitializer.jpg) #### 配置解析 "配置"指的便是spring-servlet.xml: ```xml ``` 而解析的入口便在于对refresh方法的调用,此方法位于AbstractApplicationContext,这一点在spring-core时已经见过了,下面我们重点关注不同于spring-core的地方。 对于spring-mvc来说,其容器默认为XmlWebApplicationContext,部分类图: ![XmlWebApplicationContext类图](images/XmlWebApplicationContext.jpg) XmlWebApplicationContext通过重写loadBeanDefinitions方法改变了bean加载行为,使其指向spring-servlet.xml。 spring-servlet.xml中不同于spring-core的地方便在于引入了mvc命名空间,正如spring-core中笔记中所说的那样,**Spring用过jar包/META-INFO中的.handlers文件定义针对不同的命名空间所使用的解析器**。 mvc命名空间的解析器为MvcNamespaceHandler,部分源码: ```java @Override public void init() { registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser()); registerBeanDefinitionParser("default-servlet-handler", new DefaultServletHandlerBeanDefinitionParser()); registerBeanDefinitionParser("interceptors", new IanterceptorsBeanDefinitionParser()); registerBeanDefinitionParser("view-resolvers", new ViewResolversBeanDefinitionParser()); } ``` 老样子,按部分展开。 ##### 注解驱动 其parse方法负责向Sprng容器注册一些必要的组件,整理如下图: ![mvc-annotation](images/mvc-annotation.png) ##### 静态资源处理 即: ```xml ``` DefaultServletHandlerBeanDefinitionParser.parse负责向容器注册以下三个组件: - DefaultServletHttpRequestHandler - SimpleUrlHandlerMapping - HttpRequestHandlerAdapter ##### 拦截器 InterceptorsBeanDefinitionParser.parse方法负责**将每一项`mvc:interceptor`配置解析为一个MappedInterceptor bean并注册到容器中**。 ##### 视图 有两种方式向Spring容器注册视图: - 以前采用较土的方式: ```xml ``` - 通过特定的标签: ```xml ``` 从这里可以推测出: 拦截器同样支持第一种方式,Spring在查找时应该会查询某一接口的子类。 ViewResolversBeanDefinitionParser.parse方法的作用便是将每一个视图解析为ViewResolver并注册到容器。 #### Scope/处理器注册 AbstractRefreshableWebApplicationContext.postProcessBeanFactory: ```java @Override protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { beanFactory.addBeanPostProcessor( new ServletContextAwareProcessor(this.servletContext, this.servletConfig)); beanFactory.ignoreDependencyInterface(ServletContextAware.class); beanFactory.ignoreDependencyInterface(ServletConfigAware.class); WebApplicationContextUtils.registerWebApplicationScopes(beanFactory, this.servletContext); WebApplicationContextUtils.registerEnvironmentBeans(beanFactory, this.servletContext, this.servletConfig); } ``` ServletContextAwareProcessor用以向实现了ServletContextAware的bean注册ServletContext。 registerWebApplicationScopes用以注册"request", "session", "globalSession", "application"四种scope,scope是个什么东西以及如何自定义,在spring-core中已经进行过说明了。 registerEnvironmentBeans用以将servletContext、servletConfig以及各种启动参数注册到Spring容器中。 ## MVC初始化 入口位于DispatcherServlet的initStrategies方法(经由onRefresh调用): ```java protected void initStrategies(ApplicationContext context) { initMultipartResolver(context); initLocaleResolver(context); initThemeResolver(context); initHandlerMappings(context); initHandlerAdapters(context); initHandlerExceptionResolvers(context); initRequestToViewNameTranslator(context); initViewResolvers(context); initFlashMapManager(context); } ``` 显然,这里就是spring-mvc的核心了。 ### 文件上传支持 initMultipartResolver核心源码: ```java private void initMultipartResolver(ApplicationContext context) { try { this.multipartResolver = context.getBean(MULTIPART_RESOLVER_BEAN_NAME, MultipartResolver.class); } catch (NoSuchBeanDefinitionException ex) { // Default is no multipart resolver. this.multipartResolver = null; } } ``` MultipartResolver用于开启Spring MVC文件上传功能,其类图: ![MultipartResolver类图](images/MultipartResolver.jpg) 也就是说,如果我们要使用文件上传功能,须在容器中注册一个MultipartResolver bean。当然,默认是没有的。 ### 地区解析器 LocaleResolver接口定义了Spring MVC如何获取客户端(浏览器)的地区,initLocaleResolver方法在容器中寻找此bean,如果没有,注册AcceptHeaderLocaleResolver,即根据request的请求头**Accept-Language**获取地区。 spring-mvc采用了属性文件的方式配置默认策略(即bean),此文件位于spring-mvc的jar包的org.springframework.web.servlet下。 ### 主题解析器 ThemeResolver接口配合Spring标签库使用可以通过动态决定使用的css以及图片的方式达到换肤的效果,其类图: ![ThemeResolver类图](images/ThemeResolver.jpg) 如果容器中不存在叫做themeResolver的bean,initThemeResolver方法将向容器中注册FixedThemeResolver,此bean只能提供一套默认的主题,名为theme。 ### HandlerMapping检查 initHandlerMappings方法用于确保容器中**至少含有一个HandlerMapping对象**。从前面配置解析-注解驱动一节中可以看出,注解驱动导致已经注册了两个此对象。 如果没有开启注解驱动,那么将会使用默认的HandlerMapping,相关源码: ```java if (this.handlerMappings == null) { this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class); if (logger.isDebugEnabled()) { logger.debug("No HandlerMappings found in servlet '" + getServletName() + "': using default"); } } ``` 前面提到了,默认的策略由DispatcherServlet.properties决定,**目前是BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping**。 ### HandlerAdapter检查 套路和上面完全一样,默认使用HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter和AnnotationMethodHandlerAdapter。 ### HandlerExceptionResolver检查 套路和上面完全一样,默认使用AnnotationMethodHandlerExceptionResolver、ResponseStatusExceptionResolver、DefaultHandlerExceptionResolver。 ### RequestToViewNameTranslator initRequestToViewNameTranslator方法回向容器中注册一个DefaultRequestToViewNameTranslator对象,此接口用以完成从HttpServletRequest到视图名的解析,其使用场景是**给定的URL无法匹配任何控制器时**。 DefaultRequestToViewNameTranslator的转换例子: http://localhost:8080/gamecast/display.html -> display(视图) 其类图: ![RequestToViewNameTranslator类图](images/RequestToViewNameTranslator.jpg) ### ViewResolver检查 熟悉的套路,默认使用InternalResourceViewResolver。 ### FlashMapManager initFlashMapManager方法会向容器注册SessionFlashMapManager对象,类图: ![FlashMapManager类图](images/FlashMapManager.jpg) 此接口和FlashMap搭配使用,用于在**请求重定向时保存/传递参数**。 ## HandlerMapping初始化 此接口用以根据请求的URL寻找合适的处理器。从前面配置解析一节可以看出,我们的容器中有三个HandlerMapping实现,下面以RequestMappingHandlerMapping位代表进行说明。 ### RequestMappingHandlerMapping 此实现根据@Controller和@RequestMapping注解完成解析。类图(忽略部分接口): ![RequestMappingHandlerMapping类图](images/RequestMappingHandlerMapping.jpg) 初始化的入口位于AbstractHandlerMethodMapping的afterPropertiesSet方法和AbstractHandlerMapping的initApplicationContext方法,afterPropertiesSet调用了initHandlerMethods: ```java protected void initHandlerMethods() { //获取容器中所有的bean String[] beanNames = (this.detectHandlerMethodsInAncestorContexts ? BeanFactoryUtils.beanNamesForTypeIncludingAncestors(getApplicationContext(), Object.class) :getApplicationContext().getBeanNamesForType(Object.class)); for (String beanName : beanNames) { if (!beanName.startsWith(SCOPED_TARGET_NAME_PREFIX)) { Class beanType = null; beanType = getApplicationContext().getType(beanName); //isHandler方法的原理: //判断类上有没有@Controller注解或者是@RequestMapping注解 if (beanType != null && isHandler(beanType)) { detectHandlerMethods(beanName); } } } //空实现 handlerMethodsInitialized(getHandlerMethods()); } ``` detectHandlerMethods方法将反射遍历类中所有的public方法,如果方法上含有@RequestMapping注解,那么将方法上的路径与类上的基础路径(如果有)进行合并,之后将映射(匹配关系)注册到MappingRegistry中。 注意,**类上的@RequestMapping注解只能作为基路径存在,也就是说,如果类里面没有任何的方法级@RequestMapping注解,那么类上的注解是没有意义的**。这一点可以从实验和源码上得到证实。 下面我们关注一下映射关系是如何保存(注册)的。 内部类AbstractHandlerMethodMapping.MappingRegistry是映射的载体,类图: ![MappingRegistry类图](images/MappingRegistry.jpg) 其register方法简略版源码: ```java public void register(T mapping, Object handler, Method method) { //包装bean和方法 HandlerMethod handlerMethod = createHandlerMethod(handler, method); this.mappingLookup.put(mapping, handlerMethod); List directUrls = getDirectUrls(mapping); for (String url : directUrls) { this.urlLookup.add(url, mapping); } String name = null; if (getNamingStrategy() != null) { name = getNamingStrategy().getName(handlerMethod, mapping); addMappingName(name, handlerMethod); } CorsConfiguration corsConfig = initCorsConfiguration(handler, method, mapping); if (corsConfig != null) { this.corsLookup.put(handlerMethod, corsConfig); } this.registry.put(mapping, new MappingRegistration(mapping, handlerMethod, directUrls, name)); } ``` mapping其实是一个RequestMappingInfo对象,可以将其看做是**@RequestMapping注解各种属性的一个封装**。最终由RequestMappingInfo.createRequestMappingInfo方法创建,源码: ```java protected RequestMappingInfo createRequestMappingInfo( RequestMapping requestMapping, RequestCondition customCondition) { return RequestMappingInfo .paths(resolveEmbeddedValuesInPatterns(requestMapping.path())) .methods(requestMapping.method()) .params(requestMapping.params()) .headers(requestMapping.headers()) .consumes(requestMapping.consumes()) .produces(requestMapping.produces()) .mappingName(requestMapping.name()) .customCondition(customCondition) .options(this.config) .build(); } ``` 这就很明显了,具体每种属性什么意义可以参考@RequestMapping源码。 register方法中urlLookup其实就是将paths属性中的每个path都与处理器做映射。 getNamingStrategy方法得到的是一个HandlerMethodMappingNamingStrategy接口的实例,此接口用以根据HandlerMethod得到一个名字,类图: ![HandlerMethodMappingNamingStrategy类图](images/HandlerMethodMappingNamingStrategy.jpg) 比如对于我们的控制器,SimpleController.echo方法,最终得到的名字将是SC#echo。 #### 跨域请求 spring-mvc自4.2开启加入了跨域请求Cors的支持,主要有两种配置方式: - xml: ```xml ``` - @CrossOrigin注解。 Cors的原理可以参考: [探讨跨域请求资源的几种方式](http://www.cnblogs.com/dojo-lzz/p/4265637.html) 而initCorsConfiguration方法的作用便是将@CrossOrigin注解的各种属性封装在CorsConfiguration中。 #### 拦截器初始化 AbstractHandlerMapping.initApplicationContext: ```java @Override protected void initApplicationContext() throws BeansException { detectMappedInterceptors(this.adaptedInterceptors); } ``` 作用就是从容器中获取所有MappedInterceptor bean并放到adaptedInterceptors中,前面提到过了,我们使用mvc:interceptor定义的拦截器其实就是MappedInterceptor对象。类图: ![MappedInterceptor类图](images/MappedInterceptor.jpg) ## HandlerAdapter初始化 同样,我们以RequestMappingHandlerAdapter为例进行说明,类图: ![RequestMappingHandlerAdapter类图](images/RequestMappingHandlerAdapter.jpg) 显然,入口在afterPropertiesSet方法: ```java @Override public void afterPropertiesSet() { // Do this first, it may add ResponseBody advice beans initControllerAdviceCache(); if (this.argumentResolvers == null) { List resolvers = getDefaultArgumentResolvers(); this.argumentResolvers = new HandlerMethodArgumentResolverComposite() .addResolvers(resolvers); } if (this.initBinderArgumentResolvers == null) { List resolvers = getDefaultInitBinderArgumentResolvers(); this.initBinderArgumentResolvers = new HandlerMethodArgumentResolverComposite() .addResolvers(resolvers); } if (this.returnValueHandlers == null) { List handlers = getDefaultReturnValueHandlers(); this.returnValueHandlers = new HandlerMethodReturnValueHandlerComposite() .addHandlers(handlers); } } ``` ### @ControllerAdvice initControllerAdviceCache方法用以解析并存储标注了@ControllerAdvice的bean,这东西是干什么的参考: [Spring3.2新注解@ControllerAdvice](http://jinnianshilongnian.iteye.com/blog/1866350) ### 参数解析器 HandlerMethodArgumentResolver即参数解析器,负责从request中解析、得到Controller方法所需的参数。afterPropertiesSet方法设置了一组默认的解析器。具体是哪些参考getDefaultArgumentResolvers方法。类图: ![HandlerMethodArgumentResolver类图](images/HandlerMethodArgumentResolver.jpg) ### @InitBinder支持 此注解定义的其实是自定义类型转换器。使用方法参考: [springMVC @initBinder 使用](http://blog.csdn.net/songzaiblog/article/details/49757253) getDefaultInitBinderArgumentResolvers返回了一组默认使用的转换器,不过其实这里的转换器和上面的参数解析器其实是一个类型的,这里留个坑。 ### 返回结果解析器 HandlerMethodReturnValueHandler接口用以处理方法调用(Controller方法)的返回值,类图: ![HandlerMethodReturnValueHandler类图](images/HandlerMethodReturnValueHandler.jpg) getDefaultReturnValueHandlers方法便返回了一坨这东西。 # 请求响应 我们先来看一下入口在哪。众所周知,Servlet标准定义了所有请求先由service方法处理,如果是get或post方法,那么再交由doGet或是doPost方法处理。 FrameworkServlet覆盖了service方法: ```java @Override protected void service(HttpServletRequest request, HttpServletResponse response) { HttpMethod httpMethod = HttpMethod.resolve(request.getMethod()); if (HttpMethod.PATCH == httpMethod || httpMethod == null) { processRequest(request, response); } else { super.service(request, response); } } ``` Spring要覆盖此方法的目的在于拦截PATCH请求,PATCH请求与PUT类似,不同在于PATCH是局部更新,而后者是全部更新。可以参考: [PATCH和PUT方法的区别?](https://segmentfault.com/q/1010000005685904) FrameworkServlet同样也覆盖了doGet和doPost方法,两者只是调用processRequest方法。 ## 请求上下文 Spring MVC会在请求分发之前进行上下文的准备工作,含两部分: 1. 将地区(Locale)和请求属性以ThreadLocal的方法与当前线程进行关联,分别可以通过LocaleContextHolder和RequestContextHolder进行获取。 2. 将WebApplicationContext、FlashMap等组件放入到Request属性中。 ## 请求分发 DispatcherServlet.doDispatch简略版源码: ```java protected void doDispatch(HttpServletRequest request, HttpServletResponse response) { HandlerExecutionChain mappedHandler = getHandler(processedRequest); HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); applyDefaultViewName(processedRequest, mv); mappedHandler.applyPostHandle(processedRequest, response, mv); processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); } ``` ### 处理器查找 即为请求寻找合适的Controller的过程。DispatcherServlet.getHandler: ```java protected HandlerExecutionChain getHandler(HttpServletRequest request) { for (HandlerMapping hm : this.handlerMappings) { HandlerExecutionChain handler = hm.getHandler(request); if (handler != null) { return handler; } } return null; } ``` 从这里可以看出,寻找处理器实际上委托给HandlerMapping实现,寻找的过程便是遍历所有的HandlerMapping进行查找,**一旦找到,那么不再继续进行遍历**。也就是说HandlerMapping之间有优先级的概念,而根据AnnotationDrivenBeanDefinitionParser的注释,RequestMappingHandlerMapping其实有最高的优先级。 AbstractHandlerMapping.getHandler: ```java @Override public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { Object handler = getHandlerInternal(request); HandlerExecutionChain executionChain = getHandlerExecutionChain(handler, request); //判断请求头中是否有ORIGIN字段 if (CorsUtils.isCorsRequest(request)) { CorsConfiguration globalConfig = this.corsConfigSource.getCorsConfiguration(request); CorsConfiguration handlerConfig = getCorsConfiguration(handler, request); CorsConfiguration config = (globalConfig != null ? globalConfig.combine(handlerConfig) : handlerConfig); executionChain = getCorsHandlerExecutionChain(request, executionChain, config); } return executionChain; } ``` getHandlerInternal方法便是根据url进行查找的过程,可以参见MVC初始化-HandlerMapping初始化一节。下面重点是执行链的生成。 getHandlerExecutionChain方法的原理就是从adaptedInterceptors中获得所有可以适配当前请求URL的MappedInterceptor并将其添加到HandlerExecutionChain的拦截器列表中。拦截器的顺序其实就是我们定义/注册的顺序。 从getCorsHandlerExecutionChain的源码中可以看出,对于跨域请求其实是向调用链插入了一个CorsInterceptor。 ### 适配器查找 DispatcherServlet.getHandlerAdapter: ```java protected HandlerAdapter getHandlerAdapter(Object handler) { for (HandlerAdapter ha : this.handlerAdapters) { if (ha.supports(handler)) { return ha; } } } ``` 从前面配置解析-注解驱动可以看出,第一个适配器是RequestMappingHandlerAdapter,而其support方法直接返回true,这就导致了使用的适配器总是这一个。 ## 请求处理 RequestMappingHandlerAdapter.handleInternal: ```java @Override protected ModelAndView handleInternal(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod){ ModelAndView mav; // Execute invokeHandlerMethod in synchronized block if required. if (this.synchronizeOnSession) { HttpSession session = request.getSession(false); if (session != null) { Object mutex = WebUtils.getSessionMutex(session); synchronized (mutex) { mav = invokeHandlerMethod(request, response, handlerMethod); } } else { // No HttpSession available -> no mutex necessary mav = invokeHandlerMethod(request, response, handlerMethod); } } else { // No synchronization on session demanded at all... mav = invokeHandlerMethod(request, response, handlerMethod); } if (!response.containsHeader(HEADER_CACHE_CONTROL)) { if (getSessionAttributesHandler(handlerMethod).hasSessionAttributes()) { applyCacheSeconds(response, this.cacheSecondsForSessionAttributeHandlers); } else { prepareResponse(response); } } return mav; } ``` ### Session同步 可以看出,如果开启了synchronizeOnSession,那么**同一个session的请求将会串行执行**,这一选项默认是关闭的,当然我们可以通过注入的方式进行改变。 ### 参数解析 #### 策略模式 正如前面HandlerAdapter初始化-参数解析器一节提到的,HandlerAdapter内部含有一组解析器负责对各类型的参数进行解析。下面我们就常用的自定义参数和Model为例进行说明。 #### 自定义参数 解析由RequestParamMethodArgumentResolver完成。 supportsParameter方法决定了一个解析器可以解析的参数类型,该解析器支持@RequestParam标准的参数或是**简单类型**的参数,具体参见其注释。为什么此解析器可以同时解析@RequestParam注解和普通参数呢?玄机在于RequestMappingHandlerAdapter方法在初始化参数解析器时其实初始化了**两个RequestMappingHandlerAdapter对象**,getDefaultArgumentResolvers方法相关源码: ```java private List getDefaultArgumentResolvers() { resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), this.requestResponseBodyAdvice)); // Catch-all resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true)); } ``` useDefaultResolution参数用于启动对常规类型参数的解析,这里的常规类型指的又是什么呢? 实际上由BeanUtils.isSimpleProperty方法决定: ```java public static boolean isSimpleProperty(Class clazz) { Assert.notNull(clazz, "Class must not be null"); return isSimpleValueType(clazz) || (clazz.isArray() && isSimpleValueType(clazz.getComponentType())); } public static boolean isSimpleValueType(Class clazz) { return (ClassUtils.isPrimitiveOrWrapper(clazz) || clazz.isEnum() || CharSequence.class.isAssignableFrom(clazz) || Number.class.isAssignableFrom(clazz) || Date.class.isAssignableFrom(clazz) || URI.class == clazz || URL.class == clazz || Locale.class == clazz || Class.class == clazz); } ``` 忽略复杂的调用关系,最核心的实现位于resolveName方法,部分源码: ```java @Override protected Object resolveName(String name, MethodParameter parameter, NativeWebRequest request) { if (arg == null) { String[] paramValues = request.getParameterValues(name); if (paramValues != null) { arg = (paramValues.length == 1 ? paramValues[0] : paramValues); } } return arg; } ``` name就是方法的参数名,可以看出,参数解析**就是根据参数名去request查找对应属性的过程**,在这里参数类型并没有起什么作用。 ###### 参数名是从哪里来的 方法名获取的入口位于RequestParamMethodArgumentResolver的resolveArgument方法: ```java @Override public final Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { NamedValueInfo namedValueInfo = getNamedValueInfo(parameter); } ``` getNamedValueInfo方法最终完成对MethodParameter的getParameterName方法的调用: ```java public String getParameterName() { ParameterNameDiscoverer discoverer = this.parameterNameDiscoverer; if (discoverer != null) { String[] parameterNames = (this.method != null ? discoverer.getParameterNames(this.method) : discoverer.getParameterNames(this.constructor)); if (parameterNames != null) { this.parameterName = parameterNames[this.parameterIndex]; } this.parameterNameDiscoverer = null; } return this.parameterName; } ``` 显然,参数名的获取由接口ParameterNameDiscoverer完成: ![ParameterNameDiscoverer](images/ParameterNameDiscoverer.jpg) 默认采用DefaultParameterNameDiscoverer,但此类其实相当于StandardReflectionParameterNameDiscoverer和LocalVariableTableParameterNameDiscoverer的组合,且前者先于后者进行解析。 StandardReflectionParameterNameDiscoverer.getParameterNames: ```java @Override public String[] getParameterNames(Method method) { Parameter[] parameters = method.getParameters(); String[] parameterNames = new String[parameters.length]; for (int i = 0; i < parameters.length; i++) { Parameter param = parameters[i]; if (!param.isNamePresent()) { return null; } parameterNames[i] = param.getName(); } return parameterNames; } ``` 此类被注解UsesJava8标注,其原理就是利用的jdk8的-parameters编译参数,只有在加上此选项的情况下才能用反射的方法获得真实的参数名,所以一般情况下StandardReflectionParameterNameDiscoverer是无法成功获取参数名的。 LocalVariableTableParameterNameDiscoverer利用了ASM直接访问class文件中的本地变量表来得到变量名,下面是使用`javap -verbose`命令得到的本地变量表示例: ![本地变量表](images/local_variable_tables.PNG) 但是默认情况下javac compiler是不生成本地变量表这种调试信息的,需要加`-g`参数才可以,那为什么在我们的测试Controller中却可以获得呢,玄机就在于idea的下列设置: ![idea编译设置](images/idea_debug_info.PNG) 取消这项设置的勾选再次运行程序便出问题了: ![调试信息错误](images/debug_info_error.PNG) #### Model 解析由ModelMethodProcessor完成。 supportsParameter方法很简单: ```java @Override public boolean supportsParameter(MethodParameter parameter) { return Model.class.isAssignableFrom(parameter.getParameterType()); } ``` 很直白了。 resolveArgument: ```java @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { return mavContainer.getModel(); } ``` 忽略各种调用关系,**Model其实是一个BindingAwareModelMap对象,且每次请求(需要注入Model的前提下)都有一个新的该对象生成**。类图: ![BindingAwareModelMap类图](images/BindingAwareModelMap.jpg) #### 总结 - 我们可以通过实现HandlerMethodArgumentResolver接口并将其注册容器的方式实现自定义参数类型的解析。 - 为了防止出现参数名获取不到的问题,应优先使用@RequestParam注解直接声明需要的参数名称。 ### 返回值解析 套路和上面是一样的,通常情况,我们返回的其实是view名,负责处理的是ViewNameMethodReturnValueHandler, supportsReturnType方法: ```java @Override public boolean supportsReturnType(MethodParameter returnType) { Class paramType = returnType.getParameterType(); return (void.class == paramType || CharSequence.class.isAssignableFrom(paramType)); } ``` handleReturnValue: ```java @Override public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) { if (returnValue instanceof CharSequence) { String viewName = returnValue.toString(); mavContainer.setViewName(viewName); // 判断的依据: 是否以redirect:开头 if (isRedirectViewName(viewName)) { mavContainer.setRedirectModelScenario(true); } } } ``` 可见这里并没有进行实际的处理,只是解析得到了最终的视图名称。 ### 视图渲染 由DispatcherServlet的processDispatchResult方法完成,源码: ```java private void processDispatchResult(HttpServletRequest request, HttpServletResponse response, HandlerExecutionChain mappedHandler, ModelAndView mv, Exception exception) { boolean errorView = false; if (exception != null) { //一般不会到这个分支 if (exception instanceof ModelAndViewDefiningException) { mv = ((ModelAndViewDefiningException) exception).getModelAndView(); } else { Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null); mv = processHandlerException(request, response, handler, exception); errorView = (mv != null); } } // Did the handler return a view to render? if (mv != null && !mv.wasCleared()) { render(mv, request, response); if (errorView) { WebUtils.clearErrorRequestAttributes(request); } } } ``` 可以看出,处理**根据是否抛出异常分为了两种情况**。 如果抛出了异常,那么processHandlerException方法将会遍历所有的HandlerExceptionResolver实例,默认有哪些参考MVC初始化-HandlerExceptionResolver检查一节。默认的处理器用于改变响应状态码、调用标注了@ExceptionHandler的bean进行处理,如果没有@ExceptionHandler的bean或是不能处理此类异常,那么就会导致ModelAndView始终为null,最终Spring MVC将异常向上抛给Tomcat,然后Tomcat就会把堆栈打印出来。 如果我们想将其定向到指定的错误页面,可以这样配置: ```xml ``` 此处理器会返回一个非空的ModelAndView。 #### ModelAndView 回过头来看一下这到底是个什么东西。类图: ![ModelAndView类图](images/ModelAndView.jpg) 很直白。 怎么生成的。RequestMappingHandlerAdapter.getModelAndView相关源码: ```java ModelMap model = mavContainer.getModel(); ModelAndView mav = new ModelAndView(mavContainer.getViewName(), model, mavContainer.getStatus()); ``` #### 渲染 DispatcherServlet.render简略版源码: ```java protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) { Locale locale = this.localeResolver.resolveLocale(request); response.setLocale(locale); View view; //判断依据: 是否是String类型 if (mv.isReference()) { // We need to resolve the view name. view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request); } else { // No need to lookup: the ModelAndView object contains the actual View object. view = mv.getView(); } if (mv.getStatus() != null) { response.setStatus(mv.getStatus().value()); } view.render(mv.getModelInternal(), request, response); } ``` resolveViewName方法将会遍历所有的ViewResolver bean,只要有一个解析的结果(View)不为空,即停止遍历。根据MVC初始化-ViewResolver检查一节和我们的配置文件可知,容器中有两个ViewResolver ,分别是: InternalResourceViewResolver和UrlBasedViewResolver。 ##### ViewResolver 类图(忽略实现类): ![ViewResolver类图](images/ViewResolver.jpg) resolveViewName方法的源码不再贴出,其实只做了一件事: 用反射创建并初始化我们指定的View,根据我们的配置,就是JstlView。 ##### View 类图: ![JstlView类图](images/JstlView.jpg) 渲染的核心逻辑位于InternalResourceView.renderMergedOutputModel,简略版源码: ```java @Override protected void renderMergedOutputModel( Map model, HttpServletRequest request, HttpServletResponse response) { // 将Model中的属性设置的request中 exposeModelAsRequestAttributes(model, request); // 获取资源(jsp)路径 String dispatcherPath = prepareForRendering(request, response); // Obtain a RequestDispatcher for the target resource (typically a JSP). RequestDispatcher rd = getRequestDispatcher(request, dispatcherPath); // If already included or response already committed, perform include, else forward. if (useInclude(request, response)) { response.setContentType(getContentType()); rd.include(request, response); } else { // Note: The forwarded resource is supposed to determine the content type itself. rd.forward(request, response); } } ``` 可以看出,对jsp来说,所谓的渲染其实就是**将Model中的属性设置到Request,再利用原生Servlet RequestDispatcher API进行转发的过程**。 # 拾遗 ## @ResponseBody 通常我们可以在Controller或方法上标注@ResponseBody注解以表示需要将对象转为JSON并返回给前端,那么Spring MVC是如何自动完成这一过程的呢? 从前面初始化-容器初始化-容器创建-配置解析一节可以看出,Spring MVC采用org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser进行配置的解析,核心的parse方法中完成了对HttpMessageConverter的初始化。 ### HttpMessageConverter Spring的HttpMessageConverter接口负责HTTP请求-Java对象与Java对象-响应之间的转换。我们以Spring默认使用的Jackson转换器为例,类图: ![HttpMessageConverter](images/HttpMessageConverter.jpg) HttpMessageConverter实现的初始化由AnnotationDrivenBeanDefinitionParser的getMessageConverters方法完成,HttpMessageConverter的来源分为自定义和默认。 示例配置: ```xml ``` #### 自定义 Spring允许我们通过XML配置文件的message-converters元素来进行自定义。 #### 默认 当**检测到没有配置message-converters元素或者register-defaults="true"时Spring便会注册默认转换器**。这其中便包括MappingJacksonHttpMessageConverter,相关源码: ```java else if (jacksonPresent) { messageConverters.add(createConverterDefinition( org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.class, source)); } ``` jacksonPresent声明: ```java private static final boolean jacksonPresent = ClassUtils.isPresent("org.codehaus.jackson.map.ObjectMapper", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()) && ClassUtils.isPresent("org.codehaus.jackson.JsonGenerator", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); ``` ### 转换 入口位于ServletInvocableHandlerMethod的invokeAndHandle方法对于响应的处理: ```java this.returnValueHandlers.handleReturnValue(returnValue, getReturnValueType(returnValue), mavContainer, webRequest); ``` returnValueHandlers其实就是RequestMappingHandlerAdapter内部的returnValueHandlers,后者由RequestMappingHandlerAdapter的afterPropertiesSet方法初始化,关键在于: ```java handlers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), this.contentNegotiationManager)); ``` 对象到JSON的转换正是由RequestResponseBodyMethodProcessor完成,ServletInvocableHandlerMethod通过supportsReturnType方法决定HandlerMethodReturnValueHandler是否可以处理当前返回类型或返回方法,RequestResponseBodyMethodProcessor的实现: ```java @Override public boolean supportsReturnType(MethodParameter returnType) { return ((AnnotationUtils.findAnnotation(returnType.getContainingClass(), ResponseBody.class) != null) || (returnType.getMethodAnnotation(ResponseBody.class) != null)); } ``` 核心的handleReturnValue方法: ```java @Override public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) { mavContainer.setRequestHandled(true); if (returnValue != null) { writeWithMessageConverters(returnValue, returnType, webRequest); } } ``` 这里其实是通过HttpMessageConverter的canRead或canWrite方法来判断给定的转换器是否合适,canWrite方法实现: ```java @Override public boolean canWrite(Class clazz, MediaType mediaType) { return (this.objectMapper.canSerialize(clazz) && canWrite(mediaType)); } ``` 这里剩下的便是Jackson的事情了,注意MappingJacksonHttpMessageConverter中的objectMapper被所有的线程所共享,因为其是线程安全的,但是这样是否有性能问题? ## 参数解析 & 结果转换 Spring MVC中参数到各种类型的转换由HandlerMethodArgumentResolver接口完成,而Controller返回值到真正的响应的转换由HandlerMethodReturnValueHandler接口完成。两者分别负责Spring MVC中数据的输入与输出,可用下图表示: ![Spring MVC输入输出转换](images/mvc_input_output.PNG) HandlerMethodArgumentResolver接口及其主要实现类如下图: ![HandlerMethodArgumentResolver](images/HandlerMethodArgumentResolver_all.jpg) HandlerMethodReturnValueHandler接口以及主要实现类如下: ![HandlerMethodReturnValueHandler](images/HandlerMethodReturnValueHandler_all.jpg) 其实有很多类同时实现了两个接口,比如RequestResponseBodyMethodProcessor,这样的类一般以Processor结尾。 两种转换器的初始化由HandlerAdapter完成,这也很好的体现了HandlerAdapter接口的功能。以喜闻乐见的RequestMappingHandlerAdapter为例,其初始化的HandlerMethodReturnValueHandler列表如下: - ModelAndViewMethodReturnValueHandler - ModelMethodProcessor - HttpEntityMethodProcessor - HttpHeadersReturnValueHandler - CallableMethodReturnValueHandler - DeferredResultMethodReturnValueHandler - AsyncTaskMethodReturnValueHandler - ListenableFutureReturnValueHandler - ModelAttributeMethodProcessor - RequestResponseBodyMethodProcessor - ViewNameMethodReturnValueHandler - MapMethodProcessor - ModelAndViewResolverMethodReturnValueHandler 从中也可以推测出我们可以把哪些类型的值(对象)直接"丢给"Spring。 对于HandlerMethodArgumentResolver和HandlerMethodReturnValueHandler来说,HttpMessageConverter像是两者手中用来实现功能的武器。 ## "纯"对象参数接收 假设有如下这样的Controller: ```java @RequestMapping("/echoAgain") public String echo(SimpleModel simpleModel, Model model) { model.addAttribute("echo", "hello " + simpleModel.getName() + ", your age is " + simpleModel.getAge() + "."); return "echo"; } ``` 经过测试可以发现,SimpleModel参数既可以接收get请求,也可以接收post请求。那么在这种情况下请求参数是被哪个参数解析器解析的呢,debug发现: ServletModelAttributeMethodProcessor: ![ServletModelAttributeMethodProcessor](images/ServletModelAttributeMethodProcessor.jpg) 核心的supportsParameter方法由父类ModelAttributeMethodProcessor实现: ```java @Override public boolean supportsParameter(MethodParameter parameter) { return (parameter.hasParameterAnnotation(ModelAttribute.class) || (this.annotationNotRequired && !BeanUtils.isSimpleProperty(parameter.getParameterType()))); } ``` 可以看出,这里支持带有ModelAttribute注解或者是非基本类型的参数解析,同时annotationNotRequired必须设为false,即ModelAttribute注解不必存在,这里是在ServletModelAttributeMethodProcessor的构造器中进行控制的, RequestMappingHandlerAdapter.getDefaultArgumentResolvers部分源码: ```java resolvers.add(new ServletModelAttributeMethodProcessor(false)); ``` 此类的作用是对@ModelAttribute注解标注的参数进行解析,假设我们将Controller方法改写成: ```java @RequestMapping("/echoAgain") public String echo(@ModelAttribute SimpleModel simpleModel, Model model) { model.addAttribute("echo", "hello " + simpleModel.getName() + ", your age is " + simpleModel.getAge() + "."); System.out.println(model.asMap().get("simpleModel")); return "echo"; } ``` 首先,Spring会首先反射生成一个SimpleModel对象,之后将从request中获取的参数尝试设置到SimpleModel对象中去,最后将此对象放置到Model中(本质上就是一个Map),key就是simpleModel.下面我们来看一下具体的解析过程,整个过程可以分为 以下三部分: ### 参数对象构造 因为SimpleModel是一个对象类型,所以要想将参数注入到其中,第一步必然是先创建一个对象,创建的入口位于ModelAttributeMethodProcessor的resolveArgument方法,相关源码: ```java //name在这里便是simpleModel String name = ModelFactory.getNameForParameter(parameter); Object attribute = (mavContainer.containsAttribute(name) ? mavContainer.getModel().get(name) : createAttribute(name, parameter, binderFactory, webRequest));//反射实例化 ``` ModelAndViewContainer是个什么东西呢,从名字就可以看出就,它是Spring MVC里两个重要概念Model和View的组合体,用来记录在请求响应过程中Model和View的变化,在这里可以简单理解为去Model中检查有没有叫simpleModel的属性已经存在。 ### 参数绑定 这里使用到了DataBinder接口,按照注释的说明,此接口用以**向执行的对象中设置属性值**,就是这么简单,其继承体系如下图: ![DataBinder](images/DataBinder.jpg) WebDataBinderFactory接口用以创建WebDataBinder对象,其继承体系如下图: ![WebDataBinderFactory](images/WebDataBinderFactory.jpg) 默认使用的是ServletRequestDataBinderFactory,创建了一个ExtendedServletRequestDataBinder对象: ```java @Override protected ServletRequestDataBinder createBinderInstance(Object target, String objectName, NativeWebRequest request) { return new ExtendedServletRequestDataBinder(target, objectName); } ``` 参数绑定的入口位于ModelAttributeMethodProcessor.resolveArgument方法,相关源码: ```java if (!mavContainer.isBindingDisabled(name)) { bindRequestParameters(binder, webRequest); } ``` 接下来由ServletRequestDataBinder的bind方法完成,核心源码: ```java public void bind(ServletRequest request) { MutablePropertyValues mpvs = new ServletRequestParameterPropertyValues(request); doBind(mpvs); } ``` 在ServletRequestParameterPropertyValues构造器中获取了Request中所有的属性对。doBind方法便是调用前面初始化的目标对象的setter方法进行参数设置的过程,不再展开。 ### 参数校验 将我们的Controller方法改写为下面这种形式便可以启动Spring MVC的参数校验: ```java @RequestMapping("/echoAgain") public String echo(@Validated SimpleModel simpleModel, Model model) { model.addAttribute("echo", "hello " + simpleModel.getName() + ", your age is " + simpleModel.getAge() + "."); System.out.println(model.asMap().get("simpleModel")); return "echo"; } ``` 在这里@Validated注解可以用@Valid(javax)替换,前者是Spring对java校验标准的扩充,增加了校验组的支持。 为什么参数校验要放到参数绑定后面进行说明呢,因为**@Validated和@valid注解不会影响Spring MVC参数解析的行为,被这两个注解标注的对象仍是由参数绑定一节提到的解析器进行解析。** 当参数校验绑定之后,Spring MVC会尝试对参数进行校验,如果我们设置了校验注解。ModelAttributeMethodProcessor.resolveArgument方法相关源码: ```java validateIfApplicable(binder, parameter); protected void validateIfApplicable(WebDataBinder binder, MethodParameter methodParam) { Annotation[] annotations = methodParam.getParameterAnnotations(); for (Annotation ann : annotations) { Validated validatedAnn = AnnotationUtils.getAnnotation(ann, Validated.class); if (validatedAnn != null || ann.annotationType().getSimpleName().startsWith("Valid")) { Object hints = (validatedAnn != null ? validatedAnn.value() : AnnotationUtils.getValue(ann)); Object[] validationHints = (hints instanceof Object[] ? (Object[]) hints : new Object[] {hints}); binder.validate(validationHints); break; } } } ``` DataBinder.validate: ```java public void validate(Object... validationHints) { for (Validator validator : getValidators()) { if (!ObjectUtils.isEmpty(validationHints) && validator instanceof SmartValidator) { ((SmartValidator) validator).validate(getTarget(), getBindingResult(), validationHints); } else if (validator != null) { validator.validate(getTarget(), getBindingResult()); } } } ``` 可见,具体的校验交给了`org.springframework.validation.Validator`实现,类图: ![Validator](images/Validator.png) getValidators方法获取的实际上是DataBinder内部的validators字段: ```java private final List validators = new ArrayList(); ``` 根据这里的校验器的来源可以分为以下两种情况。 #### JSR校验 需要引入hibernate-validator到classpath中,回顾最前面配置解析部分,配置: ```xml ``` 会利用AnnotationDrivenBeanDefinitionParser进行相关的解析、初始化工作,正是在其parse方法完成了对JSR校验的支持。相关源码: ```java @Override public BeanDefinition parse(Element element, ParserContext parserContext) { RuntimeBeanReference validator = getValidator(element, source, parserContext); } private RuntimeBeanReference getValidator(Element element, Object source, ParserContext parserContext) { //mvc:annotation-driven配置支持validator属性 if (element.hasAttribute("validator")) { return new RuntimeBeanReference(element.getAttribute("validator")); } else if (javaxValidationPresent) { RootBeanDefinition validatorDef = new RootBeanDefinition( "org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean"); validatorDef.setSource(source); validatorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); String validatorName = parserContext.getReaderContext().registerWithGeneratedName(validatorDef); parserContext.registerComponent(new BeanComponentDefinition(validatorDef, validatorName)); return new RuntimeBeanReference(validatorName); } else { return null; } } ``` javaxValidationPresent的定义: ```java private static final boolean javaxValidationPresent = ClassUtils.isPresent("javax.validation.Validator", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); ``` 实现了InitializingBean接口,所以afterPropertiesSet方法是其初始化的入口,具体的校验过程不再展开。 除此之外还有一个有意思的问题,就是上面提到的校验器是如何进入到DataBinder中去的呢?答案是WebDataBinderFactory创建DataBinder对象时会利用WebBindingInitializer对DataBinder进行初始化,正是在这里 将容器中存在的校验器设置到DataBinder中,至于WebBindingInitializer又是从哪里来的,不再探究了,否则这细节实在是太麻烦了,意义不大。 #### 自定义校验器 我们可以实现Spring提供的Validator接口,然后在Controller里边这样设置我们要是用的校验器: ```java @InitBinder public void initBinder(DataBinder dataBinder) { dataBinder.setValidator(new SimpleModelValidator()); //如果有多个可以使用addValidators方法 } ``` 我们的Controller方法依然可以如此定义: ```java @RequestMapping("/echoAgain") public String echo(@Validated SimpleModel simpleModel, Model model) { return "echo"; } ``` 如果有错误,会直接返回400. #### 一个有意思的问题 如果我们把Controller方法这样定义会怎样? ```java @RequestMapping(value = "/echoAgain", method = RequestMethod.POST) public String echo(@Validated @RequestBody SimpleModel simpleModel, Model model) {} ``` 答案是@RequestBody注解先于@Validated注解起作用,这样既可以利用@RequestBody注解向Controller传递json串,同时又能够达到校验的目的。从源码的角度来说,这在很大程度上是一个顺序的问题: RequestMappingHandlerAdapter.getDefaultArgumentResolvers相关源码: ```java resolvers.add(new ServletModelAttributeMethodProcessor(false)); resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), this.requestResponseBodyAdvice)); ``` 虽然ServletModelAttributeMethodProcessor位于RequestResponseBodyMethodProcessor之前,但构造器参数为false说明了此解析器必须要求参数被@ModelAttribute注解标注,其实在最后还有一个不需要注解的解析器被添加: ```java // Catch-all resolvers.add(new ServletModelAttributeMethodProcessor(true)); ``` 至此,真相大白。 ================================================ FILE: note/spring-mvc.uml ================================================ mvc 1 classes OAE4p02Jq0OpklAf3brB/QAA 25 DispatcherServlet f0Rg6JdVd0OMg3954zePZwAA lwJp/UAOrUqtFnhJBPkfHQAA 19 clMaroon $00B9FFFF 96 20 259 111 sdkNone KYvDnhPERUGmlOr1WfgA4AAA 1 Servlet <<interface>> False False KYvDnhPERUGmlOr1WfgA4AAA KYvDnhPERUGmlOr1WfgA4AAA clMaroon $00B9FFFF 420 20 247 98 sdkNone oCLQaEBgN0GdzS2szSbCYQAA 1 ServletConfig <<interface>> False False oCLQaEBgN0GdzS2szSbCYQAA oCLQaEBgN0GdzS2szSbCYQAA clMaroon $00B9FFFF 338 188 94 43 f4v1EpUVAkCPdoJhUwDnmAAA 3 GenericServlet False False f4v1EpUVAkCPdoJhUwDnmAAA f4v1EpUVAkCPdoJhUwDnmAAA False f4v1EpUVAkCPdoJhUwDnmAAA clMaroon $00B9FFFF 335 268 101 43 /KnYxBaLvUy0nm8OvyWxkQAA 3 HttpServlet False False /KnYxBaLvUy0nm8OvyWxkQAA /KnYxBaLvUy0nm8OvyWxkQAA False /KnYxBaLvUy0nm8OvyWxkQAA clMaroon $00B9FFFF 333 352 104 56 TwF5XgXvBUuIg23H6ZBEkgAA 3 HttpServletBean False False TwF5XgXvBUuIg23H6ZBEkgAA TwF5XgXvBUuIg23H6ZBEkgAA False TwF5XgXvBUuIg23H6ZBEkgAA clMaroon $00B9FFFF 104 268 165 59 sdkNone RFrO1VM1DEOizbIeECf2RAAA 1 EnvironmentCapable <<interface>> False False RFrO1VM1DEOizbIeECf2RAAA RFrO1VM1DEOizbIeECf2RAAA clMaroon $00B9FFFF 492 268 247 59 sdkNone Jc/u5AyE0kG9m7n2kkUKPAAA 1 EnvironmentAware <<interface>> False False Jc/u5AyE0kG9m7n2kkUKPAAA Jc/u5AyE0kG9m7n2kkUKPAAA clMaroon $00B9FFFF 328 447 115 43 ltXDdHS34kiCTU8QOKZ14QAA 3 FrameworkServlet False False ltXDdHS34kiCTU8QOKZ14QAA ltXDdHS34kiCTU8QOKZ14QAA False ltXDdHS34kiCTU8QOKZ14QAA clMaroon $00B9FFFF 492 352 339 59 sdkNone AuGq5cSqVUO2MNtdVVodQwAA 1 ApplicationContextAware <<interface>> False False AuGq5cSqVUO2MNtdVVodQwAA AuGq5cSqVUO2MNtdVVodQwAA clMaroon $00B9FFFF 329 529 112 43 9EGFl/Pzg0mks6m2Zi7pkgAA 1 DispatcherServlet False False 9EGFl/Pzg0mks6m2Zi7pkgAA 9EGFl/Pzg0mks6m2Zi7pkgAA False 9EGFl/Pzg0mks6m2Zi7pkgAA clMaroon $00B9FFFF 359,188;290,130 LEvmY7HL40qa8iVZh9V2ggAA Ks6rX0+il0iUEc7xjIUcQwAA KxNwue2Vgk23Glq8kEyEOAAA False 1.5707963267949 15 LEvmY7HL40qa8iVZh9V2ggAA False 1.5707963267949 30 LEvmY7HL40qa8iVZh9V2ggAA False -1.5707963267949 15 LEvmY7HL40qa8iVZh9V2ggAA clMaroon $00B9FFFF 408,188;488,117 0bTfaPMFeEqBxALFDcXm4AAA e6rEaJzYDkuqYjmS/yF9lwAA KxNwue2Vgk23Glq8kEyEOAAA False 1.5707963267949 15 0bTfaPMFeEqBxALFDcXm4AAA False 1.5707963267949 30 0bTfaPMFeEqBxALFDcXm4AAA False -1.5707963267949 15 0bTfaPMFeEqBxALFDcXm4AAA clMaroon $00B9FFFF 385,268;384,230 YIWmxsXEu0KvRp9lYw8e/gAA KxNwue2Vgk23Glq8kEyEOAAA PebJUqm0VE6qwRlSamC0CgAA False 1.5707963267949 15 YIWmxsXEu0KvRp9lYw8e/gAA False 1.5707963267949 30 YIWmxsXEu0KvRp9lYw8e/gAA False -1.5707963267949 15 YIWmxsXEu0KvRp9lYw8e/gAA clMaroon $00B9FFFF 384,352;385,310 V9IfGmpo0UGSprBtBAVSWQAA PebJUqm0VE6qwRlSamC0CgAA u2ryrU/9DE+awawwhRVT2QAA False 1.5707963267949 15 V9IfGmpo0UGSprBtBAVSWQAA False 1.5707963267949 30 V9IfGmpo0UGSprBtBAVSWQAA False -1.5707963267949 15 V9IfGmpo0UGSprBtBAVSWQAA clMaroon $00B9FFFF 385,447;384,407 yjHE5EN36EmADe7XUvKNvQAA u2ryrU/9DE+awawwhRVT2QAA oux1accGxEe/ly2hVFy3twAA False 1.5707963267949 15 yjHE5EN36EmADe7XUvKNvQAA False 1.5707963267949 30 yjHE5EN36EmADe7XUvKNvQAA False -1.5707963267949 15 yjHE5EN36EmADe7XUvKNvQAA clMaroon $00B9FFFF 384,529;385,489 R66uZdhpKkKIpZT5C8p98wAA oux1accGxEe/ly2hVFy3twAA 1yN4hmJPiUSoOF2AkIhuPwAA False 1.5707963267949 15 R66uZdhpKkKIpZT5C8p98wAA False 1.5707963267949 30 R66uZdhpKkKIpZT5C8p98wAA False -1.5707963267949 15 R66uZdhpKkKIpZT5C8p98wAA clMaroon $00B9FFFF 333,358;256,326 ZUxkxGLwJ0eYLM61LGyp6AAA 5DWmCMy4X0+iSDxYeg5oVwAA u2ryrU/9DE+awawwhRVT2QAA False 1.5707963267949 15 ZUxkxGLwJ0eYLM61LGyp6AAA False 1.5707963267949 30 ZUxkxGLwJ0eYLM61LGyp6AAA False -1.5707963267949 15 ZUxkxGLwJ0eYLM61LGyp6AAA clMaroon $00B9FFFF 436,361;534,326 nDakRT7vJE+KK7cPVTqVDgAA u5S9WxTu4UmwXqf7lRV8WQAA u2ryrU/9DE+awawwhRVT2QAA False 1.5707963267949 15 nDakRT7vJE+KK7cPVTqVDgAA False 1.5707963267949 30 nDakRT7vJE+KK7cPVTqVDgAA False -1.5707963267949 15 nDakRT7vJE+KK7cPVTqVDgAA clMaroon $00B9FFFF 442,450;569,410 V/FAXXV8gUqutMl79uVYDQAA wPkUbLpuREeph8svWnaJKgAA oux1accGxEe/ly2hVFy3twAA False 1.5707963267949 15 V/FAXXV8gUqutMl79uVYDQAA False 1.5707963267949 30 V/FAXXV8gUqutMl79uVYDQAA False -1.5707963267949 15 V/FAXXV8gUqutMl79uVYDQAA ApplicationContextInitializer f0Rg6JdVd0OMg3954zePZwAA ODpoDAwIEk68Zb+3ZoSLqgAA 1 clMaroon $00B9FFFF 320 100 186 59 sdkNone XKSFCo5Lb0Gw3V9Y/xMnrAAA 1 ApplicationContextInitializer <<interface>> False False XKSFCo5Lb0Gw3V9Y/xMnrAAA XKSFCo5Lb0Gw3V9Y/xMnrAAA XmlWebApplicationContext f0Rg6JdVd0OMg3954zePZwAA BmDFzOoIRE2J8b57njQP3wAA 9 clMaroon $00B9FFFF 256 324 339 69 8Ch72XTb50ixrh0yRy77FQAA 1 XmlWebApplicationContext False False 8Ch72XTb50ixrh0yRy77FQAA 8Ch72XTb50ixrh0yRy77FQAA False 8Ch72XTb50ixrh0yRy77FQAA clMaroon $00B9FFFF 230 197 390 69 c2E+iZlpXkSEld5WkPHlIQAA 3 AbstractRefreshableWebApplicationContext False False c2E+iZlpXkSEld5WkPHlIQAA c2E+iZlpXkSEld5WkPHlIQAA False c2E+iZlpXkSEld5WkPHlIQAA clMaroon $00B9FFFF 290 92 270 43 sSfjMeIB9kq2+GN50O2NlgAA 3 AbstractRefreshableConfigApplicationContext False False sSfjMeIB9kq2+GN50O2NlgAA sSfjMeIB9kq2+GN50O2NlgAA False sSfjMeIB9kq2+GN50O2NlgAA clMaroon $00B9FFFF 48 92 214 45 sdkNone jlx8iL8U50WGIDOgiAm3BAAA 1 ConfigurableWebApplicationContext <<interface>> False False jlx8iL8U50WGIDOgiAm3BAAA False jlx8iL8U50WGIDOgiAm3BAAA clMaroon $00B9FFFF 608 92 205 59 sdkNone Yx4TqFuvck6/KBu4Z3VE/gAA 1 ThemeSource <<interface>> False False Yx4TqFuvck6/KBu4Z3VE/gAA Yx4TqFuvck6/KBu4Z3VE/gAA clMaroon $00B9FFFF 424,197;424,134 FR4nH+J0qkmAZVK2YYtEKQAA GBXTS2KHfEOT0oqsOsT2rwAA At070RH95EqoXmQwoZQtbgAA False 1.5707963267949 15 FR4nH+J0qkmAZVK2YYtEKQAA False 1.5707963267949 30 FR4nH+J0qkmAZVK2YYtEKQAA False -1.5707963267949 15 FR4nH+J0qkmAZVK2YYtEKQAA clMaroon $00B9FFFF 425,324;424,265 OLDvPGGN9EGoKH1BKjG2bAAA At070RH95EqoXmQwoZQtbgAA eCEhXosv9EmbL0UyC38sqgAA False 1.5707963267949 15 OLDvPGGN9EGoKH1BKjG2bAAA False 1.5707963267949 30 OLDvPGGN9EGoKH1BKjG2bAAA False -1.5707963267949 15 OLDvPGGN9EGoKH1BKjG2bAAA clMaroon $00B9FFFF 346,197;205,136 /sS870tmU026vltizDWkngAA JRe67b+UWUmgSZrOODcyAQAA At070RH95EqoXmQwoZQtbgAA False 1.5707963267949 15 /sS870tmU026vltizDWkngAA False 1.5707963267949 30 /sS870tmU026vltizDWkngAA False -1.5707963267949 15 /sS870tmU026vltizDWkngAA clMaroon $00B9FFFF 512,197;634,150 5SgrnsXGV0uerouV8BK7xQAA sxwpLwIhn0u6QdDxD/1g5wAA At070RH95EqoXmQwoZQtbgAA False 1.5707963267949 15 5SgrnsXGV0uerouV8BK7xQAA False 1.5707963267949 30 5SgrnsXGV0uerouV8BK7xQAA False -1.5707963267949 15 5SgrnsXGV0uerouV8BK7xQAA MultipartResolver f0Rg6JdVd0OMg3954zePZwAA RnO6I5tOUUSWNfynqwnbgQAA 9 clMaroon $00B9FFFF 447 72 378 85 sdkNone bzy0HsHOXUSVkX63Lk/ULAAA 1 MultipartResolver <<interface>> False False bzy0HsHOXUSVkX63Lk/ULAAA bzy0HsHOXUSVkX63Lk/ULAAA clMaroon $00B9FFFF 251 224 168 43 OBLST6vyhUSLCnvyhIYD9AAA 1 CommonsMultipartResolver False False OBLST6vyhUSLCnvyhIYD9AAA OBLST6vyhUSLCnvyhIYD9AAA False OBLST6vyhUSLCnvyhIYD9AAA clMaroon $00B9FFFF 56 72 169 43 3tJ+mJ25w0i7sKGlSMxkigAA 3 CommonsFileUploadSupport False False 3tJ+mJ25w0i7sKGlSMxkigAA 3tJ+mJ25w0i7sKGlSMxkigAA False 3tJ+mJ25w0i7sKGlSMxkigAA clMaroon $00B9FFFF 269 72 132 46 sdkNone mXAGdX89nUao0MyLBt/LPQAA 1 ServletContextAware <<interface>> False False mXAGdX89nUao0MyLBt/LPQAA False mXAGdX89nUao0MyLBt/LPQAA clMaroon $00B9FFFF 334,224;334,117 eTuzvA8IFUyyTdBmMdaWJAAA xCzk2UYTkkScqREE+fuW5gAA Gz8cAbjkokiwaAfdyZpP6wAA False 1.5707963267949 15 eTuzvA8IFUyyTdBmMdaWJAAA False 1.5707963267949 30 eTuzvA8IFUyyTdBmMdaWJAAA False -1.5707963267949 15 eTuzvA8IFUyyTdBmMdaWJAAA clMaroon $00B9FFFF 382,224;538,156 NBugcb/hyESxCBU5YkU/3AAA cLyHIL7DcUKaRXCqMEnI4gAA Gz8cAbjkokiwaAfdyZpP6wAA False 1.5707963267949 15 NBugcb/hyESxCBU5YkU/3AAA False 1.5707963267949 30 NBugcb/hyESxCBU5YkU/3AAA False -1.5707963267949 15 NBugcb/hyESxCBU5YkU/3AAA clMaroon $00B9FFFF 307,224;167,114 I9woo1noz0+XqjFqV60y7wAA 1+7s9Da6GkidJDZeFoo2owAA Gz8cAbjkokiwaAfdyZpP6wAA False 1.5707963267949 15 I9woo1noz0+XqjFqV60y7wAA False 1.5707963267949 30 I9woo1noz0+XqjFqV60y7wAA False -1.5707963267949 15 I9woo1noz0+XqjFqV60y7wAA clMaroon $00B9FFFF 628 224 205 43 V48zERVUrk6Pc5BU27IGfwAA 1 StandardServletMultipartResolver False False V48zERVUrk6Pc5BU27IGfwAA V48zERVUrk6Pc5BU27IGfwAA False V48zERVUrk6Pc5BU27IGfwAA clMaroon $00B9FFFF 715,224;666,156 P/5pDX5YKkWe4J8YRkWjxgAA cLyHIL7DcUKaRXCqMEnI4gAA w0KLyYPsNUiG9pZplyd+wgAA False 1.5707963267949 15 P/5pDX5YKkWe4J8YRkWjxgAA False 1.5707963267949 30 P/5pDX5YKkWe4J8YRkWjxgAA False -1.5707963267949 15 P/5pDX5YKkWe4J8YRkWjxgAA ThemeResolver f0Rg6JdVd0OMg3954zePZwAA dWqIrRhIB020ytyI2NuflAAA 11 clMaroon $00B9FFFF 324 68 509 72 sdkNone 1L1AgY4dI0CqSTB6N8UJ/wAA 1 ThemeResolver <<interface>> False False 1L1AgY4dI0CqSTB6N8UJ/wAA 1L1AgY4dI0CqSTB6N8UJ/wAA clMaroon $00B9FFFF 504 204 148 43 MnCErTea1UyNRv7Kqtz02gAA 3 AbstractThemeResolver False False MnCErTea1UyNRv7Kqtz02gAA MnCErTea1UyNRv7Kqtz02gAA False MnCErTea1UyNRv7Kqtz02gAA clMaroon $00B9FFFF 396 292 129 43 uVFLyowa3Ea3C5HNP4tyPgAA 1 FixedThemeResolver False False uVFLyowa3Ea3C5HNP4tyPgAA uVFLyowa3Ea3C5HNP4tyPgAA False uVFLyowa3Ea3C5HNP4tyPgAA clMaroon $00B9FFFF 632 292 142 43 6AwD3EtYMUWP8F4wx4jqRwAA 1 SessionThemeResolver False False 6AwD3EtYMUWP8F4wx4jqRwAA 6AwD3EtYMUWP8F4wx4jqRwAA False 6AwD3EtYMUWP8F4wx4jqRwAA clMaroon $00B9FFFF 788 204 137 43 3+2AXZNdcEq0u0wW2CBsdwAA 1 CookieThemeResolver False False 3+2AXZNdcEq0u0wW2CBsdwAA 3+2AXZNdcEq0u0wW2CBsdwAA False 3+2AXZNdcEq0u0wW2CBsdwAA clMaroon $00B9FFFF 928 68 106 43 jRhsUCVGb0S4HBSvzB1MtwAA 1 CookieGenerator False False jRhsUCVGb0S4HBSvzB1MtwAA jRhsUCVGb0S4HBSvzB1MtwAA False jRhsUCVGb0S4HBSvzB1MtwAA clMaroon $00B9FFFF 577,204;578,139 Mj5C3vaa3064dXsQUTshOwAA w9d9k9RXUUqmkhYYpBErpwAA ndE66U2aS0avoNLBtmWBPwAA False 1.5707963267949 15 Mj5C3vaa3064dXsQUTshOwAA False 1.5707963267949 30 Mj5C3vaa3064dXsQUTshOwAA False -1.5707963267949 15 Mj5C3vaa3064dXsQUTshOwAA clMaroon $00B9FFFF 488,292;549,246 DZcq/kI8uE6+25ezals1hQAA ndE66U2aS0avoNLBtmWBPwAA R0wPA/dsYESSCqLbvbRoKgAA False 1.5707963267949 15 DZcq/kI8uE6+25ezals1hQAA False 1.5707963267949 30 DZcq/kI8uE6+25ezals1hQAA False -1.5707963267949 15 DZcq/kI8uE6+25ezals1hQAA clMaroon $00B9FFFF 672,292;607,246 DHQwqlpzDUKAwUOoY6IG0wAA ndE66U2aS0avoNLBtmWBPwAA s3vyYeqzekWLdp/CVHktgAAA False 1.5707963267949 15 DHQwqlpzDUKAwUOoY6IG0wAA False 1.5707963267949 30 DHQwqlpzDUKAwUOoY6IG0wAA False -1.5707963267949 15 DHQwqlpzDUKAwUOoY6IG0wAA clMaroon $00B9FFFF 808,204;660,139 GWiNbONnRkeynPEth8vJdgAA w9d9k9RXUUqmkhYYpBErpwAA P9vKkr4B2UmjF4/ZaVlxPwAA False 1.5707963267949 15 GWiNbONnRkeynPEth8vJdgAA False 1.5707963267949 30 GWiNbONnRkeynPEth8vJdgAA False -1.5707963267949 15 GWiNbONnRkeynPEth8vJdgAA clMaroon $00B9FFFF 875,204;961,110 ZI75IbMDcEGrNC2Xrm1h7QAA VyvV1/JJ8kGWX0Ln2ekAdgAA P9vKkr4B2UmjF4/ZaVlxPwAA False 1.5707963267949 15 ZI75IbMDcEGrNC2Xrm1h7QAA False 1.5707963267949 30 ZI75IbMDcEGrNC2Xrm1h7QAA False -1.5707963267949 15 ZI75IbMDcEGrNC2Xrm1h7QAA RequestToViewNameTranslator f0Rg6JdVd0OMg3954zePZwAA M/ZERSp3bE+AbFOVD/lBZgAA 3 clMaroon $00B9FFFF 556 84 257 59 sdkNone tzD0sDn2YkOCcCOaoDuVCAAA 1 RequestToViewNameTranslator <<interface>> False False tzD0sDn2YkOCcCOaoDuVCAAA tzD0sDn2YkOCcCOaoDuVCAAA clMaroon $00B9FFFF 570 212 229 43 Rf5OCNrHp0epiEJxn07PCgAA 1 DefaultRequestToViewNameTranslator False False Rf5OCNrHp0epiEJxn07PCgAA Rf5OCNrHp0epiEJxn07PCgAA False Rf5OCNrHp0epiEJxn07PCgAA clMaroon $00B9FFFF 684,212;684,142 u3DnpkCSq0y/Puz0gIjqPAAA /88g7G8i1UiX///NmJcfaAAA /cGa35P/8UaBWJeBmdMU7AAA False 1.5707963267949 15 u3DnpkCSq0y/Puz0gIjqPAAA False 1.5707963267949 30 u3DnpkCSq0y/Puz0gIjqPAAA False -1.5707963267949 15 u3DnpkCSq0y/Puz0gIjqPAAA FlashMapManager f0Rg6JdVd0OMg3954zePZwAA JAHSgp7zb0OvSQMMgI9FTgAA 5 clMaroon $00B9FFFF 447 96 540 72 sdkNone NkV5ZWQTRUib20/4ZsKoZAAA 1 FlashMapManager <<interface>> False False NkV5ZWQTRUib20/4ZsKoZAAA NkV5ZWQTRUib20/4ZsKoZAAA clMaroon $00B9FFFF 636 236 162 43 8lT3HupezUSZAJhm7EvYygAA 3 AbstractFlashMapManager False False 8lT3HupezUSZAJhm7EvYygAA 8lT3HupezUSZAJhm7EvYygAA False 8lT3HupezUSZAJhm7EvYygAA clMaroon $00B9FFFF 716,236;716,167 Jc+p0G4kc0y3zHPOVzvQlgAA nvB5btIYd0SG1bUOsNlFawAA 0LGwXMIbzEuMSxJODwxdugAA False 1.5707963267949 15 Jc+p0G4kc0y3zHPOVzvQlgAA False 1.5707963267949 30 Jc+p0G4kc0y3zHPOVzvQlgAA False -1.5707963267949 15 Jc+p0G4kc0y3zHPOVzvQlgAA clMaroon $00B9FFFF 639 347 156 43 ZKdVdU8qFEu8uthlK2IcGAAA 1 SessionFlashMapManager False False ZKdVdU8qFEu8uthlK2IcGAAA ZKdVdU8qFEu8uthlK2IcGAAA False ZKdVdU8qFEu8uthlK2IcGAAA clMaroon $00B9FFFF 716,347;716,278 Ygss1yreHkWvM1vnHb0SAQAA 0LGwXMIbzEuMSxJODwxdugAA 7Z9Nhl2DlE+QBdxSa/ztLAAA False 1.5707963267949 15 Ygss1yreHkWvM1vnHb0SAQAA False 1.5707963267949 30 Ygss1yreHkWvM1vnHb0SAQAA False -1.5707963267949 15 Ygss1yreHkWvM1vnHb0SAQAA RequestMappingHandlerMapping f0Rg6JdVd0OMg3954zePZwAA Ddx+Cp5ztEi8UHPkCOiP0gAA 13 clMaroon $00B9FFFF 561 511 197 56 I7LmkY1t90eDwhLcK1fSVgAA 1 RequestMappingHandlerMapping False False I7LmkY1t90eDwhLcK1fSVgAA I7LmkY1t90eDwhLcK1fSVgAA False I7LmkY1t90eDwhLcK1fSVgAA clMaroon $00B9FFFF 549 419 220 43 z++oSXObbES5tw+wqCVHoAAA 1 RequestMappingInfoHandlerMapping False False z++oSXObbES5tw+wqCVHoAAA z++oSXObbES5tw+wqCVHoAAA False z++oSXObbES5tw+wqCVHoAAA clMaroon $00B9FFFF 495 301 328 69 HSCkIBk+hkiJqPYPqjk/QgAA 3 AbstractHandlerMethodMapping False False HSCkIBk+hkiJqPYPqjk/QgAA HSCkIBk+hkiJqPYPqjk/QgAA False HSCkIBk+hkiJqPYPqjk/QgAA clMaroon $00B9FFFF 883 196 138 59 sdkNone j9wsgsOO0E+thBPcV0OAzgAA 1 InitializingBean <<interface>> False False j9wsgsOO0E+thBPcV0OAzgAA j9wsgsOO0E+thBPcV0OAzgAA clMaroon $00B9FFFF 495 196 328 56 hWJbr02mKkWmFJRZx6ftoQAA 3 AbstractHandlerMapping False False hWJbr02mKkWmFJRZx6ftoQAA hWJbr02mKkWmFJRZx6ftoQAA False hWJbr02mKkWmFJRZx6ftoQAA clMaroon $00B9FFFF 495 88 328 59 sdkNone fsf8hLsoxE+9lzaCT3rScAAA 1 HandlerMapping <<interface>> False False fsf8hLsoxE+9lzaCT3rScAAA fsf8hLsoxE+9lzaCT3rScAAA clMaroon $00B9FFFF 658,196;658,146 hWkD+h1WKkKNiFTJktZ0IwAA J5jBaaDVpkSz4/fu2WTTfgAA WJ9M9TokuEu6EezmNbO5dAAA False 1.5707963267949 15 hWkD+h1WKkKNiFTJktZ0IwAA False 1.5707963267949 30 hWkD+h1WKkKNiFTJktZ0IwAA False -1.5707963267949 15 hWkD+h1WKkKNiFTJktZ0IwAA clMaroon $00B9FFFF 749,301;883,251 y2ItXIPhnUC8FBLuQM9nJAAA 0zth/Aiwc0iVadhMocJEDgAA mb1u52bAikutZKGQ5w93YwAA False 1.5707963267949 15 y2ItXIPhnUC8FBLuQM9nJAAA False 1.5707963267949 30 y2ItXIPhnUC8FBLuQM9nJAAA False -1.5707963267949 15 y2ItXIPhnUC8FBLuQM9nJAAA clMaroon $00B9FFFF 658,301;658,251 +jicsi4SoEusxAs/fJ/3RQAA WJ9M9TokuEu6EezmNbO5dAAA mb1u52bAikutZKGQ5w93YwAA False 1.5707963267949 15 +jicsi4SoEusxAs/fJ/3RQAA False 1.5707963267949 30 +jicsi4SoEusxAs/fJ/3RQAA False -1.5707963267949 15 +jicsi4SoEusxAs/fJ/3RQAA clMaroon $00B9FFFF 658,419;658,369 TdRn6Tmkq0eN1rnhKpa+tAAA mb1u52bAikutZKGQ5w93YwAA J0cqIN8K/keOIBdrRJr6/AAA False 1.5707963267949 15 TdRn6Tmkq0eN1rnhKpa+tAAA False 1.5707963267949 30 TdRn6Tmkq0eN1rnhKpa+tAAA False -1.5707963267949 15 TdRn6Tmkq0eN1rnhKpa+tAAA clMaroon $00B9FFFF 659,511;658,461 ID4ylR3G5UeYCX2wyEVWnwAA J0cqIN8K/keOIBdrRJr6/AAA xxqcW5/dNk6tPx2Hrl4xSAAA False 1.5707963267949 15 ID4ylR3G5UeYCX2wyEVWnwAA False 1.5707963267949 30 ID4ylR3G5UeYCX2wyEVWnwAA False -1.5707963267949 15 ID4ylR3G5UeYCX2wyEVWnwAA clMaroon $00B9FFFF 883 88 180 43 VdRjTKH9x0q2TDUhyLicIQAA 3 WebApplicationObjectSupport False False VdRjTKH9x0q2TDUhyLicIQAA VdRjTKH9x0q2TDUhyLicIQAA False VdRjTKH9x0q2TDUhyLicIQAA clMaroon $00B9FFFF 732,196;914,130 K25qCaH5/kGuV6wwIE0SxAAA pbj6YPhmDk+VIk6wawBkCwAA WJ9M9TokuEu6EezmNbO5dAAA False 1.5707963267949 15 K25qCaH5/kGuV6wwIE0SxAAA False 1.5707963267949 30 K25qCaH5/kGuV6wwIE0SxAAA False -1.5707963267949 15 K25qCaH5/kGuV6wwIE0SxAAA MappingRegistry f0Rg6JdVd0OMg3954zePZwAA OiZIKEqMfE6cC9e/EOMBsgAA 1 clMaroon $00B9FFFF 520 112 278 108 t0599765yk+Qjo2VUOWOqAAA 1 MappingRegistry False False t0599765yk+Qjo2VUOWOqAAA t0599765yk+Qjo2VUOWOqAAA False t0599765yk+Qjo2VUOWOqAAA HandlerMethodMappingNamingStrategy f0Rg6JdVd0OMg3954zePZwAA l+QXiRJQMUeGAudzgt74zAAA 3 clMaroon $00B9FFFF 381 80 304 59 sdkNone mu6eRhsZ9keo3eDhpb8MwgAA 1 HandlerMethodMappingNamingStrategy <<interface>> False False mu6eRhsZ9keo3eDhpb8MwgAA mu6eRhsZ9keo3eDhpb8MwgAA clMaroon $00B9FFFF 356 200 355 43 +5zdjjyqekuGgSQrItz/OQAA 1 RequestMappingInfoHandlerMethodMappingNamingStrategy False False +5zdjjyqekuGgSQrItz/OQAA +5zdjjyqekuGgSQrItz/OQAA False +5zdjjyqekuGgSQrItz/OQAA clMaroon $00B9FFFF 533,200;532,138 e5+I1YGrK0KXbkx7JKWxogAA 0ZQkZTRaOEKoBt+Zhk7ptAAA 0i2nY4WxyES5XtqKxJnFbgAA False 1.5707963267949 15 e5+I1YGrK0KXbkx7JKWxogAA False 1.5707963267949 30 e5+I1YGrK0KXbkx7JKWxogAA False -1.5707963267949 15 e5+I1YGrK0KXbkx7JKWxogAA RequestMappingHandlerAdapter f0Rg6JdVd0OMg3954zePZwAA eOIlnEzkl0iT3Qwf0hdefQAA 11 clMaroon $00B9FFFF 190 44 499 85 sdkNone P9LWKSEPeUiQ9BPbfShT5gAA 1 HandlerAdapter <<interface>> False False P9LWKSEPeUiQ9BPbfShT5gAA P9LWKSEPeUiQ9BPbfShT5gAA clMaroon $00B9FFFF 190 229 499 82 pH/WzjI5u0mqJnosZPjqQwAA 3 AbstractHandlerMethodAdapter False False pH/WzjI5u0mqJnosZPjqQwAA pH/WzjI5u0mqJnosZPjqQwAA False pH/WzjI5u0mqJnosZPjqQwAA clMaroon $00B9FFFF 740 44 138 43 IH/K7OkzSkuMtLUntlnj0QAA 3 WebContentGenerator False False IH/K7OkzSkuMtLUntlnj0QAA IH/K7OkzSkuMtLUntlnj0QAA False IH/K7OkzSkuMtLUntlnj0QAA clMaroon $00B9FFFF 342 411 195 43 S5mwE3w/r0qrZoPVjC7RuAAA 1 RequestMappingHandlerAdapter False False S5mwE3w/r0qrZoPVjC7RuAAA S5mwE3w/r0qrZoPVjC7RuAAA False S5mwE3w/r0qrZoPVjC7RuAAA clMaroon $00B9FFFF 16 229 117 46 sdkNone k4lixbF1SEyM1kaa5rokMgAA 1 BeanFactoryAware <<interface>> False False k4lixbF1SEyM1kaa5rokMgAA False k4lixbF1SEyM1kaa5rokMgAA clMaroon $00B9FFFF 732 229 138 59 sdkNone j9wsgsOO0E+thBPcV0OAzgAA 1 InitializingBean <<interface>> False False j9wsgsOO0E+thBPcV0OAzgAA j9wsgsOO0E+thBPcV0OAzgAA clMaroon $00B9FFFF 439,229;439,128 VQfomvvNHE+V2Ny+ptniFgAA hEZdIt5XLUa5r9GRfedZygAA aV8H3Ywb00SZkaX/Q80fjwAA False 1.5707963267949 15 VQfomvvNHE+V2Ny+ptniFgAA False 1.5707963267949 30 VQfomvvNHE+V2Ny+ptniFgAA False -1.5707963267949 15 VQfomvvNHE+V2Ny+ptniFgAA clMaroon $00B9FFFF 397,411;120,274 HfclQ7eRFEmmEXD6ZlopOgAA cg5SZWOX6UiTmWp/lN8+vAAA g5Z1jBuMbkStHnbrdrW5UAAA False 1.5707963267949 15 HfclQ7eRFEmmEXD6ZlopOgAA False 1.5707963267949 30 HfclQ7eRFEmmEXD6ZlopOgAA False -1.5707963267949 15 HfclQ7eRFEmmEXD6ZlopOgAA clMaroon $00B9FFFF 483,411;740,287 fxF1KSwR/0O1dOQTG5mA9gAA exatLu4MlEae2b5E9yIOKQAA g5Z1jBuMbkStHnbrdrW5UAAA False 1.5707963267949 15 fxF1KSwR/0O1dOQTG5mA9gAA False 1.5707963267949 30 fxF1KSwR/0O1dOQTG5mA9gAA False -1.5707963267949 15 fxF1KSwR/0O1dOQTG5mA9gAA clMaroon $00B9FFFF 439,411;439,310 JS56EPSKRU2LHL0t8xdROAAA aV8H3Ywb00SZkaX/Q80fjwAA g5Z1jBuMbkStHnbrdrW5UAAA False 1.5707963267949 15 JS56EPSKRU2LHL0t8xdROAAA False 1.5707963267949 30 JS56EPSKRU2LHL0t8xdROAAA False -1.5707963267949 15 JS56EPSKRU2LHL0t8xdROAAA clMaroon $00B9FFFF 511,229;770,86 VU6AbDQkEkGiYYRtgd/ISQAA Ap2vjPYHSUiEL7nUV2AqnAAA aV8H3Ywb00SZkaX/Q80fjwAA False 1.5707963267949 15 VU6AbDQkEkGiYYRtgd/ISQAA False 1.5707963267949 30 VU6AbDQkEkGiYYRtgd/ISQAA False -1.5707963267949 15 VU6AbDQkEkGiYYRtgd/ISQAA HandlerMethodArgumentResolver f0Rg6JdVd0OMg3954zePZwAA /YNXbD3jPkS4sP5S0XSjoQAA 1 clMaroon $00B9FFFF 232 64 298 72 sdkNone peTc97n8EUu3mxXpQmi/OQAA 1 HandlerMethodArgumentResolver <<interface>> False False peTc97n8EUu3mxXpQmi/OQAA peTc97n8EUu3mxXpQmi/OQAA HandlerMethodReturnValueHandler f0Rg6JdVd0OMg3954zePZwAA mhwt76krpUaUOtZyWFPIwgAA 1 clMaroon $00B9FFFF 336 104 309 72 sdkNone AxM/7rK/g0GLar9wkB2XXQAA 1 HandlerMethodReturnValueHandler <<interface>> False False AxM/7rK/g0GLar9wkB2XXQAA AxM/7rK/g0GLar9wkB2XXQAA MappedInterceptor f0Rg6JdVd0OMg3954zePZwAA UdqUfJdCtk2AEJ7Y4J8rwgAA 3 clMaroon $00B9FFFF 171 52 620 85 sdkNone 34MuS4CjkE2INIiH+mvl7AAA 1 HandlerInterceptor <<interface>> False False 34MuS4CjkE2INIiH+mvl7AAA 34MuS4CjkE2INIiH+mvl7AAA clMaroon $00B9FFFF 421 200 121 43 Zl+YmWnJ3UeQIzXjIYV56wAA 1 MappedInterceptor False False Zl+YmWnJ3UeQIzXjIYV56wAA Zl+YmWnJ3UeQIzXjIYV56wAA False Zl+YmWnJ3UeQIzXjIYV56wAA clMaroon $00B9FFFF 481,200;480,136 Pom7RsAxBkysjOFzZ23C7QAA Vsrcv1GlPUW7UEqmhNOXyQAA /r+oaTFh7Ee5ODkBUIeRkAAA False 1.5707963267949 15 Pom7RsAxBkysjOFzZ23C7QAA False 1.5707963267949 30 Pom7RsAxBkysjOFzZ23C7QAA False -1.5707963267949 15 Pom7RsAxBkysjOFzZ23C7QAA BindingAwareModelMap f0Rg6JdVd0OMg3954zePZwAA ezHk4fEmzkmILaGp9NduwgAA 9 clMaroon $00B9FFFF 523 420 225 69 kQOUueqHjkmdtHHUDXf/1wAA 1 BindingAwareModelMap False False kQOUueqHjkmdtHHUDXf/1wAA kQOUueqHjkmdtHHUDXf/1wAA False kQOUueqHjkmdtHHUDXf/1wAA clMaroon $00B9FFFF 575 307 121 43 pM2QuuYO906NPK8Ly6nsQQAA 1 ExtendedModelMap False False pM2QuuYO906NPK8Ly6nsQQAA pM2QuuYO906NPK8Ly6nsQQAA False pM2QuuYO906NPK8Ly6nsQQAA clMaroon $00B9FFFF 471 99 328 137 sdkNone suU2FV83akiIvB2iFyOM5QAA 1 Model <<interface>> False False suU2FV83akiIvB2iFyOM5QAA suU2FV83akiIvB2iFyOM5QAA clMaroon $00B9FFFF 871 193 101 43 rdCBGQUTjUG01tNnH0eKMQAA 1 ModelMap False False rdCBGQUTjUG01tNnH0eKMQAA rdCBGQUTjUG01tNnH0eKMQAA False rdCBGQUTjUG01tNnH0eKMQAA clMaroon $00B9FFFF 872 99 99 43 +y2niSqlZEOrMzTuYv+P2wAA 1 LinkedHashMap False False +y2niSqlZEOrMzTuYv+P2wAA +y2niSqlZEOrMzTuYv+P2wAA False +y2niSqlZEOrMzTuYv+P2wAA clMaroon $00B9FFFF 635,307;634,235 MiF/FUdDW0K0t2B2mCeVRgAA iwMtqwlvmEaaBzV2JWWR7QAA 1weYwaQE9kyB66/0mg2/dwAA False 1.5707963267949 15 MiF/FUdDW0K0t2B2mCeVRgAA False 1.5707963267949 30 MiF/FUdDW0K0t2B2mCeVRgAA False -1.5707963267949 15 MiF/FUdDW0K0t2B2mCeVRgAA clMaroon $00B9FFFF 635,420;635,349 jDWDf1x+Wkir7RzwYvKkxgAA 1weYwaQE9kyB66/0mg2/dwAA yczEQBFNHUmdg2RhkXNuCgAA False 1.5707963267949 15 jDWDf1x+Wkir7RzwYvKkxgAA False 1.5707963267949 30 jDWDf1x+Wkir7RzwYvKkxgAA False -1.5707963267949 15 jDWDf1x+Wkir7RzwYvKkxgAA clMaroon $00B9FFFF 688,307;871,234 LsDLvdPXE0m6Ml4gJpZrAAAA m/iITAKzjUe7VujEdtgALgAA 1weYwaQE9kyB66/0mg2/dwAA False 1.5707963267949 15 LsDLvdPXE0m6Ml4gJpZrAAAA False 1.5707963267949 30 LsDLvdPXE0m6Ml4gJpZrAAAA False -1.5707963267949 15 LsDLvdPXE0m6Ml4gJpZrAAAA clMaroon $00B9FFFF 921,193;921,141 3hyjckFm/kuVfgh75XNgrgAA Fd/tuvuQ+k25OO6KV4c9bgAA m/iITAKzjUe7VujEdtgALgAA False 1.5707963267949 15 3hyjckFm/kuVfgh75XNgrgAA False 1.5707963267949 30 3hyjckFm/kuVfgh75XNgrgAA False -1.5707963267949 15 3hyjckFm/kuVfgh75XNgrgAA ModelAndView f0Rg6JdVd0OMg3954zePZwAA jswEAO8It0KV0omyain67wAA 1 clMaroon $00B9FFFF 576 144 140 82 sHlN8aad10q+F8wPL61ebwAA 1 ModelAndView False False sHlN8aad10q+F8wPL61ebwAA sHlN8aad10q+F8wPL61ebwAA False sHlN8aad10q+F8wPL61ebwAA ViewResolver f0Rg6JdVd0OMg3954zePZwAA bTDuw0Lgq0GklmDR9JYwyAAA 1 clMaroon $00B9FFFF 564 148 282 59 sdkNone JvJ8gV4JQEOBPHhHoH7URAAA 1 ViewResolver <<interface>> False False JvJ8gV4JQEOBPHhHoH7URAAA JvJ8gV4JQEOBPHhHoH7URAAA JstlView f0Rg6JdVd0OMg3954zePZwAA LtUTo7XuZkufdzbVFKZmpgAA 11 clMaroon $00B9FFFF 575 604 86 43 QsoN6yHoL0S9L7ynSjsYwwAA 1 JstlView False False QsoN6yHoL0S9L7ynSjsYwwAA QsoN6yHoL0S9L7ynSjsYwwAA False QsoN6yHoL0S9L7ynSjsYwwAA clMaroon $00B9FFFF 529 488 179 56 oPrfV8sK+UehGGzzdjD1JwAA 1 InternalResourceView False False oPrfV8sK+UehGGzzdjD1JwAA oPrfV8sK+UehGGzzdjD1JwAA False oPrfV8sK+UehGGzzdjD1JwAA clMaroon $00B9FFFF 551 385 135 43 W9EFyLGB1kOldHtJY6fTVwAA 3 AbstractUrlBasedView False False W9EFyLGB1kOldHtJY6fTVwAA W9EFyLGB1kOldHtJY6fTVwAA False W9EFyLGB1kOldHtJY6fTVwAA clMaroon $00B9FFFF 488 256 261 69 AGEFwSafw0mcGoVXG9IdyAAA 3 AbstractView False False AGEFwSafw0mcGoVXG9IdyAAA AGEFwSafw0mcGoVXG9IdyAAA False AGEFwSafw0mcGoVXG9IdyAAA clMaroon $00B9FFFF 375 124 486 72 sdkNone Y008w8yBL0WWE/Ef9LEKIAAA 1 View <<interface>> False False Y008w8yBL0WWE/Ef9LEKIAAA Y008w8yBL0WWE/Ef9LEKIAAA clMaroon $00B9FFFF 936 124 180 43 VdRjTKH9x0q2TDUhyLicIQAA 3 WebApplicationObjectSupport False False VdRjTKH9x0q2TDUhyLicIQAA VdRjTKH9x0q2TDUhyLicIQAA False VdRjTKH9x0q2TDUhyLicIQAA clMaroon $00B9FFFF 618,256;617,195 i78pwC5P3E6vVZVFE77HxQAA JkP4Bb47oESHbsfWkUVYIwAA 2Jm29axtJE++cNOa//TJhgAA False 1.5707963267949 15 i78pwC5P3E6vVZVFE77HxQAA False 1.5707963267949 30 i78pwC5P3E6vVZVFE77HxQAA False -1.5707963267949 15 i78pwC5P3E6vVZVFE77HxQAA clMaroon $00B9FFFF 618,385;618,324 BRiFOxmRnkGsuxV0L3e0cwAA 2Jm29axtJE++cNOa//TJhgAA oy0okoqEUkCf3T29WWC/vAAA False 1.5707963267949 15 BRiFOxmRnkGsuxV0L3e0cwAA False 1.5707963267949 30 BRiFOxmRnkGsuxV0L3e0cwAA False -1.5707963267949 15 BRiFOxmRnkGsuxV0L3e0cwAA clMaroon $00B9FFFF 618,488;618,427 eptNU+0rWEarSHMtLAYnrAAA oy0okoqEUkCf3T29WWC/vAAA T/hiU08Cpky742S+aRlmzQAA False 1.5707963267949 15 eptNU+0rWEarSHMtLAYnrAAA False 1.5707963267949 30 eptNU+0rWEarSHMtLAYnrAAA False -1.5707963267949 15 eptNU+0rWEarSHMtLAYnrAAA clMaroon $00B9FFFF 617,604;618,543 xMSxwwfB/0ySn/o5aV63TQAA T/hiU08Cpky742S+aRlmzQAA Ax5zQ1pX8kW6nQ0B/5HziQAA False 1.5707963267949 15 xMSxwwfB/0ySn/o5aV63TQAA False 1.5707963267949 30 xMSxwwfB/0ySn/o5aV63TQAA False -1.5707963267949 15 xMSxwwfB/0ySn/o5aV63TQAA clMaroon $00B9FFFF 713,256;966,166 mMxUqMbZq06P49NoVDxIjAAA YOcuVaqOO0i43iL5BQl1kgAA 2Jm29axtJE++cNOa//TJhgAA False 1.5707963267949 15 mMxUqMbZq06P49NoVDxIjAAA False 1.5707963267949 30 mMxUqMbZq06P49NoVDxIjAAA False -1.5707963267949 15 mMxUqMbZq06P49NoVDxIjAAA HttpMessageConverter f0Rg6JdVd0OMg3954zePZwAA qAsqsKwCXkG+rcdiwfh4dAAA 5 clMaroon $00B9FFFF 410 76 390 111 sdkNone vjmgu3Nx4kGMsc11dh8uZQAA 1 HttpMessageConverter <<interface>> False False vjmgu3Nx4kGMsc11dh8uZQAA vjmgu3Nx4kGMsc11dh8uZQAA clMaroon $00B9FFFF 510 262 191 43 k4dVaCK+0EOvRMGpg9covwAA 3 AbstractHttpMessageConverter False False k4dVaCK+0EOvRMGpg9covwAA k4dVaCK+0EOvRMGpg9covwAA False k4dVaCK+0EOvRMGpg9covwAA clMaroon $00B9FFFF 487 380 236 43 EyhXgq7qgESeqz+/nt70GgAA 1 MappingJacksonHttpMessageConverter False False EyhXgq7qgESeqz+/nt70GgAA EyhXgq7qgESeqz+/nt70GgAA False EyhXgq7qgESeqz+/nt70GgAA clMaroon $00B9FFFF 605,262;604,186 4hV0rG1wG02PNvqMJN1YVQAA 3vYbrx83pEim0OpKCBi/uAAA P7g5pjgOTkSkVMqEDXnabwAA False 1.5707963267949 15 4hV0rG1wG02PNvqMJN1YVQAA False 1.5707963267949 30 4hV0rG1wG02PNvqMJN1YVQAA False -1.5707963267949 15 4hV0rG1wG02PNvqMJN1YVQAA clMaroon $00B9FFFF 604,380;605,304 VD9NGwQZrke9icf4qyymfQAA P7g5pjgOTkSkVMqEDXnabwAA wup5EFs88U65K09mqe7jDwAA False 1.5707963267949 15 VD9NGwQZrke9icf4qyymfQAA False 1.5707963267949 30 VD9NGwQZrke9icf4qyymfQAA False -1.5707963267949 15 VD9NGwQZrke9icf4qyymfQAA HandlerMethodArgumentResolver f0Rg6JdVd0OMg3954zePZwAA xK94dGslIkOI3yj+lseaVQAA 9 clMaroon $00B9FFFF 502 128 298 72 sdkNone peTc97n8EUu3mxXpQmi/OQAA 1 HandlerMethodArgumentResolver <<interface>> False False peTc97n8EUu3mxXpQmi/OQAA peTc97n8EUu3mxXpQmi/OQAA clMaroon $00B9FFFF 184 288 256 43 W1BZOaLkYkatOyYr9SsO9AAA 1 PathVariableMapMethodArgumentResolver False False W1BZOaLkYkatOyYr9SsO9AAA W1BZOaLkYkatOyYr9SsO9AAA False W1BZOaLkYkatOyYr9SsO9AAA clMaroon $00B9FFFF 876 288 256 43 z7Ue44lm3kG5ueGF/vqlbgAA 1 ServletResponseMethodArgumentResolver False False z7Ue44lm3kG5ueGF/vqlbgAA z7Ue44lm3kG5ueGF/vqlbgAA False z7Ue44lm3kG5ueGF/vqlbgAA clMaroon $00B9FFFF 512 288 279 43 Wydlsf+lkUupAFMS7TfKrAAA 3 AbstractNamedValueMethodArgumentResolver False False Wydlsf+lkUupAFMS7TfKrAAA Wydlsf+lkUupAFMS7TfKrAAA False Wydlsf+lkUupAFMS7TfKrAAA clMaroon $00B9FFFF 529 404 244 43 iZYSjZyvPU+jnYRxKm7aqAAA 1 RequestParamMethodArgumentResolver False False iZYSjZyvPU+jnYRxKm7aqAAA iZYSjZyvPU+jnYRxKm7aqAAA False iZYSjZyvPU+jnYRxKm7aqAAA clMaroon $00B9FFFF 360,288;566,199 sQQIFHG3aE2xOYT+cKjRdwAA LLn27gmaHEKAiZZT+MLONwAA rWbKpIK68EOHgTG5XaoMMgAA False 1.5707963267949 15 sQQIFHG3aE2xOYT+cKjRdwAA False 1.5707963267949 30 sQQIFHG3aE2xOYT+cKjRdwAA False -1.5707963267949 15 sQQIFHG3aE2xOYT+cKjRdwAA clMaroon $00B9FFFF 651,288;650,199 5SVpxR1180CZSECIlxOBIAAA LLn27gmaHEKAiZZT+MLONwAA 7fpn78OszUWbSa1TjakxCQAA False 1.5707963267949 15 5SVpxR1180CZSECIlxOBIAAA False 1.5707963267949 30 5SVpxR1180CZSECIlxOBIAAA False -1.5707963267949 15 5SVpxR1180CZSECIlxOBIAAA clMaroon $00B9FFFF 952,288;737,199 NaM3heUPo0q20AUHwMJ3CwAA LLn27gmaHEKAiZZT+MLONwAA GecEzH15S0Ce177SYy3TwAAA False 1.5707963267949 15 NaM3heUPo0q20AUHwMJ3CwAA False 1.5707963267949 30 NaM3heUPo0q20AUHwMJ3CwAA False -1.5707963267949 15 NaM3heUPo0q20AUHwMJ3CwAA clMaroon $00B9FFFF 650,404;651,330 YFvr82XHYEu3i295fq3p8gAA 7fpn78OszUWbSa1TjakxCQAA 4Zp9SjLhLEmntoaqtlBFegAA False 1.5707963267949 15 YFvr82XHYEu3i295fq3p8gAA False 1.5707963267949 30 YFvr82XHYEu3i295fq3p8gAA False -1.5707963267949 15 YFvr82XHYEu3i295fq3p8gAA HandlerMethodReturnValueHandler f0Rg6JdVd0OMg3954zePZwAA o/Nycf0xLECEUPtMYETJhgAA 11 clMaroon $00B9FFFF 480 148 309 72 True sdkNone AxM/7rK/g0GLar9wkB2XXQAA 1 HandlerMethodReturnValueHandler <<interface>> False False AxM/7rK/g0GLar9wkB2XXQAA AxM/7rK/g0GLar9wkB2XXQAA clMaroon $00B9FFFF 312 292 133 43 zu1w8soHAkenWv1bwxYzkwAA 1 MapMethodProcessor False False zu1w8soHAkenWv1bwxYzkwAA zu1w8soHAkenWv1bwxYzkwAA False zu1w8soHAkenWv1bwxYzkwAA clMaroon $00B9FFFF 832 292 249 43 7BNIixKWb02lxPhYnXinpAAA 1 ModelAndViewMethodReturnValueHandler False False 7BNIixKWb02lxPhYnXinpAAA 7BNIixKWb02lxPhYnXinpAAA False 7BNIixKWb02lxPhYnXinpAAA clMaroon $00B9FFFF 502 292 265 43 QQEH2ZkIjkmLYjQ3Lwb9AAAA 3 AbstractMessageConverterMethodProcessor False False QQEH2ZkIjkmLYjQ3Lwb9AAAA QQEH2ZkIjkmLYjQ3Lwb9AAAA False QQEH2ZkIjkmLYjQ3Lwb9AAAA clMaroon $00B9FFFF 396 412 239 43 u4H7QCrawkus132viddzmAAA 1 RequestResponseBodyMethodProcessor False False u4H7QCrawkus132viddzmAAA u4H7QCrawkus132viddzmAAA False u4H7QCrawkus132viddzmAAA clMaroon $00B9FFFF 696 412 167 43 tpDzLzQhWUGeCQJWPifH8AAA 1 HttpEntityMethodProcessor False False tpDzLzQhWUGeCQJWPifH8AAA tpDzLzQhWUGeCQJWPifH8AAA False tpDzLzQhWUGeCQJWPifH8AAA clMaroon $00B9FFFF 634,292;634,219 mEb/Cv39rEi2aR36ilmqjQAA Xk8eOEILgU6VT93LOCT5kQAA PiVPEv7Ng0ax0HsZbFdrAQAA False 1.5707963267949 15 mEb/Cv39rEi2aR36ilmqjQAA False 1.5707963267949 30 mEb/Cv39rEi2aR36ilmqjQAA False -1.5707963267949 15 mEb/Cv39rEi2aR36ilmqjQAA clMaroon $00B9FFFF 419,292;563,219 K+7PNUoTiUabFxJ2oKgHVQAA Xk8eOEILgU6VT93LOCT5kQAA G3P1RzfHOEif0Rm+5n5bdAAA False 1.5707963267949 15 K+7PNUoTiUabFxJ2oKgHVQAA False 1.5707963267949 30 K+7PNUoTiUabFxJ2oKgHVQAA False -1.5707963267949 15 K+7PNUoTiUabFxJ2oKgHVQAA clMaroon $00B9FFFF 904,292;723,219 3BIm9nAI6UC51JF8+fP6XAAA Xk8eOEILgU6VT93LOCT5kQAA sf/k8yDjt0KQVXLrcpkrLwAA False 1.5707963267949 15 3BIm9nAI6UC51JF8+fP6XAAA False 1.5707963267949 30 3BIm9nAI6UC51JF8+fP6XAAA False -1.5707963267949 15 3BIm9nAI6UC51JF8+fP6XAAA clMaroon $00B9FFFF 536,412;613,334 xeFm2mXcmUG1GLleje133wAA PiVPEv7Ng0ax0HsZbFdrAQAA 97jbWt6jREaUl4rXa5NVVwAA False 1.5707963267949 15 xeFm2mXcmUG1GLleje133wAA False 1.5707963267949 30 xeFm2mXcmUG1GLleje133wAA False -1.5707963267949 15 xeFm2mXcmUG1GLleje133wAA clMaroon $00B9FFFF 754,412;659,334 AWfE0PcE9E2yxbur/XVL7QAA PiVPEv7Ng0ax0HsZbFdrAQAA NyGXcvLt806JIgSRkpaJQAAA False 1.5707963267949 15 AWfE0PcE9E2yxbur/XVL7QAA False 1.5707963267949 30 AWfE0PcE9E2yxbur/XVL7QAA False -1.5707963267949 15 AWfE0PcE9E2yxbur/XVL7QAA ParameterNameDiscoverer f0Rg6JdVd0OMg3954zePZwAA D/F61YWyhEONjE14BzITxAAA 11 clMaroon $00B9FFFF 516 132 263 72 sdkNone S9rVsuYid0qG3iqjPW+ZyQAA 1 ParameterNameDiscoverer <<interface>> False False S9rVsuYid0qG3iqjPW+ZyQAA S9rVsuYid0qG3iqjPW+ZyQAA clMaroon $00B9FFFF 144 260 247 43 EusnO/xxfUW/UYWdpEkPagAA 1 AspectJAdviceParameterNameDiscoverer False False EusnO/xxfUW/UYWdpEkPagAA EusnO/xxfUW/UYWdpEkPagAA False EusnO/xxfUW/UYWdpEkPagAA clMaroon $00B9FFFF 398 260 273 43 aGmuv2HtfUesXvS1CIWnRwAA 1 StandardReflectionParameterNameDiscoverer False False aGmuv2HtfUesXvS1CIWnRwAA aGmuv2HtfUesXvS1CIWnRwAA False aGmuv2HtfUesXvS1CIWnRwAA clMaroon $00B9FFFF 908 260 270 43 Ome5G3/EkEONgygVD2MOVwAA 1 LocalVariableTableParameterNameDiscoverer False False Ome5G3/EkEONgygVD2MOVwAA Ome5G3/EkEONgygVD2MOVwAA False Ome5G3/EkEONgygVD2MOVwAA clMaroon $00B9FFFF 680 260 222 43 Eg6zG5b0vECM2Y8CoFey1QAA 1 PrioritizedParameterNameDiscoverer False False Eg6zG5b0vECM2Y8CoFey1QAA Eg6zG5b0vECM2Y8CoFey1QAA False Eg6zG5b0vECM2Y8CoFey1QAA clMaroon $00B9FFFF 688 352 205 43 STGAmaM9E0KGT3XDAduASwAA 1 DefaultParameterNameDiscoverer False False STGAmaM9E0KGT3XDAduASwAA STGAmaM9E0KGT3XDAduASwAA False STGAmaM9E0KGT3XDAduASwAA clMaroon $00B9FFFF 337,260;527,203 w3fcAa6l80GxpLV9y/gZJwAA MuOzOP6jA0atcORaB/kX9QAA fEI6ArpNd0C/ipZi6amOyAAA False 1.5707963267949 15 w3fcAa6l80GxpLV9y/gZJwAA False 1.5707963267949 30 w3fcAa6l80GxpLV9y/gZJwAA False -1.5707963267949 15 w3fcAa6l80GxpLV9y/gZJwAA clMaroon $00B9FFFF 555,260;611,203 Soeo35xl3UaFeFxWL0VnUAAA MuOzOP6jA0atcORaB/kX9QAA 1BREFCvtgk6456ewWaLKcwAA False 1.5707963267949 15 Soeo35xl3UaFeFxWL0VnUAAA False 1.5707963267949 30 Soeo35xl3UaFeFxWL0VnUAAA False -1.5707963267949 15 Soeo35xl3UaFeFxWL0VnUAAA clMaroon $00B9FFFF 764,260;692,203 WXG2/YYn2UGl/VUYFaljpAAA MuOzOP6jA0atcORaB/kX9QAA D/uDnaB+XUyGvMs+NktkawAA False 1.5707963267949 15 WXG2/YYn2UGl/VUYFaljpAAA False 1.5707963267949 30 WXG2/YYn2UGl/VUYFaljpAAA False -1.5707963267949 15 WXG2/YYn2UGl/VUYFaljpAAA clMaroon $00B9FFFF 969,260;772,203 dB8BmUL09kimtKCYlNVCvQAA MuOzOP6jA0atcORaB/kX9QAA R7P7iuzcBkiK6xg7Hxe7VwAA False 1.5707963267949 15 dB8BmUL09kimtKCYlNVCvQAA False 1.5707963267949 30 dB8BmUL09kimtKCYlNVCvQAA False -1.5707963267949 15 dB8BmUL09kimtKCYlNVCvQAA clMaroon $00B9FFFF 790,352;790,302 3MON+E81HEaly5WjkSxOmAAA D/uDnaB+XUyGvMs+NktkawAA aK58oXkbQ0OzPF8/rB7GzwAA False 1.5707963267949 15 3MON+E81HEaly5WjkSxOmAAA False 1.5707963267949 30 3MON+E81HEaly5WjkSxOmAAA False -1.5707963267949 15 3MON+E81HEaly5WjkSxOmAAA ServletModelAttributeMethodProcessor f0Rg6JdVd0OMg3954zePZwAA UDJQm4b87ECfAwXFsnru6AAA 7 clMaroon $00B9FFFF 264 180 298 72 sdkNone peTc97n8EUu3mxXpQmi/OQAA 1 HandlerMethodArgumentResolver <<interface>> False False peTc97n8EUu3mxXpQmi/OQAA peTc97n8EUu3mxXpQmi/OQAA clMaroon $00B9FFFF 676 180 309 72 sdkNone AxM/7rK/g0GLar9wkB2XXQAA 1 HandlerMethodReturnValueHandler <<interface>> False False AxM/7rK/g0GLar9wkB2XXQAA AxM/7rK/g0GLar9wkB2XXQAA clMaroon $00B9FFFF 526 320 195 43 ibXQqLx7ckSWOfZXsxBLjwAA 1 ModelAttributeMethodProcessor False False ibXQqLx7ckSWOfZXsxBLjwAA ibXQqLx7ckSWOfZXsxBLjwAA False ibXQqLx7ckSWOfZXsxBLjwAA clMaroon $00B9FFFF 505 428 236 43 gjLsOeXqqkKj8QMxdihosQAA 1 ServletModelAttributeMethodProcessor False False gjLsOeXqqkKj8QMxdihosQAA gjLsOeXqqkKj8QMxdihosQAA False gjLsOeXqqkKj8QMxdihosQAA clMaroon $00B9FFFF 588,320;472,251 HhI8sYeMF0ys3M/9T2oTKwAA rv9PEXadqEGCBS48x/re7gAA fHdcTifBwkC3y1PUyVq6QAAA False 1.5707963267949 15 HhI8sYeMF0ys3M/9T2oTKwAA False 1.5707963267949 30 HhI8sYeMF0ys3M/9T2oTKwAA False -1.5707963267949 15 HhI8sYeMF0ys3M/9T2oTKwAA clMaroon $00B9FFFF 657,320;771,251 pn6vT5w+mkOaR1MQs1QN/AAA 5aum4bXNxkeh3XjMFIYN2AAA fHdcTifBwkC3y1PUyVq6QAAA False 1.5707963267949 15 pn6vT5w+mkOaR1MQs1QN/AAA False 1.5707963267949 30 pn6vT5w+mkOaR1MQs1QN/AAA False -1.5707963267949 15 pn6vT5w+mkOaR1MQs1QN/AAA clMaroon $00B9FFFF 622,428;623,362 xIbzWrL0vUa1uG6adJVk5AAA fHdcTifBwkC3y1PUyVq6QAAA 6TKNtNrhH06VHVI44sCUewAA False 1.5707963267949 15 xIbzWrL0vUa1uG6adJVk5AAA False 1.5707963267949 30 xIbzWrL0vUa1uG6adJVk5AAA False -1.5707963267949 15 xIbzWrL0vUa1uG6adJVk5AAA DataBinder f0Rg6JdVd0OMg3954zePZwAA esr4oSt9H0qUyMpIsMdqUgAA 11 clMaroon $00B9FFFF 148 76 515 85 sdkNone piQAW2SEpUe/rCvfoN3cQAAA 1 PropertyEditorRegistry <<interface>> False False piQAW2SEpUe/rCvfoN3cQAAA piQAW2SEpUe/rCvfoN3cQAAA clMaroon $00B9FFFF 700 76 474 85 sdkNone BG8MYkfwdk2lyYL04Q1hSgAA 1 TypeConverter <<interface>> False False BG8MYkfwdk2lyYL04Q1hSgAA BG8MYkfwdk2lyYL04Q1hSgAA clMaroon $00B9FFFF 631 228 86 43 pNvR01Bc6kuV6Ut9BnX1bwAA 1 DataBinder False False pNvR01Bc6kuV6Ut9BnX1bwAA pNvR01Bc6kuV6Ut9BnX1bwAA False pNvR01Bc6kuV6Ut9BnX1bwAA clMaroon $00B9FFFF 625 308 98 43 w2K7xvxiIUS65fEDoLk1mgAA 1 WebDataBinder False False w2K7xvxiIUS65fEDoLk1mgAA w2K7xvxiIUS65fEDoLk1mgAA False w2K7xvxiIUS65fEDoLk1mgAA clMaroon $00B9FFFF 631,228;491,160 2k6DnZODdEC7//zai45RMQAA Z2csDvZeFUaOqeDewRMYygAA eAOprjhxhkCW41wVvMB+eQAA False 1.5707963267949 15 2k6DnZODdEC7//zai45RMQAA False 1.5707963267949 30 2k6DnZODdEC7//zai45RMQAA False -1.5707963267949 15 2k6DnZODdEC7//zai45RMQAA clMaroon $00B9FFFF 716,228;852,160 Zz0GMpvSaEuQxvqqCKvZvQAA WShetbG+V0ycUL0v9FUi7AAA eAOprjhxhkCW41wVvMB+eQAA False 1.5707963267949 15 Zz0GMpvSaEuQxvqqCKvZvQAA False 1.5707963267949 30 Zz0GMpvSaEuQxvqqCKvZvQAA False -1.5707963267949 15 Zz0GMpvSaEuQxvqqCKvZvQAA clMaroon $00B9FFFF 673,308;673,270 5l972v0y/Ui0VCwW+tvW2wAA eAOprjhxhkCW41wVvMB+eQAA /kUDuaB74EeyUClxItcxlwAA False 1.5707963267949 15 5l972v0y/Ui0VCwW+tvW2wAA False 1.5707963267949 30 5l972v0y/Ui0VCwW+tvW2wAA False -1.5707963267949 15 5l972v0y/Ui0VCwW+tvW2wAA clMaroon $00B9FFFF 594 388 161 43 FLWL5G8Fy0eOR9NvFZcwTAAA 1 ServletRequestDataBinder False False FLWL5G8Fy0eOR9NvFZcwTAAA FLWL5G8Fy0eOR9NvFZcwTAAA False FLWL5G8Fy0eOR9NvFZcwTAAA clMaroon $00B9FFFF 567 468 214 43 oh1ObkvL10yOHzlD5I/pmQAA 1 ExtendedServletRequestDataBinder False False oh1ObkvL10yOHzlD5I/pmQAA oh1ObkvL10yOHzlD5I/pmQAA False oh1ObkvL10yOHzlD5I/pmQAA clMaroon $00B9FFFF 674,388;673,350 6ZPEreowskq8Ll4G5xoiKwAA /kUDuaB74EeyUClxItcxlwAA d7VoCDk8hkSRLCj9PxUMAQAA False 1.5707963267949 15 6ZPEreowskq8Ll4G5xoiKwAA False 1.5707963267949 30 6ZPEreowskq8Ll4G5xoiKwAA False -1.5707963267949 15 6ZPEreowskq8Ll4G5xoiKwAA clMaroon $00B9FFFF 673,468;674,430 FGAaCyp+t0aXHPA3PhpYRAAA d7VoCDk8hkSRLCj9PxUMAQAA q2B/MVi5VkuAa4yHdTEIkwAA False 1.5707963267949 15 FGAaCyp+t0aXHPA3PhpYRAAA False 1.5707963267949 30 FGAaCyp+t0aXHPA3PhpYRAAA False -1.5707963267949 15 FGAaCyp+t0aXHPA3PhpYRAAA WebDataBinderFactory f0Rg6JdVd0OMg3954zePZwAA Ua0UiXFEkkO5TOAMBHWKMAAA 7 clMaroon $00B9FFFF 499 64 488 59 sdkNone wKUl0IUMW0W9gNwI6CxlZAAA 1 WebDataBinderFactory <<interface>> False False wKUl0IUMW0W9gNwI6CxlZAAA wKUl0IUMW0W9gNwI6CxlZAAA clMaroon $00B9FFFF 665 169 157 43 9yrYPcKy+0uGnWPtCK2PsAAA 1 DefaultDataBinderFactory False False 9yrYPcKy+0uGnWPtCK2PsAAA 9yrYPcKy+0uGnWPtCK2PsAAA False 9yrYPcKy+0uGnWPtCK2PsAAA clMaroon $00B9FFFF 657 258 172 43 yhK7vbyjL06s/ziF6GC88gAA 1 InitBinderDataBinderFactory False False yhK7vbyjL06s/ziF6GC88gAA yhK7vbyjL06s/ziF6GC88gAA False yhK7vbyjL06s/ziF6GC88gAA clMaroon $00B9FFFF 641 347 204 43 UyKFirHXNU2r9RKRIB0gCwAA 1 ServletRequestDataBinderFactory False False UyKFirHXNU2r9RKRIB0gCwAA UyKFirHXNU2r9RKRIB0gCwAA False UyKFirHXNU2r9RKRIB0gCwAA clMaroon $00B9FFFF 743,169;742,122 S9JMEFMFmkO9hRPIOTyLkQAA Tbj+QFoOYEiOy3zrbRgqcQAA FcxNSNGHoESYUN+VRFn/KgAA False 1.5707963267949 15 S9JMEFMFmkO9hRPIOTyLkQAA False 1.5707963267949 30 S9JMEFMFmkO9hRPIOTyLkQAA False -1.5707963267949 15 S9JMEFMFmkO9hRPIOTyLkQAA clMaroon $00B9FFFF 742,258;743,211 V/WkItcHYkSPJfLrj/d9zwAA FcxNSNGHoESYUN+VRFn/KgAA meF/RUQ8a0mjB1ESPqnnUAAA False 1.5707963267949 15 V/WkItcHYkSPJfLrj/d9zwAA False 1.5707963267949 30 V/WkItcHYkSPJfLrj/d9zwAA False -1.5707963267949 15 V/WkItcHYkSPJfLrj/d9zwAA clMaroon $00B9FFFF 742,347;742,300 cqQ8qAvBDEeKhtLtVdPI0AAA meF/RUQ8a0mjB1ESPqnnUAAA ffq1tTCxjkay45CSLHGA3wAA False 1.5707963267949 15 cqQ8qAvBDEeKhtLtVdPI0AAA False 1.5707963267949 30 cqQ8qAvBDEeKhtLtVdPI0AAA False -1.5707963267949 15 cqQ8qAvBDEeKhtLtVdPI0AAA 167 Servlet f0Rg6JdVd0OMg3954zePZwAA 3 Ks6rX0+il0iUEc7xjIUcQwAA fywez4ypK0Ch3DCWIHqw/QAA Q4XMSa2HYkCYOdz4U3NfZwAA 1 LEvmY7HL40qa8iVZh9V2ggAA 5 void init KYvDnhPERUGmlOr1WfgA4AAA 1 ServletConfig config Ut36fygVEUWaE3shCHjclQAA ServletConfig getServletConfig KYvDnhPERUGmlOr1WfgA4AAA service KYvDnhPERUGmlOr1WfgA4AAA 2 ServletRequest req wO3uLqprPUu9drqZAusyfwAA ServletResponse res wO3uLqprPUu9drqZAusyfwAA String getServletInfo KYvDnhPERUGmlOr1WfgA4AAA void destroy KYvDnhPERUGmlOr1WfgA4AAA ServletConfig f0Rg6JdVd0OMg3954zePZwAA 3 e6rEaJzYDkuqYjmS/yF9lwAA 6bq7tVuvYk+DREGP7/EYNwAA gszVGn5gHkGFG+26cU7SBQAA 1 0bTfaPMFeEqBxALFDcXm4AAA 4 String getServletName oCLQaEBgN0GdzS2szSbCYQAA ServletContext getServletContext oCLQaEBgN0GdzS2szSbCYQAA String getInitParameter(String name) oCLQaEBgN0GdzS2szSbCYQAA Enumeration<String> getInitParameterNames oCLQaEBgN0GdzS2szSbCYQAA GenericServlet True f0Rg6JdVd0OMg3954zePZwAA 4 KxNwue2Vgk23Glq8kEyEOAAA dvO7F4Kfd0evvAjpZ05vMAAA e3RrYaZmhkSccC77OWEZugAA 1m5JcDaUxkiVpBLSOihQ1wAA 2 LEvmY7HL40qa8iVZh9V2ggAA 0bTfaPMFeEqBxALFDcXm4AAA 1 YIWmxsXEu0KvRp9lYw8e/gAA HttpServlet True f0Rg6JdVd0OMg3954zePZwAA 4 PebJUqm0VE6qwRlSamC0CgAA 1w/tNPZijk2GVNJwICC4EgAA emBMxdpxYE6iazkbcepCDwAA ePj6jMfG+kS6+eJIKRuINgAA 1 YIWmxsXEu0KvRp9lYw8e/gAA 1 V9IfGmpo0UGSprBtBAVSWQAA HttpServletBean True f0Rg6JdVd0OMg3954zePZwAA 4 u2ryrU/9DE+awawwhRVT2QAA mFiX7pbzgUO8tv1ICJESGAAA 1FtlAx3TZECcZYJnmQbmnQAA f3Ni7bfNqESYyGw5aklUvgAA 2 ZUxkxGLwJ0eYLM61LGyp6AAA nDakRT7vJE+KK7cPVTqVDgAA 1 V9IfGmpo0UGSprBtBAVSWQAA 1 yjHE5EN36EmADe7XUvKNvQAA 1 void init TwF5XgXvBUuIg23H6ZBEkgAA EnvironmentCapable f0Rg6JdVd0OMg3954zePZwAA 3 5DWmCMy4X0+iSDxYeg5oVwAA n4w4lkkUYkSCUn4Rr5alKgAA 92I5+oCa/EevfXP6JlpbOwAA 1 ZUxkxGLwJ0eYLM61LGyp6AAA 1 Environment getEnvironment RFrO1VM1DEOizbIeECf2RAAA EnvironmentAware f0Rg6JdVd0OMg3954zePZwAA 3 u5S9WxTu4UmwXqf7lRV8WQAA QNmkqTEKM0qLG9adKhwubgAA kDHJQMR+4EGXxECA0InJIAAA 1 nDakRT7vJE+KK7cPVTqVDgAA 1 void setEnvironment Jc/u5AyE0kG9m7n2kkUKPAAA 1 Environment environment X57S12c+3UORW36IOmQAvAAA FrameworkServlet True f0Rg6JdVd0OMg3954zePZwAA 4 oux1accGxEe/ly2hVFy3twAA ioAinZxNykyVrWAcc84fyAAA A+H+UWs2w0u1WEIQN0Jd2wAA gtLAxzXAI0KFR+MvS/+6lgAA 1 V/FAXXV8gUqutMl79uVYDQAA 1 yjHE5EN36EmADe7XUvKNvQAA 1 R66uZdhpKkKIpZT5C8p98wAA ApplicationContextAware f0Rg6JdVd0OMg3954zePZwAA 3 wPkUbLpuREeph8svWnaJKgAA hNo0OBexQk+nCtsOYNotZgAA IxQkZ2+TNEG8DVCi/WDLEwAA 1 V/FAXXV8gUqutMl79uVYDQAA 1 void setApplicationContext AuGq5cSqVUO2MNtdVVodQwAA 1 ApplicationContext applicationContext 2BfimuCwDUS7MQ4bCyz8pwAA DispatcherServlet f0Rg6JdVd0OMg3954zePZwAA 4 1yN4hmJPiUSoOF2AkIhuPwAA AvP1+PUrskOgaRFAh3i0VwAA l2tQL/zrOEWbUvsKy8fc1wAA 8mmIRPtmREOWBdXmnXFO+QAA 1 R66uZdhpKkKIpZT5C8p98wAA f0Rg6JdVd0OMg3954zePZwAA f4v1EpUVAkCPdoJhUwDnmAAA KYvDnhPERUGmlOr1WfgA4AAA 4 cW9QBRKsSU2RWz+kWpRBzgAA CK4Y4iAaZUe5a1p/v6oGuQAA upI7yaoJ8E6/vOAVNP2KIwAA ulRErcMTuEGpf3Lw67gOCAAA f0Rg6JdVd0OMg3954zePZwAA f4v1EpUVAkCPdoJhUwDnmAAA oCLQaEBgN0GdzS2szSbCYQAA 4 n1OwfxbWf02Xnc/sW4PTTgAA 8SvqRawCNEiZuIuK9q6QkQAA x+7cKFta/kGUje+KRG3zuAAA gQwOsxr7SEqP4YcQ+TwffgAA f0Rg6JdVd0OMg3954zePZwAA /KnYxBaLvUy0nm8OvyWxkQAA f4v1EpUVAkCPdoJhUwDnmAAA 4 tvx5aE9+c0KnzgSaqugkVwAA 762Lv1Kv7k+l8oMxky1acgAA LrWPzF4tZUeduoIfzVu02wAA qLDLmpeOHUGe2/6ZCDGlngAA f0Rg6JdVd0OMg3954zePZwAA TwF5XgXvBUuIg23H6ZBEkgAA /KnYxBaLvUy0nm8OvyWxkQAA 4 QQcLQJsQL0OxPhBmYJWfIgAA L4nX9F1Aa0GLnmkXNuGZKgAA eilWzqNOr0abMILpX3ZHkwAA YLc53KUBO0yaOxyR1GaI2wAA f0Rg6JdVd0OMg3954zePZwAA ltXDdHS34kiCTU8QOKZ14QAA TwF5XgXvBUuIg23H6ZBEkgAA 4 NqusrSu6ykSHEqxE52LZ0QAA /e1nKQAzZUq2woJVgl/f+gAA sKxFhKn4gUClPcpG9ZUA9QAA f5J2FOAnbE6LzUZOGgHslgAA f0Rg6JdVd0OMg3954zePZwAA 9EGFl/Pzg0mks6m2Zi7pkgAA ltXDdHS34kiCTU8QOKZ14QAA 4 E/A3f+YZokaBThsviqos9AAA oJ0cEf8DIUyof/EEsxXN5AAA o53kc4roEkyfz0Z3Pj+CEQAA kbLWwuJGsEy9iL6OWUOYBQAA f0Rg6JdVd0OMg3954zePZwAA TwF5XgXvBUuIg23H6ZBEkgAA RFrO1VM1DEOizbIeECf2RAAA 4 +Ukzwty5eE2519G6QNLxjgAA Kcr04MrSS0uky7f7c/zLhQAA BHE2tnP2pEqhDkQEMkDYVQAA FUQWEhJlSkWcHafMAY+bzwAA f0Rg6JdVd0OMg3954zePZwAA TwF5XgXvBUuIg23H6ZBEkgAA Jc/u5AyE0kG9m7n2kkUKPAAA 4 sCn3TXu/9kWc5Wqhz5k1yQAA XR9O9EMSok2dmR6ITrjVGwAA JN2ytkRjMUu56V9P7ij2TQAA dii5XfohokyJDald3JDE2wAA f0Rg6JdVd0OMg3954zePZwAA ltXDdHS34kiCTU8QOKZ14QAA AuGq5cSqVUO2MNtdVVodQwAA 4 qKtcVY4seUeUVowMtc7DYQAA pzKBOV+PxUWedTBFykXzUQAA hZOQkbgWCEizLPn0+8V5GQAA GAFqYiCEJU2IvZcNPeNLhwAA ApplicationContextInitializer f0Rg6JdVd0OMg3954zePZwAA 3 oWnqcNvYCEuKlsCJ+5EdgQAA LoDOGkkifU6kXmV7X+SnGwAA OxnV1EYCmUiZ7cjxwPzjKwAA 1 void initialize XKSFCo5Lb0Gw3V9Y/xMnrAAA 1 C applicationContext 1D/m3bcqmUGUwl/Z8mz6PgAA XmlWebApplicationContext f0Rg6JdVd0OMg3954zePZwAA 4 eCEhXosv9EmbL0UyC38sqgAA URT2TPQFRk6io3ZiaySPyAAA b8HwveRNbkmFhUmYK54ixQAA AssX+gYQTEqAXGB/dgNrKAAA 1 OLDvPGGN9EGoKH1BKjG2bAAA 2 void loadBeanDefinitions 8Ch72XTb50ixrh0yRy77FQAA 1 DefaultListableBeanFactory beanFactory c9y3i/pnTky2yS6+VFPaxwAA String[] getDefaultConfigLocations 8Ch72XTb50ixrh0yRy77FQAA AbstractRefreshableWebApplicationContext True f0Rg6JdVd0OMg3954zePZwAA 4 At070RH95EqoXmQwoZQtbgAA rl0A05NsQE67IfYIqQW0OAAA ZkVwAqDGBUmARdj18o/wvgAA cz+waWpHjEKY7a0vp+8OAwAA 2 /sS870tmU026vltizDWkngAA 5SgrnsXGV0uerouV8BK7xQAA 1 FR4nH+J0qkmAZVK2YYtEKQAA 1 OLDvPGGN9EGoKH1BKjG2bAAA 2 void postProcessBeanFactory c2E+iZlpXkSEld5WkPHlIQAA 1 ConfigurableListableBeanFactory beanFactory ne3tWJTo2U6Gw2kLaPQBKwAA void initPropertySources c2E+iZlpXkSEld5WkPHlIQAA AbstractRefreshableConfigApplicationContext True f0Rg6JdVd0OMg3954zePZwAA 4 GBXTS2KHfEOT0oqsOsT2rwAA 5fRbNqhvi0qGn1yFNyzxCAAA gQXOsK6YCUChtkGT8ax7/gAA F6q9xt9vuU+8GVgw4A2IagAA 1 FR4nH+J0qkmAZVK2YYtEKQAA ConfigurableWebApplicationContext f0Rg6JdVd0OMg3954zePZwAA 3 JRe67b+UWUmgSZrOODcyAQAA 1nxmD6AyqUmSkD+7M8QeKwAA xifu6RaYAE+/Yfo2jgASlQAA 1 /sS870tmU026vltizDWkngAA ThemeSource f0Rg6JdVd0OMg3954zePZwAA 3 sxwpLwIhn0u6QdDxD/1g5wAA TX3Bay1zBUmd0f5Oa822NAAA UttRbRJjLE6eXSWnmCknwQAA 1 5SgrnsXGV0uerouV8BK7xQAA 1 Theme getTheme(String themeName) Yx4TqFuvck6/KBu4Z3VE/gAA f0Rg6JdVd0OMg3954zePZwAA c2E+iZlpXkSEld5WkPHlIQAA sSfjMeIB9kq2+GN50O2NlgAA 4 unSEh4iXw0KbNX3Wn12T3gAA OR2580DfjE2C7B90KNKd1AAA J0aIMfhovEaLJLczvPE4PwAA Spol1dDASECwTzuch7YtHgAA f0Rg6JdVd0OMg3954zePZwAA 8Ch72XTb50ixrh0yRy77FQAA c2E+iZlpXkSEld5WkPHlIQAA 4 DVNkEpKj40WC/eZ94mUKcgAA GiEo+/rI8E+L6QAxlDWVNAAA z6l/uKNK7UiEK9B5noHyXAAA SXOO5RLhRUyhGAy6cquN8gAA f0Rg6JdVd0OMg3954zePZwAA c2E+iZlpXkSEld5WkPHlIQAA jlx8iL8U50WGIDOgiAm3BAAA 4 eTaOqJIdWEiaZ7TLHVBkvQAA NU9oG93VQ0++O/OJcbGXQQAA Vz2RphyLfUeqHfv9IsBizQAA teHuBbuWWU6r0KZaemUTvgAA f0Rg6JdVd0OMg3954zePZwAA c2E+iZlpXkSEld5WkPHlIQAA Yx4TqFuvck6/KBu4Z3VE/gAA 4 GvzHyxAuTk2leBPlDUSIqAAA YeBtd0mORkSsLthnKyu+eAAA cGHTIxo9PUqydzkbF+G6EgAA rXF6q3UZKEGMoXyefb3HRQAA MultipartResolver f0Rg6JdVd0OMg3954zePZwAA 3 cLyHIL7DcUKaRXCqMEnI4gAA V/nIpCNfiUK1ql+H5/J4BAAA suYbLpZlbkqcKcwY/NTkcAAA 2 NBugcb/hyESxCBU5YkU/3AAA P/5pDX5YKkWe4J8YRkWjxgAA 3 boolean isMultipart bzy0HsHOXUSVkX63Lk/ULAAA 1 HttpServletRequest request HWuuDLgkok2G+1qcYLRLIQAA MultipartHttpServletRequest resolveMultipart bzy0HsHOXUSVkX63Lk/ULAAA 1 HttpServletRequest request 0TSNZuQXPE+w5QT6gREKJwAA void cleanupMultipart bzy0HsHOXUSVkX63Lk/ULAAA 1 MultipartHttpServletRequest request Q2KmjEB1sE62jcmabEqOlAAA CommonsMultipartResolver f0Rg6JdVd0OMg3954zePZwAA 4 Gz8cAbjkokiwaAfdyZpP6wAA Jf8xs8z9SEqMubs7E2pVLgAA MYLhXLHOIUKrBOET1/JCpQAA 1RMZMXtn30SbmMC1ZLzhfgAA 2 eTuzvA8IFUyyTdBmMdaWJAAA NBugcb/hyESxCBU5YkU/3AAA 1 I9woo1noz0+XqjFqV60y7wAA CommonsFileUploadSupport True f0Rg6JdVd0OMg3954zePZwAA 4 1+7s9Da6GkidJDZeFoo2owAA PLyPA4j1f02dUNc97lhQjQAA +AW7l/8xm0eH2VfQkJFJtAAA zhnpBPc5E0Gk6mPdXjjrWAAA 1 I9woo1noz0+XqjFqV60y7wAA ServletContextAware f0Rg6JdVd0OMg3954zePZwAA 3 xCzk2UYTkkScqREE+fuW5gAA Ivklu5Y4JEeETAEkvp1rmAAA F0EgORIiekG5my67dJ1IcwAA 1 eTuzvA8IFUyyTdBmMdaWJAAA f0Rg6JdVd0OMg3954zePZwAA OBLST6vyhUSLCnvyhIYD9AAA mXAGdX89nUao0MyLBt/LPQAA 4 CWzmV9D0L0OluxnOsMBCTwAA cJ8trSvkgE63jn/TF1BgxQAA kUCI2ZKMdkKHuoMfTnrNYgAA UXuJSo9JqEaoR1Q6Jpvm+AAA f0Rg6JdVd0OMg3954zePZwAA OBLST6vyhUSLCnvyhIYD9AAA bzy0HsHOXUSVkX63Lk/ULAAA 4 yrgtsfBH9kmzFjJ5cm98jgAA 4ECQ7a1qpUuEpjwyWCj1jAAA RZrFBa901kWhU2jsK5AX1QAA HHFoJ0aZkE6aUt+Qhy5eKwAA f0Rg6JdVd0OMg3954zePZwAA OBLST6vyhUSLCnvyhIYD9AAA 3tJ+mJ25w0i7sKGlSMxkigAA 4 pejOe163y0WTIVIcA3KFigAA us33H+bhOkiYJ4Ge6Y03/gAA KuB0FEpiC0SjmYkduhlttgAA X7SigWKmdk+DnViQnNr0QQAA StandardServletMultipartResolver f0Rg6JdVd0OMg3954zePZwAA 4 w0KLyYPsNUiG9pZplyd+wgAA J+mkRlH7DUahfDsh968RTAAA UnfY4iM1Bk+rzmMpIPXotAAA 3w4DcHHs2EO+rkDZ1hNjFAAA 1 P/5pDX5YKkWe4J8YRkWjxgAA f0Rg6JdVd0OMg3954zePZwAA V48zERVUrk6Pc5BU27IGfwAA bzy0HsHOXUSVkX63Lk/ULAAA 4 D0x24VY9W0er1GK7ouu+GwAA 4baNL5Wrz0OXVcYn6jjd+gAA 8zQFlrAKRkacKbFxZzodPAAA up5NLvEgP0WdRpk4Mx56HwAA ThemeResolver f0Rg6JdVd0OMg3954zePZwAA 3 w9d9k9RXUUqmkhYYpBErpwAA 9+GT/qnAoE+/XyMreTzxzgAA 6+RL5WVVlUuvgwUtZBZtBAAA 2 Mj5C3vaa3064dXsQUTshOwAA GWiNbONnRkeynPEth8vJdgAA 2 String resolveThemeName 1L1AgY4dI0CqSTB6N8UJ/wAA 1 HttpServletRequest request PChcNFUGD0iZEEZrjDvS8AAA void setThemeName 1L1AgY4dI0CqSTB6N8UJ/wAA 3 HttpServletRequest request ZLXCPcmJKE2qBHx3Nmlq4QAA HttpServletResponse response ZLXCPcmJKE2qBHx3Nmlq4QAA String themeName ZLXCPcmJKE2qBHx3Nmlq4QAA AbstractThemeResolver True f0Rg6JdVd0OMg3954zePZwAA 4 ndE66U2aS0avoNLBtmWBPwAA PY2CfcNqGUm7VAoj5bORuwAA 5Cr91nJp/kWc+YB9BIp3DgAA SawSnOaof0i5Rg01LpkYCgAA 1 Mj5C3vaa3064dXsQUTshOwAA 2 DZcq/kI8uE6+25ezals1hQAA DHQwqlpzDUKAwUOoY6IG0wAA FixedThemeResolver f0Rg6JdVd0OMg3954zePZwAA 4 R0wPA/dsYESSCqLbvbRoKgAA DIMSutFcCkiMzKn6lG/j3QAA /SCr0Hdar0WCdc2M6Q/mdQAA X3SdmTyKU0+UWEU+KQ9g+gAA 1 DZcq/kI8uE6+25ezals1hQAA SessionThemeResolver f0Rg6JdVd0OMg3954zePZwAA 4 s3vyYeqzekWLdp/CVHktgAAA c6xKrcxptU6GuHtYftn8+wAA EkC18raMGEaqhGKoy4SvAwAA W9Dy6gnJBEWr03B9NsvorwAA 1 DHQwqlpzDUKAwUOoY6IG0wAA CookieThemeResolver f0Rg6JdVd0OMg3954zePZwAA 4 P9vKkr4B2UmjF4/ZaVlxPwAA NXj3sre0mEKnXzxQj0YbGwAA lXTB9XdaSEyOhQHOMcTDhQAA GBs192HnDkOIKrFhNTQisQAA 1 GWiNbONnRkeynPEth8vJdgAA 1 ZI75IbMDcEGrNC2Xrm1h7QAA CookieGenerator f0Rg6JdVd0OMg3954zePZwAA 4 VyvV1/JJ8kGWX0Ln2ekAdgAA zBOPMqE8JU6FKQBgwExoqwAA QIw7CL63r0C/af5zEFsPIAAA aJwWBsTNrkSK8uGlCgSwlAAA 1 ZI75IbMDcEGrNC2Xrm1h7QAA f0Rg6JdVd0OMg3954zePZwAA MnCErTea1UyNRv7Kqtz02gAA 1L1AgY4dI0CqSTB6N8UJ/wAA 4 ETHOFUzhNk+taEjPvcHSjQAA /JUmpfJJu0G5Tz+gFsZk9gAA feyjqnfYrEShCsA+MtU/3gAA 7TIePVKZC0mcJgTeR+9tDgAA f0Rg6JdVd0OMg3954zePZwAA uVFLyowa3Ea3C5HNP4tyPgAA MnCErTea1UyNRv7Kqtz02gAA 4 qqT0ICtd/U6BZHksWza6DwAA 69TsKoA25U6lFWdlXniBNwAA SnkYgQ/veUSQaeaeWX/pXQAA iLQJ6LYOPkyQMqX+M6Gi/gAA f0Rg6JdVd0OMg3954zePZwAA 6AwD3EtYMUWP8F4wx4jqRwAA MnCErTea1UyNRv7Kqtz02gAA 4 33OUitUNjkKb+R2PnJjEWQAA M5nQmDFrmEyO6c7SM2br3AAA amg9dcaZD0manJtROE07FAAA 1X03OsIZikK4wWOS84itegAA f0Rg6JdVd0OMg3954zePZwAA 3+2AXZNdcEq0u0wW2CBsdwAA 1L1AgY4dI0CqSTB6N8UJ/wAA 4 qPIS/swSyUCd0JQorSWIOgAA vC33lu/9CEWsnOYN+m6lfQAA WrHirLp/7Umfe8yJz/PHGgAA Oad9q5OoYU2R1PoMSpmGCAAA f0Rg6JdVd0OMg3954zePZwAA 3+2AXZNdcEq0u0wW2CBsdwAA jRhsUCVGb0S4HBSvzB1MtwAA 4 G3aWuHC6rUyxa+elB6V3+AAA s4raLrRVTEqmcqIvy8J2jwAA J0d1KZ4mGUydVZKCxCyhlAAA mhfm4fVt1UytxA/hDbhVDgAA RequestToViewNameTranslator f0Rg6JdVd0OMg3954zePZwAA 3 /88g7G8i1UiX///NmJcfaAAA 1WNvQzU/XEWVhTNF8abIgAAA sPF52ckEM0mCW4iiJqonOgAA 1 u3DnpkCSq0y/Puz0gIjqPAAA 1 String getViewName tzD0sDn2YkOCcCOaoDuVCAAA 1 HttpServletRequest request gGW7vppYkEOWBePbNTWXHgAA DefaultRequestToViewNameTranslator f0Rg6JdVd0OMg3954zePZwAA 4 /cGa35P/8UaBWJeBmdMU7AAA nafffnRQIEGuY7eKGo/ExQAA rrfty72Vrk+zqYvJ++q+GwAA QUkx9BYs0ka08r2iMoO0lAAA 1 u3DnpkCSq0y/Puz0gIjqPAAA f0Rg6JdVd0OMg3954zePZwAA Rf5OCNrHp0epiEJxn07PCgAA tzD0sDn2YkOCcCOaoDuVCAAA 4 YbZ4nz/XdEmYQ+3ypY2oIwAA y3P3qi257UCxolRZu2pyKgAA RKG7kkwSvk6ZeoJl2kMUPwAA bbxfDUcgqUSXlbwn4owQQQAA FlashMapManager f0Rg6JdVd0OMg3954zePZwAA 3 nvB5btIYd0SG1bUOsNlFawAA qrsLECSslk+GUwLfakeTNAAA aaBdA2b880ODsvYlII0RhgAA 1 Jc+p0G4kc0y3zHPOVzvQlgAA 2 FlashMap retrieveAndUpdate NkV5ZWQTRUib20/4ZsKoZAAA 2 HttpServletRequest request J6HRGoQhb0WJj3eQKlF50AAA HttpServletResponse response J6HRGoQhb0WJj3eQKlF50AAA void saveOutputFlashMap NkV5ZWQTRUib20/4ZsKoZAAA 3 FlashMap flashMap iAUb9rnwG0SdamUr4dlqsQAA HttpServletRequest request iAUb9rnwG0SdamUr4dlqsQAA HttpServletResponse response iAUb9rnwG0SdamUr4dlqsQAA AbstractFlashMapManager True f0Rg6JdVd0OMg3954zePZwAA 4 0LGwXMIbzEuMSxJODwxdugAA Y+2J3nmFK0q9ilMnqT91kAAA 6Y9RPEc470aPh5Lr3So3HgAA l01yagHBIk2RG/LiyoUGvQAA 1 Jc+p0G4kc0y3zHPOVzvQlgAA 1 Ygss1yreHkWvM1vnHb0SAQAA f0Rg6JdVd0OMg3954zePZwAA 8lT3HupezUSZAJhm7EvYygAA NkV5ZWQTRUib20/4ZsKoZAAA 4 s2/wvyP4+0SjF4nBXY/arwAA 2PC3KhUMWECFLzjp1t/t4QAA Io0QrmPGOESSk3uH5H4oCwAA wD4mtDGIo02F67318vAdpQAA SessionFlashMapManager f0Rg6JdVd0OMg3954zePZwAA 4 7Z9Nhl2DlE+QBdxSa/ztLAAA 4Gdv0IugaUmDky/FCaXsxwAA 1EL9Zn5Yy0iUYKiBj7aDGAAA u1RWyINDIEu8vNBEFgJS/wAA 1 Ygss1yreHkWvM1vnHb0SAQAA f0Rg6JdVd0OMg3954zePZwAA ZKdVdU8qFEu8uthlK2IcGAAA 8lT3HupezUSZAJhm7EvYygAA 4 A4uxBg4m8ESs0YIY5wMGXgAA h6gpOXmLTE2Kd27Rpmvz2gAA rtetdfqNeUy4b6FgUt+3/wAA Aaox8Oxl3k6jLeKHlexW2QAA RequestMappingHandlerMapping f0Rg6JdVd0OMg3954zePZwAA 4 xxqcW5/dNk6tPx2Hrl4xSAAA D5B26LIU2USMRgsFGJnDwwAA sEpsYSTAME+MUsmq3OGSfgAA PMcwkZMwx02r4yqeAe2K1AAA 1 ID4ylR3G5UeYCX2wyEVWnwAA 1 void afterPropertiesSet I7LmkY1t90eDwhLcK1fSVgAA RequestMappingInfoHandlerMapping f0Rg6JdVd0OMg3954zePZwAA 4 J0cqIN8K/keOIBdrRJr6/AAA k1Wn5SNSGEqGzl/jQDIhhgAA 2p9BenOj1k+yYAmbi1voVQAA QlwWsai+SkmxMzxmpntw2wAA 1 TdRn6Tmkq0eN1rnhKpa+tAAA 1 ID4ylR3G5UeYCX2wyEVWnwAA AbstractHandlerMethodMapping True f0Rg6JdVd0OMg3954zePZwAA 4 mb1u52bAikutZKGQ5w93YwAA WhHFOAqKBUWKbfbe1k1maAAA CbYS8uUl+kGr5gelnPYdvQAA ac5SISj1eECZMzSplTCxGQAA 1 y2ItXIPhnUC8FBLuQM9nJAAA 1 +jicsi4SoEusxAs/fJ/3RQAA 1 TdRn6Tmkq0eN1rnhKpa+tAAA 2 void afterPropertiesSet HSCkIBk+hkiJqPYPqjk/QgAA HandlerMethod getHandlerInternal vkProtected HSCkIBk+hkiJqPYPqjk/QgAA 1 HttpServletRequest request eqDjQFsuuU+GRBZ9o2uU/wAA InitializingBean f0Rg6JdVd0OMg3954zePZwAA 6 0zth/Aiwc0iVadhMocJEDgAA Q2sB/ujmF0S0p2ZKgvsEAAAA x/GuWx0PH02eXU3CswgD+AAA exatLu4MlEae2b5E9yIOKQAA j+OxtxOtn0CbnCec73KRlwAA 2aLjpVJviUyC2p2iK2JP1gAA 2 y2ItXIPhnUC8FBLuQM9nJAAA fxF1KSwR/0O1dOQTG5mA9gAA 1 void afterPropertiesSet j9wsgsOO0E+thBPcV0OAzgAA AbstractHandlerMapping True f0Rg6JdVd0OMg3954zePZwAA 4 WJ9M9TokuEu6EezmNbO5dAAA VAouJBW1BEGhb+BT9bNhugAA /8EcDvWziUOImXV5GWoeQAAA wvOyUHwtaEKViu+ft2Vy/gAA 1 hWkD+h1WKkKNiFTJktZ0IwAA 1 K25qCaH5/kGuV6wwIE0SxAAA 1 +jicsi4SoEusxAs/fJ/3RQAA 1 HandlerExecutionChain getHandler hWJbr02mKkWmFJRZx6ftoQAA 1 HttpServletRequest request HuvfUq1Iq0y3ZaC/fN1+DgAA HandlerMapping f0Rg6JdVd0OMg3954zePZwAA 3 J5jBaaDVpkSz4/fu2WTTfgAA JsMUjKDBhEGjhr/SnDkmoAAA NcLUv1QsQ0+gray3+W36eQAA 1 hWkD+h1WKkKNiFTJktZ0IwAA 1 HandlerExecutionChain getHandler fsf8hLsoxE+9lzaCT3rScAAA 1 HttpServletRequest request vvRLErCWA0avHyuZdYSgtAAA f0Rg6JdVd0OMg3954zePZwAA hWJbr02mKkWmFJRZx6ftoQAA fsf8hLsoxE+9lzaCT3rScAAA 4 zIo/Lys82U62ScmByK6oDgAA /KPAEintK0mGS0aJ1cmaVwAA aInK3WsQl0SppDRH0P0lSwAA j4C9HJ06XEeg2PXuLQZ1cAAA f0Rg6JdVd0OMg3954zePZwAA HSCkIBk+hkiJqPYPqjk/QgAA j9wsgsOO0E+thBPcV0OAzgAA 4 zlzrnjKu90GK49qxt445lQAA yYrUNLhz1kyF1TaafcoljgAA UYsRYV7gF0GM6yL3R2bv4AAA oJqccnTw/0mKoP3znrr2XgAA f0Rg6JdVd0OMg3954zePZwAA HSCkIBk+hkiJqPYPqjk/QgAA hWJbr02mKkWmFJRZx6ftoQAA 4 MYOVTFoZ70az98eohMHKQAAA 0unCDjh4S0a/6pAGxOLvnQAA 2P/mpz5zUUaTTCg+JEIjPAAA 8uKMrL+kmU663MfeB6js+gAA f0Rg6JdVd0OMg3954zePZwAA z++oSXObbES5tw+wqCVHoAAA HSCkIBk+hkiJqPYPqjk/QgAA 4 qCL542YDYkGzGX8yRWQ0tAAA 9KesHbkpy0GNSgJu43BPtgAA KCuyQegRXEW9hKLgf75/cwAA LPyZ5qfMY0KMkbuTSgLJjgAA f0Rg6JdVd0OMg3954zePZwAA I7LmkY1t90eDwhLcK1fSVgAA z++oSXObbES5tw+wqCVHoAAA 4 ySnh4/U9B0OlnDd5rHv6+wAA 52HluTqaYUW4nxCwnsOy+AAA uKrtoEy1AE2sQbCEIMDbsgAA 0zvq0lCzWECOSyBD8CAyqQAA MappingRegistry f0Rg6JdVd0OMg3954zePZwAA 4 L5A+Vkv22UCHaf1WLXnGoAAA tbt+D4qV9EmT4yC2inwkOAAA ysMuC/QHDUCqriTZJLF0IwAA 0L+zA1hlmESb13tTbHjxUQAA 5 Map<T, MappingRegistration<T>> registry vkPrivate t0599765yk+Qjo2VUOWOqAAA Map<T, HandlerMethod> mappingLookup vkPrivate t0599765yk+Qjo2VUOWOqAAA MultiValueMap<String, T> urlLookup vkPrivate t0599765yk+Qjo2VUOWOqAAA Map<String, List<HandlerMethod>> nameLookup vkPrivate t0599765yk+Qjo2VUOWOqAAA Map<HandlerMethod, CorsConfiguration> corsLookup vkPrivate t0599765yk+Qjo2VUOWOqAAA HandlerMethodMappingNamingStrategy f0Rg6JdVd0OMg3954zePZwAA 3 0ZQkZTRaOEKoBt+Zhk7ptAAA iYX2bCL+fEKqMRLIXbsR7wAA I7om0vgIBUCjWQqTtYamXgAA 1 e5+I1YGrK0KXbkx7JKWxogAA 1 String getName mu6eRhsZ9keo3eDhpb8MwgAA 2 HandlerMethod handlerMethod Y/+oNZVJz0+AuGhA+q3aFQAA T mapping Y/+oNZVJz0+AuGhA+q3aFQAA RequestMappingInfoHandlerMethodMappingNamingStrategy f0Rg6JdVd0OMg3954zePZwAA 4 0i2nY4WxyES5XtqKxJnFbgAA P47i92CLPUC1b1Soxf937AAA cNYxvuPBIkiuvGd2EjroGQAA rMtyaGB1fEy8AfKSbVueGgAA 1 e5+I1YGrK0KXbkx7JKWxogAA f0Rg6JdVd0OMg3954zePZwAA +5zdjjyqekuGgSQrItz/OQAA mu6eRhsZ9keo3eDhpb8MwgAA 4 TQcg39hhT0eA1Wi5ZPRoWQAA lVgD5QnfZk2+7ChahyJjpQAA vVVDinWcC0+AcWga/JRuwAAA satmh3YKREi8TWeZQUaSlwAA HandlerAdapter f0Rg6JdVd0OMg3954zePZwAA 3 hEZdIt5XLUa5r9GRfedZygAA v62mfE1KnE2m8HKbo+gtSwAA 1p+gPwJSdEGjn3h3McLDoAAA 1 VQfomvvNHE+V2Ny+ptniFgAA 3 boolean supports P9LWKSEPeUiQ9BPbfShT5gAA 1 Object handler zoIQVn8Nk0ua8HFHNKTNGAAA ModelAndView handle P9LWKSEPeUiQ9BPbfShT5gAA 3 HttpServletRequest request nAQcyYGxXU6GlLjgY2o8CgAA HttpServletResponse response nAQcyYGxXU6GlLjgY2o8CgAA Object handler nAQcyYGxXU6GlLjgY2o8CgAA long getLastModified P9LWKSEPeUiQ9BPbfShT5gAA 2 HttpServletRequest request OLBea4mjV062gQs8MNmdsQAA Object handler OLBea4mjV062gQs8MNmdsQAA AbstractHandlerMethodAdapter True f0Rg6JdVd0OMg3954zePZwAA 4 aV8H3Ywb00SZkaX/Q80fjwAA iQf1grkET0q5JCfIK9s+KAAA 1j5vkUIniU+UQT52iTtSlwAA K2iQ/+zldkiTsqUm1gIy8QAA 1 VQfomvvNHE+V2Ny+ptniFgAA 1 VU6AbDQkEkGiYYRtgd/ISQAA 1 JS56EPSKRU2LHL0t8xdROAAA 3 boolean supports pH/WzjI5u0mqJnosZPjqQwAA 1 Object handler cpoyxUyrOEWQh1Zu6iz0EQAA ModelAndView handle pH/WzjI5u0mqJnosZPjqQwAA 3 HttpServletRequest request 8+sKi8HSMk+vEgzXuYKDZAAA HttpServletResponse response 8+sKi8HSMk+vEgzXuYKDZAAA Object handler 8+sKi8HSMk+vEgzXuYKDZAAA long getLastModified pH/WzjI5u0mqJnosZPjqQwAA 2 HttpServletRequest request 3p2nOUG720yT/Zq0qF1gwwAA Object handler 3p2nOUG720yT/Zq0qF1gwwAA WebContentGenerator True f0Rg6JdVd0OMg3954zePZwAA 4 Ap2vjPYHSUiEL7nUV2AqnAAA pV446wjSrESUhaNa2YFBeQAA VJ5Sqj+NS0i6UsLWS3sIhAAA luoxQxon7EKU30tiUA3tQQAA 1 VU6AbDQkEkGiYYRtgd/ISQAA RequestMappingHandlerAdapter f0Rg6JdVd0OMg3954zePZwAA 4 g5Z1jBuMbkStHnbrdrW5UAAA F2zVDXGGMkygYjdrjTA5jgAA QL7/gF+5E0KdzjM3o0XKJAAA zxRzaBbiCU6PIPpWo4fJeQAA 2 HfclQ7eRFEmmEXD6ZlopOgAA fxF1KSwR/0O1dOQTG5mA9gAA 1 JS56EPSKRU2LHL0t8xdROAAA BeanFactoryAware f0Rg6JdVd0OMg3954zePZwAA 3 cg5SZWOX6UiTmWp/lN8+vAAA kvGh3UAeLUafrOt8H3yQjwAA zohfIAapUUaMhVHCfD106wAA 1 HfclQ7eRFEmmEXD6ZlopOgAA f0Rg6JdVd0OMg3954zePZwAA pH/WzjI5u0mqJnosZPjqQwAA P9LWKSEPeUiQ9BPbfShT5gAA 4 pzMeVYGWgUO11XpOlgAwiwAA 7k7HnUtgEEObcVjbVHy2+wAA LeIFV0plzU+vydvEkh5WzAAA F2nXD+q4x0K4xUtGYHG38QAA f0Rg6JdVd0OMg3954zePZwAA S5mwE3w/r0qrZoPVjC7RuAAA k4lixbF1SEyM1kaa5rokMgAA 4 0Pc4J5oYSUuMub9fG8I/6QAA 8wHbazM0YUOVeBTVQcSYbgAA v0q2aMfQfEyQmLicdSrU0wAA qYAVZER0r0mNyzZj1PEFPAAA f0Rg6JdVd0OMg3954zePZwAA S5mwE3w/r0qrZoPVjC7RuAAA j9wsgsOO0E+thBPcV0OAzgAA 4 P/y/eFBzCEm8PAcd1Z3UowAA 5n88mdn4SEiOg518NR5yVwAA dHunhxSA1kaJf8EJ8nYzRQAA sDpOuhIDvkGQBjRCEVoziQAA f0Rg6JdVd0OMg3954zePZwAA S5mwE3w/r0qrZoPVjC7RuAAA pH/WzjI5u0mqJnosZPjqQwAA 4 7HxSdZbZ2U2WBetwwMaYQAAA 4MtlP6gX+EOOqNJw6goIHAAA UxxElRnSEEqwVGjpDXqqdgAA 8dmWAXOB0UK1Q3kX+xcEeAAA f0Rg6JdVd0OMg3954zePZwAA pH/WzjI5u0mqJnosZPjqQwAA IH/K7OkzSkuMtLUntlnj0QAA 4 Rudl+HYOy0Wdd14mrnHLuwAA T/dHBZZgckWb+n4T2w7EhQAA T37GR//uQEuV+b+LmcS9CAAA biJAFUcDG0qPbOlrcyXwKwAA HandlerMethodArgumentResolver f0Rg6JdVd0OMg3954zePZwAA 9 vWfojbrAMUmYsvomk6kLvQAA bI+cXd6Kc0yBYNCAY5fPpgAA Edr2pVCtqk6UsuvdLkTqEQAA LLn27gmaHEKAiZZT+MLONwAA 8N5RHGxfE0CjfGJ2yn9G+QAA cpvr6q+p8EexEbvLlFbXYgAA rv9PEXadqEGCBS48x/re7gAA YIXUuCCHyEqo+uZGf/4WPQAA ngAwPD+33UKpwqHhnEEK/wAA 4 sQQIFHG3aE2xOYT+cKjRdwAA 5SVpxR1180CZSECIlxOBIAAA NaM3heUPo0q20AUHwMJ3CwAA HhI8sYeMF0ys3M/9T2oTKwAA 2 boolean supportsParameter peTc97n8EUu3mxXpQmi/OQAA 1 MethodParameter parameter SSNvru4rCU+6YObFmoRG1wAA Object resolveArgument peTc97n8EUu3mxXpQmi/OQAA 1 ... OtPoGhq2PEypIruIfEiTjQAA HandlerMethodReturnValueHandler f0Rg6JdVd0OMg3954zePZwAA 9 koFyJoNyJUaSI1YEJQYVjQAA pssrew/SVkeC8yF9kdNfHwAA E+BRXJh8HUeWzAoIR0H+XwAA Xk8eOEILgU6VT93LOCT5kQAA nqLfmK28q0mqqD9Umo+gPAAA AMAv97kycUK0nGzgCQ3kQgAA 5aum4bXNxkeh3XjMFIYN2AAA Aj0bbg4KYE6Jtpw6W0leswAA bDHFjw0JXEG3VVmRirexnQAA 4 mEb/Cv39rEi2aR36ilmqjQAA K+7PNUoTiUabFxJ2oKgHVQAA 3BIm9nAI6UC51JF8+fP6XAAA pn6vT5w+mkOaR1MQs1QN/AAA 2 boolean supportsReturnType AxM/7rK/g0GLar9wkB2XXQAA 1 MethodParameter returnType 0e8IaPjkGk+iKYuVrnF+FwAA void handleReturnValue AxM/7rK/g0GLar9wkB2XXQAA 1 ... dto+ls9tcUiA0Km66gIa3QAA WebApplicationObjectSupport True f0Rg6JdVd0OMg3954zePZwAA 8 pbj6YPhmDk+VIk6wawBkCwAA 8k+ESmxfP0qfodaoqm9qlgAA 8T17i0Aq5EqiDnHqBo/0qgAA dTu/8jdP4EmRCKfj0otSpwAA YOcuVaqOO0i43iL5BQl1kgAA 0VOx/l+q0EqoQWWJkogwWgAA 9BjIksq2u0WZE0JNYCP8UAAA 2qCSnS5rd0OABYKd2nVx1gAA 2 K25qCaH5/kGuV6wwIE0SxAAA mMxUqMbZq06P49NoVDxIjAAA f0Rg6JdVd0OMg3954zePZwAA hWJbr02mKkWmFJRZx6ftoQAA VdRjTKH9x0q2TDUhyLicIQAA 4 Dh6hzE9OI0mnRZb3sYLbBwAA h/w7f7BwB0qohGDZK6KIyAAA UDHlIgbudUyU0odo1AHY+gAA Y0OvZI1yHUixYE4IJ1TxmgAA HandlerInterceptor f0Rg6JdVd0OMg3954zePZwAA 3 Vsrcv1GlPUW7UEqmhNOXyQAA 0L0S7ky9O0qw5kzelqZixgAA 0TE6Uqw11U6wTrRH+GbzBAAA 1 Pom7RsAxBkysjOFzZ23C7QAA 3 boolean preHandle 34MuS4CjkE2INIiH+mvl7AAA 3 HttpServletRequest request ci1ZNH7jzkSy2OVog2//ygAA HttpServletResponse response ci1ZNH7jzkSy2OVog2//ygAA Object handler ci1ZNH7jzkSy2OVog2//ygAA void postHandle 34MuS4CjkE2INIiH+mvl7AAA 4 HttpServletRequest request ojh5vEnqtkqTA8bVPStYpQAA HttpServletResponse response ojh5vEnqtkqTA8bVPStYpQAA Object handler ojh5vEnqtkqTA8bVPStYpQAA ModelAndView modelAndView ojh5vEnqtkqTA8bVPStYpQAA void afterCompletion 34MuS4CjkE2INIiH+mvl7AAA 4 HttpServletRequest request 4qafpJYAP0qswMwN9ju7GAAA HttpServletResponse response 4qafpJYAP0qswMwN9ju7GAAA Object handler 4qafpJYAP0qswMwN9ju7GAAA Exception ex 4qafpJYAP0qswMwN9ju7GAAA MappedInterceptor f0Rg6JdVd0OMg3954zePZwAA 4 /r+oaTFh7Ee5ODkBUIeRkAAA TZAz6mOz2Uyz6jelyRkWnAAA esVpeP9SAEiTzfY6TyVDtwAA 5u8yw7vyQ0Cs+ySsPkcLowAA 1 Pom7RsAxBkysjOFzZ23C7QAA f0Rg6JdVd0OMg3954zePZwAA Zl+YmWnJ3UeQIzXjIYV56wAA 34MuS4CjkE2INIiH+mvl7AAA 4 8mI7BulEnkO8C/EMDBAJ2wAA MYFBze3mmEKGiy+QYxdOgwAA Rg/3exiZhkmDBlHxfvDxQAAA gNHoQL62FUuEPeXivDgRuAAA BindingAwareModelMap f0Rg6JdVd0OMg3954zePZwAA 4 yczEQBFNHUmdg2RhkXNuCgAA HtZ60peYbEqPihZITBA10wAA ug/N6rO0dE+C79PAHbcBHgAA 11f0zBn+M0+pD8z9iw1EAQAA 1 jDWDf1x+Wkir7RzwYvKkxgAA 2 Object put kQOUueqHjkmdtHHUDXf/1wAA 2 String key a2Xjm6x39kW7q1eRHtEClQAA Object value a2Xjm6x39kW7q1eRHtEClQAA void putAll kQOUueqHjkmdtHHUDXf/1wAA 2 Map<? extends String Fo60wBPvhUWy0aHQZmUDvAAA ?> map Fo60wBPvhUWy0aHQZmUDvAAA ExtendedModelMap f0Rg6JdVd0OMg3954zePZwAA 4 1weYwaQE9kyB66/0mg2/dwAA 6+ng/eDZYUGq4wUm/bsrQAAA KsEQXQqbcE25k+5dTbSbGQAA TJXT8c2fEkS5uZBYq3TSDQAA 1 MiF/FUdDW0K0t2B2mCeVRgAA 1 LsDLvdPXE0m6Ml4gJpZrAAAA 1 jDWDf1x+Wkir7RzwYvKkxgAA Model f0Rg6JdVd0OMg3954zePZwAA 3 iwMtqwlvmEaaBzV2JWWR7QAA 4vtUeIlBLku+DMMNxUFL7AAA mGqXKYY/akeFuQN0T2eZxwAA 1 MiF/FUdDW0K0t2B2mCeVRgAA 7 Model addAttribute suU2FV83akiIvB2iFyOM5QAA 2 String attributeName h/mOlo0f8Uy0wd0/GXFwFgAA Object attributeValue h/mOlo0f8Uy0wd0/GXFwFgAA Model addAttribute suU2FV83akiIvB2iFyOM5QAA 1 Object attributeValue fmN2wk6nHUaOKX9t82UGOwAA Model addAllAttributes suU2FV83akiIvB2iFyOM5QAA 1 Collection<?> attributeValues zJGZSw/pVUu8QSSB6oeNogAA Model addAllAttributes suU2FV83akiIvB2iFyOM5QAA 2 Map<String zx0CNZZiJUOFINxDnOKt3wAA ?> attributes zx0CNZZiJUOFINxDnOKt3wAA Model mergeAttributes suU2FV83akiIvB2iFyOM5QAA 2 Map<String xw0jGoi6o0eZeMBq4xvGigAA ?> attributes xw0jGoi6o0eZeMBq4xvGigAA boolean containsAttribute suU2FV83akiIvB2iFyOM5QAA 1 String attributeName iksKKhNpP0i8hXF7y0YbagAA Map<String, Object> asMap suU2FV83akiIvB2iFyOM5QAA ModelMap f0Rg6JdVd0OMg3954zePZwAA 4 m/iITAKzjUe7VujEdtgALgAA dRPDDS7G7kywaoG+j9GVQgAA Ign32Es7f0qmMyxx2MWylQAA ss9GdcmDlUKKViQCp7bZQgAA 1 3hyjckFm/kuVfgh75XNgrgAA 1 LsDLvdPXE0m6Ml4gJpZrAAAA LinkedHashMap f0Rg6JdVd0OMg3954zePZwAA 4 Fd/tuvuQ+k25OO6KV4c9bgAA oAVdfVEbz0KQHmiOmdNHpQAA uvqWxJQOZUGIgIaiZUZqvQAA oGRv/nFV+UShtXt3CT1xTgAA 1 3hyjckFm/kuVfgh75XNgrgAA f0Rg6JdVd0OMg3954zePZwAA pM2QuuYO906NPK8Ly6nsQQAA suU2FV83akiIvB2iFyOM5QAA 4 XwOiOYiiXEiQH2nznPSJjAAA f10XRd7CZ0WGYIudbjCs8QAA /RagPI7JZkmVi7USnz4iQwAA kPLtQoyizU613LL/yEIdIwAA f0Rg6JdVd0OMg3954zePZwAA kQOUueqHjkmdtHHUDXf/1wAA pM2QuuYO906NPK8Ly6nsQQAA 4 QhpWrNEBw0SKn2y1cmlHcgAA FT+qz06Flk6+WgLmytvEhgAA FZBSBakNBUWu0JM6+/I9WwAA 1FM/t5IvU0W815+sk/pOZgAA f0Rg6JdVd0OMg3954zePZwAA pM2QuuYO906NPK8Ly6nsQQAA rdCBGQUTjUG01tNnH0eKMQAA 4 gXPCq8hB5kqVpwtQdPXcSAAA UclcEGsGGEGJ7YsyW/WGIAAA /UwjbrIYwEO+Pdu+hOe4ZgAA P9jXkPEYBUW3wX7pGCHeIAAA f0Rg6JdVd0OMg3954zePZwAA rdCBGQUTjUG01tNnH0eKMQAA +y2niSqlZEOrMzTuYv+P2wAA 4 ZsEtZkr/SEOhHXmn5JotLQAA +B2ZCEXeaUCTQpqD1olEuQAA jzbnUvZFB0iZftZpjKPDAQAA 3GerbwcHBEO4w5KAo8eVXwAA ModelAndView f0Rg6JdVd0OMg3954zePZwAA 4 26ifn2Vy6E6RT1oJKfZlpQAA Byt5HF2Te0+lJl3EFTfMtgAA gZMD9sngWECp8Ai29TGyGQAA Kq7TtUW72EiSesuPYPla6gAA 3 private Object view vkPrivate sHlN8aad10q+F8wPL61ebwAA private ModelMap model vkPrivate sHlN8aad10q+F8wPL61ebwAA private HttpStatus status vkPrivate sHlN8aad10q+F8wPL61ebwAA ViewResolver f0Rg6JdVd0OMg3954zePZwAA 3 GMAY3sqT80qJlom6Jxn8UwAA +87WcpafSUOYJIQSsLQn/gAA FY+6dWGAg0O4p9w6K+ciiAAA 1 View resolveViewName JvJ8gV4JQEOBPHhHoH7URAAA 2 String viewName 41CI9U8bZE2NAKduGOIOTAAA Locale locale 41CI9U8bZE2NAKduGOIOTAAA JstlView f0Rg6JdVd0OMg3954zePZwAA 4 Ax5zQ1pX8kW6nQ0B/5HziQAA E1nCxctGHkCLQlI6RP5EvwAA 2shuE5N3lUmc9wQyQauiwwAA 24es78uY6EWul4QSYe/aqgAA 1 xMSxwwfB/0ySn/o5aV63TQAA InternalResourceView f0Rg6JdVd0OMg3954zePZwAA 4 T/hiU08Cpky742S+aRlmzQAA k4r3ZBZJlUqpbQCrOtLB2AAA ilwPHx8KvUKS561Nfa8z9AAA avwSgH5H/UmTLMoUlABUbAAA 1 eptNU+0rWEarSHMtLAYnrAAA 1 xMSxwwfB/0ySn/o5aV63TQAA 1 void renderMergedOutputModel vkProtected oPrfV8sK+UehGGzzdjD1JwAA AbstractUrlBasedView True f0Rg6JdVd0OMg3954zePZwAA 4 oy0okoqEUkCf3T29WWC/vAAA A19GRvggy0+oW8kz2TDHKwAA 6B0ahz5Cc0CxAn9GCxNaRAAA XRkJu197+EWh7oaOepMslQAA 1 BRiFOxmRnkGsuxV0L3e0cwAA 1 eptNU+0rWEarSHMtLAYnrAAA AbstractView True f0Rg6JdVd0OMg3954zePZwAA 4 2Jm29axtJE++cNOa//TJhgAA JGAkPSZt3k2Z9doJzNiecgAA phc/oBWdUkyTTNmJ63vrGwAA rWS8CLPI40mL84NwSZfIMAAA 1 i78pwC5P3E6vVZVFE77HxQAA 1 mMxUqMbZq06P49NoVDxIjAAA 1 BRiFOxmRnkGsuxV0L3e0cwAA 2 void render AGEFwSafw0mcGoVXG9IdyAAA Map<String, Object> createMergedOutputModel vkProtected AGEFwSafw0mcGoVXG9IdyAAA View f0Rg6JdVd0OMg3954zePZwAA 3 JkP4Bb47oESHbsfWkUVYIwAA LhpBOtmiB0WJ/njaQyI6HAAA 2d5oAqd3yECYHtLdQfPC/QAA 1 i78pwC5P3E6vVZVFE77HxQAA 2 String getContentType Y008w8yBL0WWE/Ef9LEKIAAA void render Y008w8yBL0WWE/Ef9LEKIAAA 4 Map<String PzrpwC0RnUWnDMDzDsNQygAA ?> model PzrpwC0RnUWnDMDzDsNQygAA HttpServletRequest request PzrpwC0RnUWnDMDzDsNQygAA HttpServletResponse response PzrpwC0RnUWnDMDzDsNQygAA f0Rg6JdVd0OMg3954zePZwAA AGEFwSafw0mcGoVXG9IdyAAA Y008w8yBL0WWE/Ef9LEKIAAA 4 iYVFhautpUqHcmfGtyit4QAA ZwUflEngb0qD8DCpzcjscQAA 19tmbz2XRkSKB9CyoOQJhQAA /6+KPMDAb0qn95brneVpoQAA f0Rg6JdVd0OMg3954zePZwAA W9EFyLGB1kOldHtJY6fTVwAA AGEFwSafw0mcGoVXG9IdyAAA 4 u5EI3Omsqk2OZ4S7lR4MvgAA IaVnEFfsD0Oduvij8wZGFwAA +YscJ+ptGUu4acmig8Sq5gAA 8dK1yTvmlUWRD7KC9dJtGQAA f0Rg6JdVd0OMg3954zePZwAA oPrfV8sK+UehGGzzdjD1JwAA W9EFyLGB1kOldHtJY6fTVwAA 4 tBJLi9sgl0202tw8HRXarQAA mZ7WMxbn00CsIP3S1EzC/wAA Ec6jf6y9lEiCEjJ/WnlM2gAA G95WrrAv1Ei8zJ4aTLWglgAA f0Rg6JdVd0OMg3954zePZwAA QsoN6yHoL0S9L7ynSjsYwwAA oPrfV8sK+UehGGzzdjD1JwAA 4 Sd8nJgWzYkionyDumdbCgwAA SQaWXwWa+0K9ONsZS3V+KQAA K3Y4sCYDKkaBMQPGH4ptzAAA qPEYpqgmikKbNYtotBHaugAA f0Rg6JdVd0OMg3954zePZwAA AGEFwSafw0mcGoVXG9IdyAAA VdRjTKH9x0q2TDUhyLicIQAA 4 oqTT4eCo702g1U2Cg/sUdAAA uU7FKAx83U6I/Djsn4AeuwAA 0i9rk/najU6jlFmsKjmNjQAA R7rYfF2NK0aWmuKVb+tTcwAA HttpMessageConverter f0Rg6JdVd0OMg3954zePZwAA 3 3vYbrx83pEim0OpKCBi/uAAA HR9X3UTauU+BN2xqI1ezFwAA o1im2AIiT0q6tXH1LySSSAAA 1 4hV0rG1wG02PNvqMJN1YVQAA 5 boolean canRead vjmgu3Nx4kGMsc11dh8uZQAA 2 Class<?> clazz TRp96guNaUmErsJhY0+HPQAA MediaType mediaType TRp96guNaUmErsJhY0+HPQAA boolean canWrite vjmgu3Nx4kGMsc11dh8uZQAA 2 Class<?> clazz ji2gyDEUb0mYlDaR4aHEKAAA MediaType mediaType ji2gyDEUb0mYlDaR4aHEKAAA List<MediaType> getSupportedMediaTypes vjmgu3Nx4kGMsc11dh8uZQAA T read vjmgu3Nx4kGMsc11dh8uZQAA 2 Class<? extends T> clazz LbO6wZjpL0GB5/QX6B58JwAA HttpInputMessage inputMessage LbO6wZjpL0GB5/QX6B58JwAA void write vjmgu3Nx4kGMsc11dh8uZQAA 3 T t NPs4ggjPkUW7xM0CG7hcsAAA MediaType contentType NPs4ggjPkUW7xM0CG7hcsAAA HttpOutputMessage outputMessage NPs4ggjPkUW7xM0CG7hcsAAA AbstractHttpMessageConverter True f0Rg6JdVd0OMg3954zePZwAA 4 P7g5pjgOTkSkVMqEDXnabwAA ZyUsRcAfoUyq4nlL90wNFgAA /oXUpPUW6U6coKkzpHTlVAAA iyN6Dl0guEOymkRjr/dV9QAA 1 4hV0rG1wG02PNvqMJN1YVQAA 1 VD9NGwQZrke9icf4qyymfQAA MappingJacksonHttpMessageConverter f0Rg6JdVd0OMg3954zePZwAA 4 wup5EFs88U65K09mqe7jDwAA jxMGp4rxUEmcAzMKiQT64wAA K/gG+pgReUiik/nYBC92HgAA agTFl3JI80mWYigGblrk1AAA 1 VD9NGwQZrke9icf4qyymfQAA f0Rg6JdVd0OMg3954zePZwAA k4dVaCK+0EOvRMGpg9covwAA vjmgu3Nx4kGMsc11dh8uZQAA 4 Ymy6pgnYWkeAOdk1OVielgAA uKsnom3ytEW0aE+cXQE3igAA 4emm0yjq20+55cd1WKWhkwAA 7ftLbyValUywNu6P3I/7ywAA f0Rg6JdVd0OMg3954zePZwAA EyhXgq7qgESeqz+/nt70GgAA k4dVaCK+0EOvRMGpg9covwAA 4 6DNGu+3LT029awBitHRrDgAA TvfbkxhR60O543BKP7S7IQAA 1p3wHV2vC0Ke4kJUWWsO9QAA nBUI/wa11E+SufyQtnxh6gAA MapMethodProcessor f0Rg6JdVd0OMg3954zePZwAA 4 G3P1RzfHOEif0Rm+5n5bdAAA P02Q5tnkN0i9fNpKmdPKdQAA 77oVLajMNUeoPypVBWfOrgAA Iz52sv33E02XRUFLS0WwPwAA 1 K+7PNUoTiUabFxJ2oKgHVQAA PathVariableMapMethodArgumentResolver f0Rg6JdVd0OMg3954zePZwAA 4 rWbKpIK68EOHgTG5XaoMMgAA moiNbcPkhkWde+p6oGFH4gAA 12Tq9h/dfkK3vwlWAYfE5gAA XkidN6anE0mb+Iq16gwigAAA 1 sQQIFHG3aE2xOYT+cKjRdwAA ServletResponseMethodArgumentResolver f0Rg6JdVd0OMg3954zePZwAA 4 GecEzH15S0Ce177SYy3TwAAA vEcD8/4QOkKHdZ75vpZVZQAA voRuGUYAbkObmb6WAq08+AAA dv6AhgmAWUO46KU0ssIr5AAA 1 NaM3heUPo0q20AUHwMJ3CwAA AbstractNamedValueMethodArgumentResolver True f0Rg6JdVd0OMg3954zePZwAA 4 7fpn78OszUWbSa1TjakxCQAA YYxiJmc2EUunx0KhfM44rwAA Ul18WvaFeU6W4FnhqFz54AAA c/0LzgURpEK2xkaeAHZc+QAA 1 5SVpxR1180CZSECIlxOBIAAA 1 YFvr82XHYEu3i295fq3p8gAA RequestParamMethodArgumentResolver f0Rg6JdVd0OMg3954zePZwAA 4 4Zp9SjLhLEmntoaqtlBFegAA Qf6aa3SMPE6KCkPDaL7i4gAA WN/OfLbaAEqaAVf6KN4ymwAA +890/sM7Q0Gm5sq7hp9zsQAA 1 YFvr82XHYEu3i295fq3p8gAA f0Rg6JdVd0OMg3954zePZwAA W1BZOaLkYkatOyYr9SsO9AAA peTc97n8EUu3mxXpQmi/OQAA 4 rowDQAwltEWjU2IPXzHziQAA c2uWZHhkY0a9u987C5A6hgAA hHoyIZLQxkW3FmfXng+4IAAA B6Q+GfXRsEyWMkRV/Q/2vAAA f0Rg6JdVd0OMg3954zePZwAA Wydlsf+lkUupAFMS7TfKrAAA peTc97n8EUu3mxXpQmi/OQAA 4 yVoQWUyavU+eK1gDaPPdXgAA YGersUBFUUeNMhSCnwyMEQAA dFqQ2DZo+kq9WyTbA/b+wgAA oHbQHFILqEuscupTjOeY4AAA f0Rg6JdVd0OMg3954zePZwAA z7Ue44lm3kG5ueGF/vqlbgAA peTc97n8EUu3mxXpQmi/OQAA 4 QMV6WLfrtkaGaHKe7VtpYgAA IS75z2CB4UKXNokqo5lmdwAA vBxQ9Q1rykeOMZxc+YwRlAAA es9IG7ITgkm8kuB3FW+huwAA f0Rg6JdVd0OMg3954zePZwAA iZYSjZyvPU+jnYRxKm7aqAAA Wydlsf+lkUupAFMS7TfKrAAA 4 hq88zw4k70uKx+ni1h8u+gAA f2t+x6Xv2US7jt2+8C2DlgAA pUfTfZJWK0GsKT86bKiGywAA asuj2qRpykybt3uBOWWFiAAA ModelAndViewMethodReturnValueHandler f0Rg6JdVd0OMg3954zePZwAA 4 sf/k8yDjt0KQVXLrcpkrLwAA H5Tfay7byUe9cd4rFtnDgAAA tiP+HsU0bESpgevcZcnnGQAA neJD4gF8qEC4BITC21miNQAA 1 3BIm9nAI6UC51JF8+fP6XAAA AbstractMessageConverterMethodProcessor True f0Rg6JdVd0OMg3954zePZwAA 4 PiVPEv7Ng0ax0HsZbFdrAQAA Q6UsANIBTEGzilC848nJUwAA z6V++fmpyUGx9vS71LlzqAAA e2lnY8q5Sk+gQabOrexL9AAA 1 mEb/Cv39rEi2aR36ilmqjQAA 2 xeFm2mXcmUG1GLleje133wAA AWfE0PcE9E2yxbur/XVL7QAA RequestResponseBodyMethodProcessor f0Rg6JdVd0OMg3954zePZwAA 4 97jbWt6jREaUl4rXa5NVVwAA +PF7jnJnXUyLA+j/l8JqnAAA eGGB0Tr3CU6Ma+0rzCJiSAAA JT5k+gJoj0il6CehXToeIgAA 1 xeFm2mXcmUG1GLleje133wAA HttpEntityMethodProcessor f0Rg6JdVd0OMg3954zePZwAA 4 NyGXcvLt806JIgSRkpaJQAAA nsSzUIPDh0O6636UocUIiQAA 8U2OKKnBMEmGNLDCljQcPAAA AI60Y6x8KUeVOyMRPjMjXQAA 1 AWfE0PcE9E2yxbur/XVL7QAA f0Rg6JdVd0OMg3954zePZwAA QQEH2ZkIjkmLYjQ3Lwb9AAAA AxM/7rK/g0GLar9wkB2XXQAA 4 J58U4cmy1ESJHIqfa2GfegAA 0u2Y+yfqrkC9SqP60ybBYgAA c4+iYWjYwkipeBJSX6JwyQAA GExzRQkeXECGQMDwAcsWIwAA f0Rg6JdVd0OMg3954zePZwAA zu1w8soHAkenWv1bwxYzkwAA AxM/7rK/g0GLar9wkB2XXQAA 4 Pr8OaZWLvkmsQmtV3iQMsgAA lznkdymWVU28q6wvB+ToqQAA 4SpgeTp9DUWw7Mc4/UMgXgAA rF7S/Gqg3kG6n+/MaQLQRAAA f0Rg6JdVd0OMg3954zePZwAA 7BNIixKWb02lxPhYnXinpAAA AxM/7rK/g0GLar9wkB2XXQAA 4 MqmuszD2zEmYtJyrFE1b/QAA JLquvqy8DE+N6Nm9NDnBZAAA uqWhQd8wskOb0LOivS09tAAA lG0Q4L0kCUq5atDxdasO5AAA f0Rg6JdVd0OMg3954zePZwAA u4H7QCrawkus132viddzmAAA QQEH2ZkIjkmLYjQ3Lwb9AAAA 4 Ow27wf0d4Uqf1+1oN7jcJwAA aHIuFwjo1k6wzi4jc0bdxgAA rEoovFxOwE6WJyLN1J1pjQAA luIGzOddtEy/yFlH38GpMAAA f0Rg6JdVd0OMg3954zePZwAA tpDzLzQhWUGeCQJWPifH8AAA QQEH2ZkIjkmLYjQ3Lwb9AAAA 4 cjTN8e53D0G8941L2kS2JwAA YOSKDAe7c0KF0QIxbmGuvwAA NMXgKkGNt0iMouo0BkcWQAAA IkfcDb4ehE+HTur8Cc/saAAA ParameterNameDiscoverer f0Rg6JdVd0OMg3954zePZwAA 3 MuOzOP6jA0atcORaB/kX9QAA nV+yC9Ps5UOttnx0pGvKbAAA Ij54U7UHQ0WE/GDoba1jtQAA 4 w3fcAa6l80GxpLV9y/gZJwAA Soeo35xl3UaFeFxWL0VnUAAA WXG2/YYn2UGl/VUYFaljpAAA dB8BmUL09kimtKCYlNVCvQAA 2 String[] getParameterNames S9rVsuYid0qG3iqjPW+ZyQAA 1 Method method Q/rpDiw0uEK9j2hTvWYCaQAA String[] getParameterNames S9rVsuYid0qG3iqjPW+ZyQAA 1 Constructor<?> ctor /z4A2haccUCkGEMeCirsmAAA AspectJAdviceParameterNameDiscoverer f0Rg6JdVd0OMg3954zePZwAA 4 fEI6ArpNd0C/ipZi6amOyAAA o3PBJ7+GtEK8CZ6J9b4NxAAA mtaE894IBkeeZyEBvI8Z1AAA JQhx9fdcoES9YKxl8x2mcQAA 1 w3fcAa6l80GxpLV9y/gZJwAA StandardReflectionParameterNameDiscoverer f0Rg6JdVd0OMg3954zePZwAA 4 1BREFCvtgk6456ewWaLKcwAA ccFUSstNC0W1TmHCTtvI4QAA Q9ooOZ3ZH0OiCL0fYILeywAA SrN+/ne8d06sOWyHpGBPwAAA 1 Soeo35xl3UaFeFxWL0VnUAAA LocalVariableTableParameterNameDiscoverer f0Rg6JdVd0OMg3954zePZwAA 4 R7P7iuzcBkiK6xg7Hxe7VwAA +LqHur4VVEWdQiS0NldEUQAA 8758Yie/W06XxG4+m7xmqAAA nza7HjjvFkqxaq7NhQSjXwAA 1 dB8BmUL09kimtKCYlNVCvQAA PrioritizedParameterNameDiscoverer f0Rg6JdVd0OMg3954zePZwAA 4 D/uDnaB+XUyGvMs+NktkawAA dqnqABFBTk252LI2u1bLTQAA 2RB5Y9sUu0SP9OG+tmiH9gAA S2BDaBrLE0SkeeljYeEoHAAA 1 WXG2/YYn2UGl/VUYFaljpAAA 1 3MON+E81HEaly5WjkSxOmAAA DefaultParameterNameDiscoverer f0Rg6JdVd0OMg3954zePZwAA 4 aK58oXkbQ0OzPF8/rB7GzwAA UyjYipx/akmJ0rFaIKhsmwAA 2bIE/r5XBkW39reep3txvAAA FVour3KRQECtsK1Db6MGlwAA 1 3MON+E81HEaly5WjkSxOmAAA f0Rg6JdVd0OMg3954zePZwAA EusnO/xxfUW/UYWdpEkPagAA S9rVsuYid0qG3iqjPW+ZyQAA 4 N+4zh8yGdU+Uw6w6O5hMfAAA F9lArrtfnU+n/vbo8kuCTAAA NiwgpMW+y0q7s0SouADHyAAA aPHmKGBne06nuVsOe8IkHQAA f0Rg6JdVd0OMg3954zePZwAA aGmuv2HtfUesXvS1CIWnRwAA S9rVsuYid0qG3iqjPW+ZyQAA 4 Lwfdyl+I5EWNiwRkxvpAAgAA pRTkMM9xok+P6YIXKiB98wAA bpaT9OlJqUaENpFhRxHrdQAA /CxD7oHbu0WVUBlNICIs1QAA f0Rg6JdVd0OMg3954zePZwAA Eg6zG5b0vECM2Y8CoFey1QAA S9rVsuYid0qG3iqjPW+ZyQAA 4 Mn8wGhs3wkeAp+b1SeJ5IgAA nTUavkBpvkWG2iM1ZWJdpAAA xHN+5OJEjkiH/GzTZW7g2QAA IRkrkTvyCEuXa5hC5sBtUgAA f0Rg6JdVd0OMg3954zePZwAA Ome5G3/EkEONgygVD2MOVwAA S9rVsuYid0qG3iqjPW+ZyQAA 4 CEdVeaqlLUWLgU3IOVtTrAAA Oxgr6qYQRESE9J8d0Hp9cgAA +qQEJjx0dki6lbIjDarZ3QAA dOqr8z7PSkiG0yiawCjEIwAA f0Rg6JdVd0OMg3954zePZwAA STGAmaM9E0KGT3XDAduASwAA Eg6zG5b0vECM2Y8CoFey1QAA 4 cM0Rna6XgUKQuJ0YEhjRqgAA U23nNFKBvUeP3Nwewvi7FgAA +0Nw5xsKokqDkrsMbESbRgAA xuTQv6cGO02PQeK9RkRpDwAA ModelAttributeMethodProcessor f0Rg6JdVd0OMg3954zePZwAA 4 fHdcTifBwkC3y1PUyVq6QAAA Bzyy0AttQ0ejvr94QbZ9OAAA 3SEBCl7JyU6hZJua7KMhgQAA JLPdPSuraUOowDy6WUdGtgAA 2 HhI8sYeMF0ys3M/9T2oTKwAA pn6vT5w+mkOaR1MQs1QN/AAA 1 xIbzWrL0vUa1uG6adJVk5AAA ServletModelAttributeMethodProcessor f0Rg6JdVd0OMg3954zePZwAA 4 6TKNtNrhH06VHVI44sCUewAA 7RpMlA7t6UyWY2IsslzXOQAA yMn4xSD1qEmjzQvI+iPkwAAA 6X889fII70WGx2Ah9hgiswAA 1 xIbzWrL0vUa1uG6adJVk5AAA f0Rg6JdVd0OMg3954zePZwAA ibXQqLx7ckSWOfZXsxBLjwAA peTc97n8EUu3mxXpQmi/OQAA 4 fn2T6Y7SXEuqh7G8Lr2x0QAA WX2dmI75IkmcteUji6UVjwAA q6NhrPu8q0y2y389l10nDQAA PeFoagF5IkSp9Zawyno52wAA f0Rg6JdVd0OMg3954zePZwAA ibXQqLx7ckSWOfZXsxBLjwAA AxM/7rK/g0GLar9wkB2XXQAA 4 +140xJ7iT0CXzJ2NXqrV0AAA 35jyvaS4CUCwi4QnNWurIwAA FPnOefJKG0uZUOwJdwe9sAAA tnpPbeksYEqsQP9BFdWRsQAA f0Rg6JdVd0OMg3954zePZwAA gjLsOeXqqkKj8QMxdihosQAA ibXQqLx7ckSWOfZXsxBLjwAA 4 SPO5vrS66U+/OiwocIcGPgAA Y9NHEXK2NkCj6nnMGPdk3QAA nDMxMrRsj0atX22tptcvuQAA nOXi52n3D0Sx0OqmVZEclAAA PropertyEditorRegistry f0Rg6JdVd0OMg3954zePZwAA 3 Z2csDvZeFUaOqeDewRMYygAA uSYe0x2/pkCJGN2pu/tTBgAA bJQyy44NFUi8br7SG9rY1QAA 1 2k6DnZODdEC7//zai45RMQAA 3 void registerCustomEditor piQAW2SEpUe/rCvfoN3cQAAA 2 Class<?> requiredType GezSC47ndUOhtqnFK4z8bQAA PropertyEditor propertyEditor GezSC47ndUOhtqnFK4z8bQAA void registerCustomEditor piQAW2SEpUe/rCvfoN3cQAAA 3 Class<?> requiredType /tNjM7s7jUORx0Z8Z4s23wAA String propertyPath /tNjM7s7jUORx0Z8Z4s23wAA PropertyEditor propertyEditor /tNjM7s7jUORx0Z8Z4s23wAA PropertyEditor findCustomEditor piQAW2SEpUe/rCvfoN3cQAAA 2 Class<?> requiredType bh02mP0a+EysXtTc0veqMQAA String propertyPath bh02mP0a+EysXtTc0veqMQAA TypeConverter f0Rg6JdVd0OMg3954zePZwAA 3 WShetbG+V0ycUL0v9FUi7AAA aY944ttpX0qD1WGxoerjLQAA aMMdGgg/FECgTYtxEtJVTgAA 1 Zz0GMpvSaEuQxvqqCKvZvQAA 3 T convertIfNecessary BG8MYkfwdk2lyYL04Q1hSgAA 2 Object value svKU7cw/zECUH3cCN+U2PwAA Class<T> requiredType svKU7cw/zECUH3cCN+U2PwAA T convertIfNecessary BG8MYkfwdk2lyYL04Q1hSgAA 3 Object value kG1lMLPdUEaLoSQVSdf+RgAA Class<T> requiredType kG1lMLPdUEaLoSQVSdf+RgAA MethodParameter methodParam kG1lMLPdUEaLoSQVSdf+RgAA T convertIfNecessary BG8MYkfwdk2lyYL04Q1hSgAA 3 Object value PZt6FSgC/kKN+uGVCtiplQAA Class<T> requiredType PZt6FSgC/kKN+uGVCtiplQAA Field field PZt6FSgC/kKN+uGVCtiplQAA DataBinder f0Rg6JdVd0OMg3954zePZwAA 4 eAOprjhxhkCW41wVvMB+eQAA GqSR/b0XnU6RNV1cOY/HsgAA K4NKmVLEQU+1BmmPCljhZgAA g9PsZnK2ZkmjMsqNkeqz3wAA 2 2k6DnZODdEC7//zai45RMQAA Zz0GMpvSaEuQxvqqCKvZvQAA 1 5l972v0y/Ui0VCwW+tvW2wAA WebDataBinder f0Rg6JdVd0OMg3954zePZwAA 4 /kUDuaB74EeyUClxItcxlwAA v2qpV03TrEu1AoWAxMeeowAA g+whx8rtW0OyuHUD9EX5GwAA PhwqhkdCJkygUcfLlkQFdwAA 1 5l972v0y/Ui0VCwW+tvW2wAA 1 6ZPEreowskq8Ll4G5xoiKwAA f0Rg6JdVd0OMg3954zePZwAA pNvR01Bc6kuV6Ut9BnX1bwAA piQAW2SEpUe/rCvfoN3cQAAA 4 /2zoSbgWpkWDgccWDiheHwAA YgMXBNJJlkGYzz+yFOUwEwAA avCAiHj3d0aJHKmUO87z+wAA ODFHxfo+PU+CeP8OXghSSAAA f0Rg6JdVd0OMg3954zePZwAA pNvR01Bc6kuV6Ut9BnX1bwAA BG8MYkfwdk2lyYL04Q1hSgAA 4 MwlCdWYFi0ePKP3HTrKhlQAA Tp9JHWeMDUyZxTxQWBdFHwAA esjh4TFqakisvvFn2deZogAA CHh/cRqOgkChybpBtDl6fwAA f0Rg6JdVd0OMg3954zePZwAA w2K7xvxiIUS65fEDoLk1mgAA pNvR01Bc6kuV6Ut9BnX1bwAA 4 7U1tY2J5/0ulGCFXJIT1YQAA OaOBCTeOQkyVsvAiBl9hRgAA kOa9VXrUdUmHNfsa2j+OPAAA xK2Bqmyjpku14kGawAllXQAA WebDataBinderFactory f0Rg6JdVd0OMg3954zePZwAA 3 Tbj+QFoOYEiOy3zrbRgqcQAA WH9H5W0q4kqq+krzj+YVkgAA 5rudIgzHZ0qmUU1u93nykwAA 1 S9JMEFMFmkO9hRPIOTyLkQAA 1 WebDataBinder createBinder wKUl0IUMW0W9gNwI6CxlZAAA 3 NativeWebRequest webRequest AYBnIu51aU26lFRBaIBUtgAA Object target AYBnIu51aU26lFRBaIBUtgAA String objectName AYBnIu51aU26lFRBaIBUtgAA DefaultDataBinderFactory f0Rg6JdVd0OMg3954zePZwAA 4 FcxNSNGHoESYUN+VRFn/KgAA DeuCpSWPEU2bb3Kx0eaOQgAA kijz2GvMAEe2mXKRzwyzBwAA 4sZC5XdsxUOCClK1juidqgAA 1 S9JMEFMFmkO9hRPIOTyLkQAA 1 V/WkItcHYkSPJfLrj/d9zwAA InitBinderDataBinderFactory f0Rg6JdVd0OMg3954zePZwAA 4 meF/RUQ8a0mjB1ESPqnnUAAA l0BvVXUc/Ee6mFIrlSiGwgAA eXH8QAYJDUCrHbjPpSxUOQAA riW28AFawEy0CCyGSSkEgwAA 1 V/WkItcHYkSPJfLrj/d9zwAA 1 cqQ8qAvBDEeKhtLtVdPI0AAA ServletRequestDataBinderFactory f0Rg6JdVd0OMg3954zePZwAA 4 ffq1tTCxjkay45CSLHGA3wAA p+0tX/sdJkm93S80oDOUWgAA 9OvDeRC3RE6u5KpmPpgwTwAA Y2swPHjQe0+fanxGnemcMgAA 1 cqQ8qAvBDEeKhtLtVdPI0AAA f0Rg6JdVd0OMg3954zePZwAA 9yrYPcKy+0uGnWPtCK2PsAAA wKUl0IUMW0W9gNwI6CxlZAAA 4 Xir3C8L9gkCy1dd0PnuAxQAA K3piFQpQvUa2kdlGDEUG9wAA TFKLU0/pxU28OaQGhsm0SQAA p6H9W9mVn0WPhf8zPQ0BiwAA f0Rg6JdVd0OMg3954zePZwAA yhK7vbyjL06s/ziF6GC88gAA 9yrYPcKy+0uGnWPtCK2PsAAA 4 ZOppfJGxpUSZ60kZeq8oJwAA xz+GA41cjk2cZIqIBNzfkQAA ogU9acFPwky4Hn1MA8r73gAA zd6Y6eqOWEyEVLZJwXRHWgAA f0Rg6JdVd0OMg3954zePZwAA UyKFirHXNU2r9RKRIB0gCwAA yhK7vbyjL06s/ziF6GC88gAA 4 BIgZlgdMCkOLHle53lJ3HgAA hqvRHCyNxkSGca0vgtnDmwAA a2+r8o0ZYkydMtHAbwSN1QAA fAc10pz5xkqa6ezaInKUsAAA ServletRequestDataBinder f0Rg6JdVd0OMg3954zePZwAA 4 d7VoCDk8hkSRLCj9PxUMAQAA sb0HToHNi0euYFE/Wre4hgAA wCmdWLGPdkGa7eBPbqxyfQAA OWOxudkHeEmvxVzWM0VSTgAA 1 6ZPEreowskq8Ll4G5xoiKwAA 1 FGAaCyp+t0aXHPA3PhpYRAAA ExtendedServletRequestDataBinder f0Rg6JdVd0OMg3954zePZwAA 4 q2B/MVi5VkuAa4yHdTEIkwAA RvaR3Tvan02R52PQQ4G+0gAA I9JQBM42GU+94UnDDDlTGwAA 9O2N0C0kuUOIpZfK7/jY4QAA 1 FGAaCyp+t0aXHPA3PhpYRAAA f0Rg6JdVd0OMg3954zePZwAA FLWL5G8Fy0eOR9NvFZcwTAAA w2K7xvxiIUS65fEDoLk1mgAA 4 Uu74J7mX0EykJEYw29gZ8AAA 1EqmNZS72UqwAWcJDXdLQAAA rXgkNx3FIEG0WuD1t60gdwAA RBnWgG/asEqwYjyqDXQMbQAA f0Rg6JdVd0OMg3954zePZwAA oh1ObkvL10yOHzlD5I/pmQAA FLWL5G8Fy0eOR9NvFZcwTAAA 4 D+hWN0fL9UmCSYMnAbizbwAA x6kM1IaD1UKuEeu7UX8KaAAA cpqJUJuOCU2skrsbzSyyXwAA BdegGiyk8EG9WkTaCN/HzAAA ================================================ FILE: note/spring-task.md ================================================ **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* - [开头](#%E5%BC%80%E5%A4%B4) - [定时器](#%E5%AE%9A%E6%97%B6%E5%99%A8) - [用法](#%E7%94%A8%E6%B3%95) - [解析](#%E8%A7%A3%E6%9E%90) - [注册](#%E6%B3%A8%E5%86%8C) - [scheduler](#scheduler) - [scheduled-tasks](#scheduled-tasks) - [调度执行](#%E8%B0%83%E5%BA%A6%E6%89%A7%E8%A1%8C) - [scheduler初始化](#scheduler%E5%88%9D%E5%A7%8B%E5%8C%96) - [任务调度](#%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6) - [Trigger](#trigger) - [Cron解析](#cron%E8%A7%A3%E6%9E%90) - [调度](#%E8%B0%83%E5%BA%A6) - [总结](#%E6%80%BB%E7%BB%93) - [异步执行](#%E5%BC%82%E6%AD%A5%E6%89%A7%E8%A1%8C) - [配置](#%E9%85%8D%E7%BD%AE) - [原理](#%E5%8E%9F%E7%90%86) # 开头 从功能上来说,spring-task这个组件主要包括了两个/两种功能: - 任务的定时调度/执行,对应xml配置的task:scheduler和task:scheduled-tasks标签。 - 方法异步执行,对应xml配置的task:executor标签。 task:annotation-driven标签被以上两种功能共有。下面就这两种功能分别进行说明。 # 定时器 ## 用法 以XML作为示例,基于注解的也是一样的。 ```xml ``` 定义了一个定时任务,每隔5秒执行Task的print方法,Task: ```java public class Task { public void print() { System.out.println("print执行"); } } ``` 关于cron表达式可以参考: [深入浅出Spring task定时任务](http://blog.csdn.net/u011116672/article/details/52517247) ## 解析 ### 注册 此部分的解析器注册由TaskNamespaceHandler完成: ```java @Override public void init() { this.registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser()); this.registerBeanDefinitionParser("executor", new ExecutorBeanDefinitionParser()); this.registerBeanDefinitionParser("scheduled-tasks", new ScheduledTasksBeanDefinitionParser()); this.registerBeanDefinitionParser("scheduler", new SchedulerBeanDefinitionParser()); } ``` ### scheduler SchedulerBeanDefinitionParser源码: ```java @Override protected String getBeanClassName(Element element) { return "org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler"; } @Override protected void doParse(Element element, BeanDefinitionBuilder builder) { String poolSize = element.getAttribute("pool-size"); if (StringUtils.hasText(poolSize)) { builder.addPropertyValue("poolSize", poolSize); } } ``` 由于SchedulerBeanDefinitionParser是AbstractSingleBeanDefinitionParser的子类,所以Spring将task:scheduler标签解析为一个BeanDefinition。其beanClass为org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler。 ### scheduled-tasks 其解析的源码较长,在此不再贴出,解析之后形成的BeanDefinition结构如下图: ![scheduled-tasks结构图](images/scheduled-tasks.png) taskScheduler属性即指向task:scheduler标签,如果没有配置,此属性不存在。 Spring将每一个task:scheduled标签解析为一个Task(的子类),其类图如下: ![Task类图](images/Task.jpg) 很明显可以看出,任务的类型是由cron, fixed-delay, fixed-rate, trigger四个属性决定的,fixed-delay和fixed-rate为IntervalTask。 注意一点: **四种任务集合并不是互斥的**。比如说一个task:scheduled标签同时配置了cron和trigger属性,那么此标签会导致生成两个beanClass分别为CronTask何TriggerTask的BeanDefinition产生,并分别被放到cronTasksList和triggerTasksList中。 从图中可以看出,task:scheduled的method和ref属性也被包装成了一个BeanDefinition, 其beanClass为org.springframework.scheduling.support.ScheduledMethodRunnable. ## 调度执行 入口便是ContextLifecycleScheduledTaskRegistrar,类图: ![ContextLifecycleScheduledTaskRegistrar类图](images/ContextLifecycleScheduledTaskRegistrar.jpg) ContextLifecycleScheduledTaskRegistrar只实现了afterSingletonsInstantiated方法: ```java @Override public void afterSingletonsInstantiated() { scheduleTasks(); } ``` ScheduledTaskRegistrar.scheduleTasks: ```java protected void scheduleTasks() { // shcheduler初始化 if (this.taskScheduler == null) { this.localExecutor = Executors.newSingleThreadScheduledExecutor(); this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor); } if (this.triggerTasks != null) { for (TriggerTask task : this.triggerTasks) { addScheduledTask(scheduleTriggerTask(task)); } } if (this.cronTasks != null) { for (CronTask task : this.cronTasks) { addScheduledTask(scheduleCronTask(task)); } } if (this.fixedRateTasks != null) { for (IntervalTask task : this.fixedRateTasks) { addScheduledTask(scheduleFixedRateTask(task)); } } if (this.fixedDelayTasks != null) { for (IntervalTask task : this.fixedDelayTasks) { addScheduledTask(scheduleFixedDelayTask(task)); } } } ``` ### scheduler初始化 可见,如果没有配置task:scheduler,那么在这里将会进行其初始化工作。 Spring定义了TaskScheduler接口,独立于jdk之外,这样做的目的在于能够同时支持JDK和quartz。对于默认来说,Spring将真正的逻辑全部委托给jdk的Executor。 TaskScheduler类图: ![TaskScheduler类图](images/TaskScheduler.jpg) ConcurrentTaskExecutor来自另一个继承体系: TaskExecutor,这和spring-task的另一个重要功能,异步执行,这里暂且不表。 ### 任务调度 以喜闻乐见的CronTask为例。ScheduledTaskRegistrar.scheduleCronTask: ```java public ScheduledTask scheduleCronTask(CronTask task) { ScheduledTask scheduledTask = this.unresolvedTasks.remove(task); if (this.taskScheduler != null) { scheduledTask.future = this.taskScheduler.schedule(task.getRunnable(), task.getTrigger()); } return (newTask ? scheduledTask : null); } ``` #### Trigger 可见,Cron也是通过Trigger实现的,在Spring中,Trigger被定义为**决定一个任务的下一次执行时间**。其类图: ![Trigger.jpg](images/Trigger.jpg) 那么问题来了,字符串形式的cron表达式是在何时被解析为Trigger的呢? #### Cron解析 CronTask构造器: ```java public CronTask(Runnable runnable, String expression) { this(runnable, new CronTrigger(expression)); } ``` CronTrigger构造器: ```java public CronTrigger(String expression) { this.sequenceGenerator = new CronSequenceGenerator(expression); } ``` 答案便在CronSequenceGenerator构造器了: ```java public CronSequenceGenerator(String expression) { this(expression, TimeZone.getDefault()); } public CronSequenceGenerator(String expression, TimeZone timeZone) { this.expression = expression; this.timeZone = timeZone; parse(expression); } ``` 具体是如何解析的,不再深入。 ConcurrentTaskScheduler.schedule: ```java @Override public ScheduledFuture schedule(Runnable task, Trigger trigger) { ErrorHandler errorHandler = (this.errorHandler != null ? this.errorHandler : TaskUtils.getDefaultErrorHandler(true)); return new ReschedulingRunnable(task, trigger, this.scheduledExecutor, errorHandler).schedule(); } ``` #### 调度 从上面的源码可以看出,调度是通过ReschedulingRunnable来完成的,其类图: ![ReschedulingRunnable类图](images/ReschedulingRunnable.jpg) schedule方法: ```java public ScheduledFuture schedule() { synchronized (this.triggerContextMonitor) { this.scheduledExecutionTime = this.trigger.nextExecutionTime(this.triggerContext); if (this.scheduledExecutionTime == null) { return null; } long initialDelay = this.scheduledExecutionTime.getTime() - System.currentTimeMillis(); this.currentFuture = this.executor.schedule(this, initialDelay, TimeUnit.MILLISECONDS); return this; } } ``` 可以看出,这里设置了在下一次执行窗口调用this(ReschedulingRunnable),从类图可以看出,ReschedulingRunnable本身实现了Runnable接口,其run方法: ```java @Override public void run() { Date actualExecutionTime = new Date(); super.run(); Date completionTime = new Date(); synchronized (this.triggerContextMonitor) { this.triggerContext.update(this.scheduledExecutionTime, actualExecutionTime, completionTime); if (!this.currentFuture.isCancelled()) { //下次调用 schedule(); } } } ``` 对我们自定义逻辑的调用是通过super.run实现的: ```java @Override public void run() { this.delegate.run(); } ``` delegate便是前面提到过的ScheduledMethodRunnable,其run方法: ```java @Override public void run() { ReflectionUtils.makeAccessible(this.method); this.method.invoke(this.target); } ``` 当然这只是针对CronTask的实现,而对于IntervalTask就要简单多了,ScheduledTaskRegistrar.scheduleFixedDelayTask部分源码: ```java public ScheduledTask scheduleFixedDelayTask(IntervalTask task) { if (this.taskScheduler != null) { if (task.getInitialDelay() > 0) { Date startTime = new Date(System.currentTimeMillis() + task.getInitialDelay()); scheduledTask.future = this.taskScheduler.scheduleWithFixedDelay(task.getRunnable(), startTime, task.getInterval()); } else { scheduledTask.future = this.taskScheduler.scheduleWithFixedDelay(task.getRunnable(), task.getInterval()); } } return (newTask ? scheduledTask : null); } ``` ## 总结 从上面的说明可以看出,Spring其实将核心逻辑委托给了JDK的Executors.newSingleThreadScheduledExecutor()来实现,那么JDK是如何用一个线程来定时执行多个任务的呢? # 异步执行 ## 配置 必须以注解的方式进行配置,xml: ```xml ``` 这样在类或方法上加上注解即可: ```java @Async("executor") public void print() { System.out.println("print执行"); } ``` ## 原理 猜测: Spring会为带有@Async的组件生成代理子类实现对原生组件的替换,代理子类将异步执行的方法包装为Task(Runnable)提交到jdk的线程池即可。 ================================================ FILE: note/spring-transaction.md ================================================ **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* - [配置](#%E9%85%8D%E7%BD%AE) - [解析](#%E8%A7%A3%E6%9E%90) - [TransactionalEventListener](#transactionaleventlistener) - [主要组件注册](#%E4%B8%BB%E8%A6%81%E7%BB%84%E4%BB%B6%E6%B3%A8%E5%86%8C) - [代理类生成](#%E4%BB%A3%E7%90%86%E7%B1%BB%E7%94%9F%E6%88%90) - [Advisor寻找](#advisor%E5%AF%BB%E6%89%BE) - [运行](#%E8%BF%90%E8%A1%8C) - [调用链生成](#%E8%B0%83%E7%94%A8%E9%93%BE%E7%94%9F%E6%88%90) - [调用链调用](#%E8%B0%83%E7%94%A8%E9%93%BE%E8%B0%83%E7%94%A8) - [TransactionInterceptor](#transactioninterceptor) - [事务管理器](#%E4%BA%8B%E5%8A%A1%E7%AE%A1%E7%90%86%E5%99%A8) - [DataSource](#datasource) - [事务开启](#%E4%BA%8B%E5%8A%A1%E5%BC%80%E5%90%AF) - [是否已存在事务](#%E6%98%AF%E5%90%A6%E5%B7%B2%E5%AD%98%E5%9C%A8%E4%BA%8B%E5%8A%A1) - [事务已存在](#%E4%BA%8B%E5%8A%A1%E5%B7%B2%E5%AD%98%E5%9C%A8) - [PROPAGATION_NEVER](#propagation_never) - [PROPAGATION_NOT_SUPPORTED](#propagation_not_supported) - [事务挂起](#%E4%BA%8B%E5%8A%A1%E6%8C%82%E8%B5%B7) - [PROPAGATION_REQUIRES_NEW](#propagation_requires_new) - [PROPAGATION_NESTED](#propagation_nested) - [debug环境搭建](#debug%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA) - [事务对象](#%E4%BA%8B%E5%8A%A1%E5%AF%B9%E8%B1%A1) - [Savepoint](#savepoint) - [其它](#%E5%85%B6%E5%AE%83) - [事务创建](#%E4%BA%8B%E5%8A%A1%E5%88%9B%E5%BB%BA) - [事务提交 & 回滚](#%E4%BA%8B%E5%8A%A1%E6%8F%90%E4%BA%A4--%E5%9B%9E%E6%BB%9A) - [总结](#%E6%80%BB%E7%BB%93) # 配置 以最简单的jdbc事务为例: ```xml ``` # 解析 TxNamespaceHandler.init: ```java @Override public void init() { registerBeanDefinitionParser("advice", new TxAdviceBeanDefinitionParser()); registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser()); registerBeanDefinitionParser("jta-transaction-manager", new JtaTransactionManagerBeanDefinitionParser()); } ``` 明显解析的入口便在AnnotationDrivenBeanDefinitionParser.parse: ```java @Override public BeanDefinition parse(Element element, ParserContext parserContext) { registerTransactionalEventListenerFactory(parserContext); String mode = element.getAttribute("mode"); if ("aspectj".equals(mode)) { // mode="aspectj" registerTransactionAspect(element, parserContext); } else { // mode="proxy" AopAutoProxyConfigurer.configureAutoProxyCreator(element, parserContext); } return null; } ``` 下面分部分进行说明。 ## TransactionalEventListener 第一部分用于向Spring容器注册TransactionalEventListener工厂,TransactionalEventListener是Spring4.2引入的新特性,允许我们自定义监听器监听事务的提交或其它动作。 ## 主要组件注册 即configureAutoProxyCreator方法,此方法的最终作用便是在Spring容器中加入这样的bean结构: BeanFactoryTransactionAttributeSourceAdvisor->TransactionInterceptor->AnnotationTransactionAttributeSource 其中AnnotationTransactionAttributeSource用于解析@Transactional注解的相关属性。 ## 代理类生成 与aop模块类似,入口位于configureAutoProxyCreator里注册的bean: InfrastructureAdvisorAutoProxyCreator,其类图: ![InfrastructureAdvisorAutoProxyCreator类图](images/InfrastructureAdvisorAutoProxyCreator.jpg) 此类的特殊之处从其名字上可以体现: **只考虑Spring内部使用的基础设施Advisor**。 为类创建代理的入口位于AbstractAutoProxyCreator.postProcessAfterInitialization: ```java @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean != null) { Object cacheKey = getCacheKey(bean.getClass(), beanName); if (!this.earlyProxyReferences.contains(cacheKey)) { return wrapIfNecessary(bean, beanName, cacheKey); } } return bean; } ``` wrapIfNecessary核心逻辑: ```java protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) { // Create proxy if we have advice. Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null); if (specificInterceptors != DO_NOT_PROXY) { this.advisedBeans.put(cacheKey, Boolean.TRUE); Object proxy = createProxy( bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean)); this.proxyTypes.put(cacheKey, proxy.getClass()); return proxy; } } ``` ### Advisor寻找 getAdvicesAndAdvisorsForBean用于去容器中寻找适合当前bean的Advisor,其最终调用AbstractAdvisorAutoProxyCreator.findEligibleAdvisors: ```java protected List findEligibleAdvisors(Class beanClass, String beanName) { List candidateAdvisors = findCandidateAdvisors(); List eligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName); extendAdvisors(eligibleAdvisors); if (!eligibleAdvisors.isEmpty()) { //按照@Ordered排序 eligibleAdvisors = sortAdvisors(eligibleAdvisors); } return eligibleAdvisors; } ``` 这个方法在spring-aop中已经详细说明过了,这里再强调一下具体的查找逻辑: - 首先去容器找出所有实现了Advisor接口的bean,对应findCandidateAdvisors方法. - 逐一判断Advisor是否适用于当前bean,对应findAdvisorsThatCanApply方法,判断逻辑为: - 如果Advisor是IntroductionAdvisor,那么判断其ClassFilter是否可以匹配bean的类. - 如果Advisor是PointcutAdvisor,那么首先进行ClassFilter匹配,如果匹配失败,那么再获得Advisor的MethodMatcher对象,如果MethodMatcher可以匹配任意方法,那么返回true,否则反射获取给定bean的所有方法逐一进行匹配,只要有一个匹配成功,即返回true. - 其它情况,直接返回true. 对于spring事务来说,我们有唯一的Advisor: BeanFactoryTransactionAttributeSourceAdvisor,其类图: ![BeanFactoryTransactionAttributeSourceAdvisor类图](images/BeanFactoryTransactionAttributeSourceAdvisor.jpg) 可以看出,BeanFactoryTransactionAttributeSourceAdvisor其实是一个PointcutAdvisor,所以**是否可以匹配取决于其Pointcut**。此Advisor的pointcut是一个TransactionAttributeSourcePointcut对象,类图: ![TransactionAttributeSourcePointcut类图](images/TransactionAttributeSourcePointcut.jpg) **Pointcut的核心在于其ClassFilter和MethodMatcher**。 ClassFilter: 位于StaticMethodMatcherPointcut: ```java private ClassFilter classFilter = ClassFilter.TRUE; ``` 即: 类检查全部通过。 MethodMatcher: TransactionAttributeSourcePointcut.matches: ```java @Override public boolean matches(Method method, Class targetClass) { //如果已经是事务代理,那么不应该再次代理 if (TransactionalProxy.class.isAssignableFrom(targetClass)) { return false; } TransactionAttributeSource tas = getTransactionAttributeSource(); return (tas == null || tas.getTransactionAttribute(method, targetClass) != null); } ``` getTransactionAttribute方法使用了缓存的思想,但其核心逻辑位于AbstractFallbackTransactionAttributeSource.computeTransactionAttribute: ```java protected TransactionAttribute computeTransactionAttribute(Method method, Class targetClass) { // Don't allow no-public methods as required. if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) { return null; } // Ignore CGLIB subclasses - introspect the actual user class. Class userClass = ClassUtils.getUserClass(targetClass); // The method may be on an interface, but we need attributes from the target class. // If the target class is null, the method will be unchanged. Method specificMethod = ClassUtils.getMostSpecificMethod(method, userClass); // If we are dealing with method with generic parameters, find the original method. specificMethod = BridgeMethodResolver.findBridgedMethod(specificMethod); // First try is the method in the target class. TransactionAttribute txAtt = findTransactionAttribute(specificMethod); if (txAtt != null) { return txAtt; } // Second try is the transaction attribute on the target class. txAtt = findTransactionAttribute(specificMethod.getDeclaringClass()); if (txAtt != null && ClassUtils.isUserLevelMethod(method)) { return txAtt; } if (specificMethod != method) { // Fallback is to look at the original method. txAtt = findTransactionAttribute(method); if (txAtt != null) { return txAtt; } // Last fallback is the class of the original method. txAtt = findTransactionAttribute(method.getDeclaringClass()); if (txAtt != null && ClassUtils.isUserLevelMethod(method)) { return txAtt; } } return null; } ``` 很明显可以看出,**首先去方法上查找是否有相应的事务注解(比如@Transactional),如果没有,那么再去类上查找**。 # 运行 以JDK动态代理为例,JdkDynamicAopProxy.invoke简略版源码: ```java @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { List chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass); if (chain.isEmpty()) {. //没有可用的拦截器,直接调用原方法 Object[] argsToUse = AopProxyUtils.adaptArgumentsIfNecessary(method, args); retVal = AopUtils.invokeJoinpointUsingReflection(target, method, argsToUse); } else { // We need to create a method invocation... invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain); // Proceed to the joinpoint through the interceptor chain. Object retVal = invocation.proceed(); } } ``` ## 调用链生成 即getInterceptorsAndDynamicInterceptionAdvice方法,其原理是: **遍历所有使用的 Advisor,获得其Advice,将Advice转为MethodInterceptor**。那么是如何转的呢? 根据Spring的定义,Advice可以是一个MethodInterceptor,也可以是类似于Aspectj的before, after通知。转换由DefaultAdvisorAdapterRegistry.getInterceptors完成: ```java @Override public MethodInterceptor[] getInterceptors(Advisor advisor) throws UnknownAdviceTypeException { List interceptors = new ArrayList(3); Advice advice = advisor.getAdvice(); if (advice instanceof MethodInterceptor) { interceptors.add((MethodInterceptor) advice); } for (AdvisorAdapter adapter : this.adapters) { if (adapter.supportsAdvice(advice)) { interceptors.add(adapter.getInterceptor(advisor)); } } if (interceptors.isEmpty()) { throw new UnknownAdviceTypeException(advisor.getAdvice()); } return interceptors.toArray(new MethodInterceptor[interceptors.size()]); } ``` AdvisorAdapter接口用以支持用户自定义的Advice类型,并将自定义的类型转为拦截器。默认adapters含有MethodBeforeAdviceAdapter、AfterReturningAdviceAdapter和ThrowsAdviceAdapter三种类型,用以分别支持MethodBeforeAdvice、AfterReturningAdvice和ThrowsAdvice。 **对于我们的BeanFactoryTransactionAttributeSourceAdvisor来说,有且只有一个拦截器: TransactionInterceptor**. ## 调用链调用 ReflectiveMethodInvocation.proceed: ```java @Override public Object proceed() throws Throwable { if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) { //拦截器执行完毕,调用原本的方法 return invokeJoinpoint(); } Object interceptorOrInterceptionAdvice = this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex); if (interceptorOrInterceptionAdvice instanceof InterceptorAndDynamicMethodMatcher) { InterceptorAndDynamicMethodMatcher dm = (InterceptorAndDynamicMethodMatcher) interceptorOrInterceptionAdvice; if (dm.methodMatcher.matches(this.method, this.targetClass, this.arguments)) { return dm.interceptor.invoke(this); } else { // Dynamic matching failed. return proceed(); } } else { //调用拦截器的invoke方法 return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this); } } ``` 可以看出,这其实是一个**逐个调用拦截器的invoke方法,最终调用原本方法(被代理方法)的过程**。所以,事务添加的核心逻辑(入口)在TransactionInterceptor的invoke方法。 ## TransactionInterceptor invoke方法: ```java @Override public Object invoke(final MethodInvocation invocation) throws Throwable { Class targetClass = (invocation.getThis() != null ? AopUtils.getTargetClass(invocation.getThis()) : null); // Adapt to TransactionAspectSupport's invokeWithinTransaction... return invokeWithinTransaction(invocation.getMethod(), targetClass, new InvocationCallback() { @Override public Object proceedWithInvocation() throws Throwable { //事务执行完毕后调用链继续向下执行 return invocation.proceed(); } }); } ``` invokeWithinTransaction简略版源码(仅保留PlatformTransactionManager部分): ```java protected Object invokeWithinTransaction(Method method, Class targetClass, final InvocationCallback invocation){ // If the transaction attribute is null, the method is non-transactional. final TransactionAttribute txAttr = getTransactionAttributeSource() .getTransactionAttribute(method, targetClass); final PlatformTransactionManager tm = determineTransactionManager(txAttr); //得到方法名 final String joinpointIdentification = methodIdentification(method, targetClass); if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) { // Standard transaction demarcation with getTransaction and commit/rollback calls. TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification); Object retVal = null; try { // This is an around advice: Invoke the next interceptor in the chain. // This will normally result in a target object being invoked. retVal = invocation.proceedWithInvocation(); } catch (Throwable ex) { // target invocation exception completeTransactionAfterThrowing(txInfo, ex); throw ex; } finally { cleanupTransactionInfo(txInfo); } commitTransactionAfterReturning(txInfo); return retVal; } } ``` ### 事务管理器 determineTransactionManager方法用以确定使用的事务管理器: ```java protected PlatformTransactionManager determineTransactionManager(TransactionAttribute txAttr) { //如果没有事务属性,那么仅从缓存中查找,找不到返回null if (txAttr == null || this.beanFactory == null) { return getTransactionManager(); } String qualifier = txAttr.getQualifier(); //如果@Transactional注解配置了transactionManager或value属性(用以决定使用哪个事务管理器): //首先查找缓存,找不到再去容器中按名称寻找 if (StringUtils.hasText(qualifier)) { return determineQualifiedTransactionManager(qualifier); } else if (StringUtils.hasText(this.transactionManagerBeanName)) { return determineQualifiedTransactionManager(this.transactionManagerBeanName); } else { //去容器中按类型(Class)查找 PlatformTransactionManager defaultTransactionManager = getTransactionManager(); if (defaultTransactionManager == null) { defaultTransactionManager = this.beanFactory.getBean(PlatformTransactionManager.class); this.transactionManagerCache.putIfAbsent( DEFAULT_TRANSACTION_MANAGER_KEY, defaultTransactionManager); } return defaultTransactionManager; } } ``` 对于我们使用的DataSourceTransactionManager,类图: ![DataSourceTransactionManager](images/DataSourceTransactionManager.jpg) afterPropertiesSet方法只是对dataSource进行了检查。 ### DataSource DriverManagerDataSource类图: ![DriverManagerDataSource类图](images/DriverManagerDataSource.jpg) 其中CommonDataSource、Wrapper、DataSource均位于javax.sql包下。 ### 事务开启 invocation.proceedWithInvocation()便是我们的逻辑,而createTransactionIfNecessary便是在逻辑执行前开启事务。 TransactionAspectSupport.createTransactionIfNecessary: ```java protected TransactionInfo createTransactionIfNecessary( PlatformTransactionManager tm, TransactionAttribute txAttr, final String joinpointIdentification) { // If no name specified, apply method identification as transaction name. if (txAttr != null && txAttr.getName() == null) { txAttr = new DelegatingTransactionAttribute(txAttr) { @Override public String getName() { return joinpointIdentification; } }; } TransactionStatus status = null; if (txAttr != null) { if (tm != null) { status = tm.getTransaction(txAttr); } } return prepareTransactionInfo(tm, txAttr, joinpointIdentification, status); } ``` 此部分的核心逻辑在getTransaction和prepareTransactionInfo方法,源码较长,下面依然按部分整理。 #### 是否已存在事务 目的在于支撑事务的传播性。 源码位于DataSourceTransactionManager.doGetTransaction,核心逻辑在TransactionSynchronizationManager.doGetResource: ```java private static Object doGetResource(Object actualKey) { Map map = resources.get(); if (map == null) { return null; } Object value = map.get(actualKey); // Transparently remove ResourceHolder that was marked as void... if (value instanceof ResourceHolder && ((ResourceHolder) value).isVoid()) { map.remove(actualKey); // Remove entire ThreadLocal if empty... if (map.isEmpty()) { resources.remove(); } value = null; } return value; } ``` actualKey实际上是DataSource对象,resources是一个ThreadLocal对象,其声明源码: ```java private static final ThreadLocal> resources = new NamedThreadLocal>("Transactional resources"); ``` 从这里可以得出结论: **是否存在事务指的是在当前线程、当前数据源(DataSource)中是否存在处于活动状态的事务**。 #### 事务已存在 如果检测到已存在事务,那么就要考虑事务的传播特性(行为).此部分源码位于AbstractPlatformTransactionManager.handleExistingTransaction,下面按照不同的传播特性展开。 ##### PROPAGATION_NEVER 即当前方法需要在非事务的环境下执行,如果有事务存在,那么抛出异常。相关源码: ```java if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NEVER) { throw new IllegalTransactionStateException( "Existing transaction found for transaction marked with propagation 'never'"); } ``` ##### PROPAGATION_NOT_SUPPORTED 与前者的区别在于,如果有事务存在,那么将事务挂起,而不是抛出异常。 ```java if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NOT_SUPPORTED) { Object suspendedResources = suspend(transaction); boolean newSynchronization = (getTransactionSynchronization() == SYNCHRONIZATION_ALWAYS); return prepareTransactionStatus( definition, null, false, newSynchronization, debugEnabled, suspendedResources); } ``` ###### 事务挂起 此部分的核心在于suspend方法,最终调用TransactionSynchronizationManager.doUnbindResource: ```java private static Object doUnbindResource(Object actualKey) { Map map = resources.get(); if (map == null) { return null; } Object value = map.remove(actualKey); // Remove entire ThreadLocal if empty... if (map.isEmpty()) { resources.remove(); } // Transparently suppress a ResourceHolder that was marked as void... if (value instanceof ResourceHolder && ((ResourceHolder) value).isVoid()) { value = null; } return value; } ``` 可以看出,**所谓的事务挂起其实就是一个移除当前线程、数据源活动事务对象的过程**。 同时注意getTransaction方法返回的是一个TransactionStatus对象,**被挂起的事务的各种状态都被保存在此对象中**。 那么挂起这个操作到底是如何实现(起作用)的呢? DataSourceTransactionManager.doSuspend: ```java @Override protected Object doSuspend(Object transaction) { DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction; txObject.setConnectionHolder(null); ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.unbindResource(this.dataSource); return conHolder; } ``` 其实玄机就在于将ConnectionHolder设为null这一行,因为**一个ConnectionHolder对象就代表了一个数据库连接,将ConnectionHolder设为null就意味着我们下次要使用连接时,将重新从连接池获取,而新的连接的自动提交是为true的**。 ##### PROPAGATION_REQUIRES_NEW ```java if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW) { SuspendedResourcesHolder suspendedResources = suspend(transaction); boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER); DefaultTransactionStatus status = newTransactionStatus( definition, transaction, true, newSynchronization, debugEnabled, suspendedResources); doBegin(transaction, definition); prepareSynchronization(status, definition); return status; } ``` 可以看出,这其实是一个**挂起当前活动事务并创建新事务的过程**,doBegin方法是事务开启的核心,将在后面进行说明。 ##### PROPAGATION_NESTED 其意义: > PROPAGATION_NESTED 开始一个 "嵌套的" 事务,  它是已经存在事务的一个真正的子事务. 嵌套事务开始执行时,  它将取得一个 savepoint. 如果这个嵌套事务失败, 我们将回滚到此 savepoint. 嵌套事务是外部事务的一部分, 只有外部事务结束后它才会被提交.  摘自: [解惑 spring 嵌套事务](http://www.iteye.com/topic/35907) 核心源码(忽略JTA部分): ```java if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) { if (useSavepointForNestedTransaction()) { // Create savepoint within existing Spring-managed transaction, // through the SavepointManager API implemented by TransactionStatus. // Usually uses JDBC 3.0 savepoints. Never activates Spring synchronization. DefaultTransactionStatus status = prepareTransactionStatus(definition, transaction, false, false, debugEnabled, null); status.createAndHoldSavepoint(); return status; } } ``` 关键在于如何创建SavePoint, AbstractTransactionStatus.createAndHoldSavepoint: ```java public void createAndHoldSavepoint() throws TransactionException { setSavepoint(getSavepointManager().createSavepoint()); } ``` DefaultTransactionStatus.getSavepointManager: ```java @Override protected SavepointManager getSavepointManager() { if (!isTransactionSavepointManager()) { throw new NestedTransactionNotSupportedException( "Transaction object [" + getTransaction() + "] does not support savepoints"); } return (SavepointManager) getTransaction(); } ``` 可以看出,SavepointManager实际上从Transaction强转而来,Transaction在Spring都是用Object引用的,那么这到底是个什么东西? ###### debug环境搭建 - 安装Mysql数据库(或其它支持jdbc)并正确配置数据库连接. - 定义两个bean,代表我们的业务逻辑: - TransactionBean: ```java @Component public class TransactionBean { private NestedBean nestedBean; public NestedBean getNestedBean() { return nestedBean; } public void setNestedBean(NestedBean nestedBean) { this.nestedBean = nestedBean; } @Transactional(propagation = Propagation.REQUIRED) public void process() { System.out.println("事务执行"); nestedBean.nest(); } } ``` - NestedBean: ```java @Component public class NestedBean { @Transactional(propagation = Propagation.NESTED) public void nest() { System.out.println("嵌套事务"); } } ``` - 配置文件: ```xml ``` - 入口: ```java public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("config.xml"); TransactionBean bean = context.getBean(TransactionBean.class); bean.process(); } ``` 这样将断点打在合适的位置便可以得到事务对象究竟是什么。 注意: **nest方法必须在一个单独的业务bean中**,否则对nest的调用并不会导致事务获取的触发。这是由JDK动态代理的实现机制决定的,**调用当前类的方法并不会触发代理逻辑(InvocationHandler)**。 这一点可以运行demo:test.proxy.JDKProxy看出。 运行debug可以发现,**对于DataSourceTransactionManager,事务对象其实是其内部类DataSourceTransactionObject**. ###### 事务对象 DataSourceTransactionObject的类图如下: ![DataSourceTransactionObject类图](images/DataSourceTransactionObject.jpg) ###### Savepoint 位于java.sql包下,对于Mysql来说,由Mysql驱动提供实现,类图: ![Savepoint类图](images/Savepoint.jpg) 下面来看一下Savepoint到底是如何被创建的。 JdbcTransactionObjectSupport.createSavepoint简略版源码: ```java @Override public Object createSavepoint() throws TransactionException { ConnectionHolder conHolder = getConnectionHolderForSavepoint(); return conHolder.createSavepoint(); } ``` ConnectionHolder.createSavepoint: ```java public Savepoint createSavepoint() throws SQLException { this.savepointCounter++; return getConnection().setSavepoint(SAVEPOINT_NAME_PREFIX + this.savepointCounter); } ``` 我们可以得出这样的结论: **Savepoint由java SQL标准定义,具体实现由数据库完成**。从mysql的客户端可以直接执行命令`savepoint xx`可以看出这一点。 ##### 其它 略。 #### 事务创建 如果之前不存在事务,那么就需要创建了,核心逻辑位于DataSourceTransactionManager.doBegin: ```java @Override protected void doBegin(Object transaction, TransactionDefinition definition) { //此时,txObject不为null,只是其核心的ConnectHolder属性为null DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction; Connection con = null; if (txObject.getConnectionHolder() == null || txObject.getConnectionHolder().isSynchronizedWithTransaction()) { Connection newCon = this.dataSource.getConnection(); //获得连接,可以看出ConnectionHolder是对Connection的包装 txObject.setConnectionHolder(new ConnectionHolder(newCon), true); } txObject.getConnectionHolder().setSynchronizedWithTransaction(true); con = txObject.getConnectionHolder().getConnection(); //设置是否只读和隔离级别 Integer previousIsolationLevel = DataSourceUtils.prepareConnectionForTransaction(con, definition); txObject.setPreviousIsolationLevel(previousIsolationLevel); // Switch to manual commit if necessary. This is very expensive in some JDBC drivers, // so we don't want to do it unnecessarily (for example if we've explicitly // configured the connection pool to set it already). if (con.getAutoCommit()) { txObject.setMustRestoreAutoCommit(true); con.setAutoCommit(false); } txObject.getConnectionHolder().setTransactionActive(true); int timeout = determineTimeout(definition); if (timeout != TransactionDefinition.TIMEOUT_DEFAULT) { txObject.getConnectionHolder().setTimeoutInSeconds(timeout); } // Bind the session holder to the thread. if (txObject.isNewConnectionHolder()) { TransactionSynchronizationManager.bindResource(getDataSource(), txObject.getConnectionHolder()); } } ``` 到这里便可以得出结论: **Spring事务的开启实际上是将数据库的自动提交设为false**。 ### 事务提交 & 回滚 其实就是对jdbc相应方法的封装,不再展开。 # 总结 事务的本质其实是对数据库自动提交的关闭与开启,传播特性是Spring提出、实现、控制的概念,而隔离级别是对数据库实现的封装。 ================================================ FILE: note/spring-transaction.uml ================================================ classes 1 spring Ww45fQxf70CQ/7E60dn/8wAA 7 InfrastructureAdvisorAutoProxyCreator 4/g0XRRCnE+BRDBMKbUeowAA CuxR5MrwPkiWQ7s+Wx9+tgAA 17 clMaroon $00B9FFFF 328 480 237 69 OURIOVH6Gk+k8yBfH+iytwAA 1 InfrastructureAdvisorAutoProxyCreator False False OURIOVH6Gk+k8yBfH+iytwAA OURIOVH6Gk+k8yBfH+iytwAA False OURIOVH6Gk+k8yBfH+iytwAA clMaroon $00B9FFFF 344 376 205 56 HNnPiiVsiEeZpojsAB0nVQAA 3 AbstractAdvisorAutoProxyCreator False False HNnPiiVsiEeZpojsAB0nVQAA HNnPiiVsiEeZpojsAB0nVQAA False HNnPiiVsiEeZpojsAB0nVQAA clMaroon $00B9FFFF 365 292 162 43 Rgyjn2I3+EGHKP59r7NEkgAA 3 AbstractAutoProxyCreator False False Rgyjn2I3+EGHKP59r7NEkgAA Rgyjn2I3+EGHKP59r7NEkgAA False Rgyjn2I3+EGHKP59r7NEkgAA clMaroon $00B9FFFF 374 208 144 43 YR5K8G3Ae0uHO8hGYkRcugAA 1 ProxyProcessorSupport False False YR5K8G3Ae0uHO8hGYkRcugAA YR5K8G3Ae0uHO8hGYkRcugAA False YR5K8G3Ae0uHO8hGYkRcugAA clMaroon $00B9FFFF 72 208 264 45 sdkNone fVlMZ3kxA0G8C7jTVwoj6AAA 1 SmartInstantiationAwareBeanPostProcessor <<interface>> False False fVlMZ3kxA0G8C7jTVwoj6AAA False fVlMZ3kxA0G8C7jTVwoj6AAA clMaroon $00B9FFFF 556 208 117 45 sdkNone oxuJ4yReAEqBDxleppN8GwAA 1 BeanFactoryAware <<interface>> False False oxuJ4yReAEqBDxleppN8GwAA False oxuJ4yReAEqBDxleppN8GwAA clMaroon $00B9FFFF 401 124 90 43 UzF4SipjU0uItwHXa+S9cwAA 1 ProxyConfig False False UzF4SipjU0uItwHXa+S9cwAA UzF4SipjU0uItwHXa+S9cwAA False UzF4SipjU0uItwHXa+S9cwAA clMaroon $00B9FFFF 276 40 142 45 sdkNone UhlaPnzDKEiDl5ZkqQdoHQAA 1 BeanClassLoaderAware <<interface>> False False UhlaPnzDKEiDl5ZkqQdoHQAA False UhlaPnzDKEiDl5ZkqQdoHQAA clMaroon $00B9FFFF 484 40 141 45 sdkNone 7QeZsLF0BUSWvYbK+TyVyQAA 1 AopInfrastructureBean <<interface>> False False 7QeZsLF0BUSWvYbK+TyVyQAA False 7QeZsLF0BUSWvYbK+TyVyQAA clMaroon $00B9FFFF 420,124;372,84 hbJ+xeFPbkqoadU0mLsnfAAA DHA+poGHTkmzW3Ittxu7SQAA ibjd3jUSqkWSBp5mLzHfMQAA False 1.5707963267949 15 hbJ+xeFPbkqoadU0mLsnfAAA False 1.5707963267949 30 hbJ+xeFPbkqoadU0mLsnfAAA False -1.5707963267949 15 hbJ+xeFPbkqoadU0mLsnfAAA clMaroon $00B9FFFF 473,124;525,84 1FrI7VI3SkiAQPIcyedceAAA zkonJ5fd2UuLk0bmajpqbgAA ibjd3jUSqkWSBp5mLzHfMQAA False 1.5707963267949 15 1FrI7VI3SkiAQPIcyedceAAA False 1.5707963267949 30 1FrI7VI3SkiAQPIcyedceAAA False -1.5707963267949 15 1FrI7VI3SkiAQPIcyedceAAA clMaroon $00B9FFFF 445,208;445,166 zFCYjORwdkyMWspw4lS7iQAA ibjd3jUSqkWSBp5mLzHfMQAA /2ozN7aF1E2luBEqZyzeAQAA False 1.5707963267949 15 zFCYjORwdkyMWspw4lS7iQAA False 1.5707963267949 30 zFCYjORwdkyMWspw4lS7iQAA False -1.5707963267949 15 zFCYjORwdkyMWspw4lS7iQAA clMaroon $00B9FFFF 445,292;445,250 Ijo47wkrTUers1RCMLE19gAA /2ozN7aF1E2luBEqZyzeAQAA OegjZvpL6UKZ3T+rI0hS6gAA False 1.5707963267949 15 Ijo47wkrTUers1RCMLE19gAA False 1.5707963267949 30 Ijo47wkrTUers1RCMLE19gAA False -1.5707963267949 15 Ijo47wkrTUers1RCMLE19gAA clMaroon $00B9FFFF 446,376;445,334 qotP7v+knUWgQwU+N/0UkQAA OegjZvpL6UKZ3T+rI0hS6gAA ztXO2yPmMUKQlJJttax8lQAA False 1.5707963267949 15 qotP7v+knUWgQwU+N/0UkQAA False 1.5707963267949 30 qotP7v+knUWgQwU+N/0UkQAA False -1.5707963267949 15 qotP7v+knUWgQwU+N/0UkQAA clMaroon $00B9FFFF 446,480;446,431 R1qmbep8s0O6/OmF4nIvrQAA ztXO2yPmMUKQlJJttax8lQAA YkSLBGWTBUqkSlktHKGA8AAA False 1.5707963267949 15 R1qmbep8s0O6/OmF4nIvrQAA False 1.5707963267949 30 R1qmbep8s0O6/OmF4nIvrQAA False -1.5707963267949 15 R1qmbep8s0O6/OmF4nIvrQAA clMaroon $00B9FFFF 384,292;267,252 lwb5010XBUqckTdZEV9/fQAA tdYRsmfxR0WIv/U5NtTEaQAA OegjZvpL6UKZ3T+rI0hS6gAA False 1.5707963267949 15 lwb5010XBUqckTdZEV9/fQAA False 1.5707963267949 30 lwb5010XBUqckTdZEV9/fQAA False -1.5707963267949 15 lwb5010XBUqckTdZEV9/fQAA clMaroon $00B9FFFF 488,292;569,252 g2lt6Ei3mk2wvVwRZ2gPeAAA VUJt3HHdREu6MIwEi5rfdAAA OegjZvpL6UKZ3T+rI0hS6gAA False 1.5707963267949 15 g2lt6Ei3mk2wvVwRZ2gPeAAA False 1.5707963267949 30 g2lt6Ei3mk2wvVwRZ2gPeAAA False -1.5707963267949 15 g2lt6Ei3mk2wvVwRZ2gPeAAA BeanFactoryTransactionAttributeSourceAdvisor 4/g0XRRCnE+BRDBMKbUeowAA J1ONBZ88Uk+NXw6ejTJ0EQAA 11 clMaroon $00B9FFFF 252 413 282 56 /iWNr6Q6pUOpa1OyJG4G4QAA 1 BeanFactoryTransactionAttributeSourceAdvisor False False /iWNr6Q6pUOpa1OyJG4G4QAA /iWNr6Q6pUOpa1OyJG4G4QAA False /iWNr6Q6pUOpa1OyJG4G4QAA clMaroon $00B9FFFF 283 324 220 56 pmAPRNqON0yXaVV/QX4zbwAA 3 AbstractBeanFactoryPointcutAdvisor False False pmAPRNqON0yXaVV/QX4zbwAA pmAPRNqON0yXaVV/QX4zbwAA False pmAPRNqON0yXaVV/QX4zbwAA clMaroon $00B9FFFF 152 248 117 45 sdkNone oxuJ4yReAEqBDxleppN8GwAA 1 BeanFactoryAware <<interface>> False False oxuJ4yReAEqBDxleppN8GwAA False oxuJ4yReAEqBDxleppN8GwAA clMaroon $00B9FFFF 319 248 149 43 rXx8AJEZP06IL4oXPQKcbgAA 3 AbstractPointcutAdvisor False False rXx8AJEZP06IL4oXPQKcbgAA rXx8AJEZP06IL4oXPQKcbgAA False rXx8AJEZP06IL4oXPQKcbgAA clMaroon $00B9FFFF 343 170 100 45 sdkNone n3Jk+j9o+Eu8gFNDrvPTJgAA 1 PointcutAdvisor <<interface>> False False n3Jk+j9o+Eu8gFNDrvPTJgAA False n3Jk+j9o+Eu8gFNDrvPTJgAA clMaroon $00B9FFFF 343 92 101 45 sdkNone Psdp+/L0S0StPiBYyjsorQAA 1 Advisor <<interface>> False False Psdp+/L0S0StPiBYyjsorQAA False Psdp+/L0S0StPiBYyjsorQAA clMaroon $00B9FFFF 392,170;393,136 i09hwfBQ6EadDKuW7BVcmAAA +gGoMzEWV0Cz7p1OrtrSCAAA noAWtl3mY0GTMNzBBIcpZQAA False 1.5707963267949 15 i09hwfBQ6EadDKuW7BVcmAAA False 1.5707963267949 30 i09hwfBQ6EadDKuW7BVcmAAA False -1.5707963267949 15 i09hwfBQ6EadDKuW7BVcmAAA clMaroon $00B9FFFF 392,324;393,290 fnWwC02sG0aUxkE90dYtygAA s5hcnoVCV0W7kLsFfRBBXAAA 8QLBDofBkkis8DbQ41ZqdwAA False 1.5707963267949 15 fnWwC02sG0aUxkE90dYtygAA False 1.5707963267949 30 fnWwC02sG0aUxkE90dYtygAA False -1.5707963267949 15 fnWwC02sG0aUxkE90dYtygAA clMaroon $00B9FFFF 392,413;392,379 n4/3Xp0TOkWZ2iEbFapIHAAA 8QLBDofBkkis8DbQ41ZqdwAA 1/G/7jIr6USeRjf5MRIzigAA False 1.5707963267949 15 n4/3Xp0TOkWZ2iEbFapIHAAA False 1.5707963267949 30 n4/3Xp0TOkWZ2iEbFapIHAAA False -1.5707963267949 15 n4/3Xp0TOkWZ2iEbFapIHAAA clMaroon $00B9FFFF 331,324;259,292 66DbQhsQ5keRkqZa+cU4ywAA Y0epmTHpz0C8k6pAxxpFBAAA 8QLBDofBkkis8DbQ41ZqdwAA False 1.5707963267949 15 66DbQhsQ5keRkqZa+cU4ywAA False 1.5707963267949 30 66DbQhsQ5keRkqZa+cU4ywAA False -1.5707963267949 15 66DbQhsQ5keRkqZa+cU4ywAA clMaroon $00B9FFFF 393,248;392,214 ZuClLVC9nECYCc+6/xxZ7AAA noAWtl3mY0GTMNzBBIcpZQAA s5hcnoVCV0W7kLsFfRBBXAAA False 1.5707963267949 15 ZuClLVC9nECYCc+6/xxZ7AAA False 1.5707963267949 30 ZuClLVC9nECYCc+6/xxZ7AAA False -1.5707963267949 15 ZuClLVC9nECYCc+6/xxZ7AAA TransactionAttributeSourcePointcut 4/g0XRRCnE+BRDBMKbUeowAA 0faPIDqan0GCD97Z712XjQAA 9 clMaroon $00B9FFFF 268 356 293 56 2+CAT6p2AUC0zNeJjV9PEwAA 1 TransactionAttributeSourcePointcut False False 2+CAT6p2AUC0zNeJjV9PEwAA 2+CAT6p2AUC0zNeJjV9PEwAA False 2+CAT6p2AUC0zNeJjV9PEwAA clMaroon $00B9FFFF 324 252 180 56 YsAznIstjES2qgaX9sNEJAAA 3 StaticMethodMatcherPointcut False False YsAznIstjES2qgaX9sNEJAAA YsAznIstjES2qgaX9sNEJAAA False YsAznIstjES2qgaX9sNEJAAA clMaroon $00B9FFFF 72 160 195 72 sdkNone pTee9bG9DkC+dvqgCgpS9QAA 1 Pointcut <<interface>> False False pTee9bG9DkC+dvqgCgpS9QAA pTee9bG9DkC+dvqgCgpS9QAA clMaroon $00B9FFFF 348 161 133 43 Bj7jdsRA7E6cCs2yKxccuwAA 3 StaticMethodMatcher False False Bj7jdsRA7E6cCs2yKxccuwAA Bj7jdsRA7E6cCs2yKxccuwAA False Bj7jdsRA7E6cCs2yKxccuwAA clMaroon $00B9FFFF 364 64 100 45 sdkNone OA8eX1NjOUmQO9sLTriuXwAA 1 MethodMatcher <<interface>> False False OA8eX1NjOUmQO9sLTriuXwAA False OA8eX1NjOUmQO9sLTriuXwAA clMaroon $00B9FFFF 414,161;413,108 +HOP2QhwiEGPN6ag5HHAxgAA Rov8V1/J+UG4AbHeaqyccAAA wsTu7PiteUu6Js+OQKMw1wAA False 1.5707963267949 15 +HOP2QhwiEGPN6ag5HHAxgAA False 1.5707963267949 30 +HOP2QhwiEGPN6ag5HHAxgAA False -1.5707963267949 15 +HOP2QhwiEGPN6ag5HHAxgAA clMaroon $00B9FFFF 335,252;266,228 tvDwwVwKm0mkr9zblC0WsgAA h84zru5BWkunQ5V6EbJHYQAA OuXElcwiGEKtNCuw4GAV/QAA False 1.5707963267949 15 tvDwwVwKm0mkr9zblC0WsgAA False 1.5707963267949 30 tvDwwVwKm0mkr9zblC0WsgAA False -1.5707963267949 15 tvDwwVwKm0mkr9zblC0WsgAA clMaroon $00B9FFFF 413,252;414,203 COzw0w2sJkCv9O5js72PKAAA wsTu7PiteUu6Js+OQKMw1wAA OuXElcwiGEKtNCuw4GAV/QAA False 1.5707963267949 15 COzw0w2sJkCv9O5js72PKAAA False 1.5707963267949 30 COzw0w2sJkCv9O5js72PKAAA False -1.5707963267949 15 COzw0w2sJkCv9O5js72PKAAA clMaroon $00B9FFFF 414,356;413,307 3MWhlnM4ckuqt9AtayFW7QAA OuXElcwiGEKtNCuw4GAV/QAA PpEf+Xpd606jMA/YWDCUjAAA False 1.5707963267949 15 3MWhlnM4ckuqt9AtayFW7QAA False 1.5707963267949 30 3MWhlnM4ckuqt9AtayFW7QAA False -1.5707963267949 15 3MWhlnM4ckuqt9AtayFW7QAA DataSourceTransactionManager 4/g0XRRCnE+BRDBMKbUeowAA bPeoR/O2GUOyO5SGLSvkzwAA 9 clMaroon $00B9FFFF 411 312 193 43 O/ZdEO1qP0G8nS62o9aUjAAA 1 DataSourceTransactionManager False False O/ZdEO1qP0G8nS62o9aUjAAA O/ZdEO1qP0G8nS62o9aUjAAA False O/ZdEO1qP0G8nS62o9aUjAAA clMaroon $00B9FFFF 395 208 225 43 4yVErD+okEqFY+OdbQtclQAA 3 AbstractPlatformTransactionManager False False 4yVErD+okEqFY+OdbQtclQAA 4yVErD+okEqFY+OdbQtclQAA False 4yVErD+okEqFY+OdbQtclQAA clMaroon $00B9FFFF 180 208 180 59 sdkNone /OgqxqoyGECWpduHQkeF1wAA 1 ResourceTransactionManager <<interface>> False False /OgqxqoyGECWpduHQkeF1wAA /OgqxqoyGECWpduHQkeF1wAA clMaroon $00B9FFFF 656 208 146 59 sdkNone AkYBmR/EIkapAGm0eamf2AAA 1 InitializingBean <<interface>> False False AkYBmR/EIkapAGm0eamf2AAA AkYBmR/EIkapAGm0eamf2AAA clMaroon $00B9FFFF 339 68 336 85 sdkNone 7MPRpz02eUanlcfCpzoKzgAA 1 PlatformTransactionManager <<interface>> False False 7MPRpz02eUanlcfCpzoKzgAA 7MPRpz02eUanlcfCpzoKzgAA clMaroon $00B9FFFF 507,208;506,152 0FtdsPcNhkWbfrAuuX2XSwAA CFC2PhMfnUmJzsshYBlLrgAA sR5+j+SlykC06Cdtq86XlQAA False 1.5707963267949 15 0FtdsPcNhkWbfrAuuX2XSwAA False 1.5707963267949 30 0FtdsPcNhkWbfrAuuX2XSwAA False -1.5707963267949 15 0FtdsPcNhkWbfrAuuX2XSwAA clMaroon $00B9FFFF 507,312;507,250 8/wufy2A002e0OUiKnMDewAA sR5+j+SlykC06Cdtq86XlQAA iI3BJNCcjUOzDSiTkb2gfQAA False 1.5707963267949 15 8/wufy2A002e0OUiKnMDewAA False 1.5707963267949 30 8/wufy2A002e0OUiKnMDewAA False -1.5707963267949 15 8/wufy2A002e0OUiKnMDewAA clMaroon $00B9FFFF 455,312;341,266 ritqzSUpQUyJJm3Kh9tI3QAA 65E5AqwKIUu9qCKVBp+zfgAA iI3BJNCcjUOzDSiTkb2gfQAA False 1.5707963267949 15 ritqzSUpQUyJJm3Kh9tI3QAA False 1.5707963267949 30 ritqzSUpQUyJJm3Kh9tI3QAA False -1.5707963267949 15 ritqzSUpQUyJJm3Kh9tI3QAA clMaroon $00B9FFFF 555,312;661,266 6/Iemqyjt0Kp9ojKFFyVIQAA fNkRgZJWpU6Zyfp4rUy8vQAA iI3BJNCcjUOzDSiTkb2gfQAA False 1.5707963267949 15 6/Iemqyjt0Kp9ojKFFyVIQAA False 1.5707963267949 30 6/Iemqyjt0Kp9ojKFFyVIQAA False -1.5707963267949 15 6/Iemqyjt0Kp9ojKFFyVIQAA DriverManagerDataSource 4/g0XRRCnE+BRDBMKbUeowAA 15y98j/J7U+gnvxoXv5DRgAA 11 clMaroon $00B9FFFF 365 482 161 43 2Wo+jWdYiEWcMUP5qZLwpAAA 1 DriverManagerDataSource False False 2Wo+jWdYiEWcMUP5qZLwpAAA 2Wo+jWdYiEWcMUP5qZLwpAAA False 2Wo+jWdYiEWcMUP5qZLwpAAA clMaroon $00B9FFFF 348 399 194 43 5XVmbsiAeUiiO9GL5cczVgAA 3 AbstractDriverBasedDataSource False False 5XVmbsiAeUiiO9GL5cczVgAA 5XVmbsiAeUiiO9GL5cczVgAA False 5XVmbsiAeUiiO9GL5cczVgAA clMaroon $00B9FFFF 383 316 125 43 zRrszsVFDEy8rdVdkGRz+QAA 3 AbstractDataSource False False zRrszsVFDEy8rdVdkGRz+QAA zRrszsVFDEy8rdVdkGRz+QAA False zRrszsVFDEy8rdVdkGRz+QAA clMaroon $00B9FFFF 288 204 315 72 sdkNone tZHv0A7jrkqAWCLTEoyVkwAA 1 DataSource <<interface>> False False tZHv0A7jrkqAWCLTEoyVkwAA tZHv0A7jrkqAWCLTEoyVkwAA clMaroon $00B9FFFF 196 52 182 111 sdkNone f6gGVFuWm0Kid7vcBCnY2gAA 1 CommonDataSource <<interface>> False False f6gGVFuWm0Kid7vcBCnY2gAA f6gGVFuWm0Kid7vcBCnY2gAA clMaroon $00B9FFFF 472 52 204 72 sdkNone c6Ua/fKgQUW0O5oJO+2EZgAA 1 Wrapper <<interface>> False False c6Ua/fKgQUW0O5oJO+2EZgAA c6Ua/fKgQUW0O5oJO+2EZgAA clMaroon $00B9FFFF 403,204;352,162 8cMceJDXoU6KgYd4baJ8xQAA hLInrooPN0+zrX7/ltKodgAA 0/VKMvq9tkiaBdNSZvrX8gAA False 1.5707963267949 15 8cMceJDXoU6KgYd4baJ8xQAA False 1.5707963267949 30 8cMceJDXoU6KgYd4baJ8xQAA False -1.5707963267949 15 8cMceJDXoU6KgYd4baJ8xQAA clMaroon $00B9FFFF 474,204;543,123 rUQTFcAELk6FyLtFYqqFLAAA H4HcZ8QfkUChOFkZ9HpkmQAA 0/VKMvq9tkiaBdNSZvrX8gAA False 1.5707963267949 15 rUQTFcAELk6FyLtFYqqFLAAA False 1.5707963267949 30 rUQTFcAELk6FyLtFYqqFLAAA False -1.5707963267949 15 rUQTFcAELk6FyLtFYqqFLAAA clMaroon $00B9FFFF 444,399;445,358 3xHN8fS1aUC84EKD/g59MwAA aDcv/eozCE6QUiYNn+EYPgAA 1v0yqMrCz0erjtVYb5WFlwAA False 1.5707963267949 15 3xHN8fS1aUC84EKD/g59MwAA False 1.5707963267949 30 3xHN8fS1aUC84EKD/g59MwAA False -1.5707963267949 15 3xHN8fS1aUC84EKD/g59MwAA clMaroon $00B9FFFF 445,482;444,441 GHlP+3U4JUedwmBXQdyqWgAA 1v0yqMrCz0erjtVYb5WFlwAA vhbT+01/WU6f+5dtePeA1AAA False 1.5707963267949 15 GHlP+3U4JUedwmBXQdyqWgAA False 1.5707963267949 30 GHlP+3U4JUedwmBXQdyqWgAA False -1.5707963267949 15 GHlP+3U4JUedwmBXQdyqWgAA clMaroon $00B9FFFF 445,316;445,275 UauPfCi9ckWkd6Mz33SdkwAA 0/VKMvq9tkiaBdNSZvrX8gAA aDcv/eozCE6QUiYNn+EYPgAA False 1.5707963267949 15 UauPfCi9ckWkd6Mz33SdkwAA False 1.5707963267949 30 UauPfCi9ckWkd6Mz33SdkwAA False -1.5707963267949 15 UauPfCi9ckWkd6Mz33SdkwAA DataSourceTransactionObject 4/g0XRRCnE+BRDBMKbUeowAA yDvaJHXMu0e9vcOWgWGrJQAA 9 clMaroon $00B9FFFF 359 392 180 56 7h7Ek9zxv0am2IDOtmwjTgAA 1 DataSourceTransactionObject False False 7h7Ek9zxv0am2IDOtmwjTgAA 7h7Ek9zxv0am2IDOtmwjTgAA False 7h7Ek9zxv0am2IDOtmwjTgAA clMaroon $00B9FFFF 336 268 227 82 YcPyfdVdh06WO4qbbV9SAQAA 3 JdbcTransactionObjectSupport False False YcPyfdVdh06WO4qbbV9SAQAA YcPyfdVdh06WO4qbbV9SAQAA False YcPyfdVdh06WO4qbbV9SAQAA clMaroon $00B9FFFF 240 148 227 85 sdkNone r11u67X3eUy9KfHAANaqdQAA 1 SavepointManager <<interface>> False False r11u67X3eUy9KfHAANaqdQAA r11u67X3eUy9KfHAANaqdQAA clMaroon $00B9FFFF 528 148 149 72 sdkNone bCWRdmdjMEyiGniMaeoUfgAA 1 SmartTransactionObject <<interface>> False False bCWRdmdjMEyiGniMaeoUfgAA bCWRdmdjMEyiGniMaeoUfgAA clMaroon $00B9FFFF 560 40 85 59 sdkNone HnW8BTY3pE+3mU13CCMz3QAA 1 Flushable <<interface>> False False HnW8BTY3pE+3mU13CCMz3QAA HnW8BTY3pE+3mU13CCMz3QAA clMaroon $00B9FFFF 448,392;449,349 QLeeWZUfv0GWEE8T58wmwgAA MPH/dk9YREeVVPhIXWeuUwAA sXC81qSbEEKDKZC0tQnHTQAA False 1.5707963267949 15 QLeeWZUfv0GWEE8T58wmwgAA False 1.5707963267949 30 QLeeWZUfv0GWEE8T58wmwgAA False -1.5707963267949 15 QLeeWZUfv0GWEE8T58wmwgAA clMaroon $00B9FFFF 602,148;602,98 z2b0Wc2vvEaRVkwPTpaKKgAA kj7Sc4I/cUOZjbYrOpG9tAAA zePgE/mx20yA56aefEUQJwAA False 1.5707963267949 15 z2b0Wc2vvEaRVkwPTpaKKgAA False 1.5707963267949 30 z2b0Wc2vvEaRVkwPTpaKKgAA False -1.5707963267949 15 z2b0Wc2vvEaRVkwPTpaKKgAA clMaroon $00B9FFFF 416,268;387,232 TWFh7FMPNkKAuAD3DO2XYQAA rkWtYM6vokOwu0xXKNY0KgAA MPH/dk9YREeVVPhIXWeuUwAA False 1.5707963267949 15 TWFh7FMPNkKAuAD3DO2XYQAA False 1.5707963267949 30 TWFh7FMPNkKAuAD3DO2XYQAA False -1.5707963267949 15 TWFh7FMPNkKAuAD3DO2XYQAA clMaroon $00B9FFFF 498,268;558,219 u7T9mKjwD0+kxR9ls3/d7AAA zePgE/mx20yA56aefEUQJwAA MPH/dk9YREeVVPhIXWeuUwAA False 1.5707963267949 15 u7T9mKjwD0+kxR9ls3/d7AAA False 1.5707963267949 30 u7T9mKjwD0+kxR9ls3/d7AAA False -1.5707963267949 15 u7T9mKjwD0+kxR9ls3/d7AAA Savepoint 4/g0XRRCnE+BRDBMKbUeowAA jGhJs/a5zECsdEfwpIW4IAAA 3 clMaroon $00B9FFFF 359 68 148 72 sdkNone cTZgAvgbtUmpd5Z9Qqm/qAAA 1 Savepoint <<interface>> False False cTZgAvgbtUmpd5Z9Qqm/qAAA cTZgAvgbtUmpd5Z9Qqm/qAAA clMaroon $00B9FFFF 383 204 100 43 bEbzKJCX9ECUXzXu9vXqrgAA 1 MysqlSavepoint False False bEbzKJCX9ECUXzXu9vXqrgAA bEbzKJCX9ECUXzXu9vXqrgAA False bEbzKJCX9ECUXzXu9vXqrgAA clMaroon $00B9FFFF 432,204;432,139 jwloT7ezpk+4MmUt3Mb12AAA GraXL/y4fUCoFNiP/8b2tQAA Fiprd5JcEECwMRZRPZnLwgAA False 1.5707963267949 15 jwloT7ezpk+4MmUt3Mb12AAA False 1.5707963267949 30 jwloT7ezpk+4MmUt3Mb12AAA False -1.5707963267949 15 jwloT7ezpk+4MmUt3Mb12AAA 69 InfrastructureAdvisorAutoProxyCreator 4/g0XRRCnE+BRDBMKbUeowAA 4 YkSLBGWTBUqkSlktHKGA8AAA USKHDO/fS0KaEvN9SDyuAgAA 5rQryWoCPk2G3zRWCT/W7wAA kWvyf7BMM0+nBcWtMRlh0gAA 1 R1qmbep8s0O6/OmF4nIvrQAA 2 initBeanFactory vkProtected OURIOVH6Gk+k8yBfH+iytwAA isEligibleAdvisorBean vkProtected OURIOVH6Gk+k8yBfH+iytwAA AbstractAdvisorAutoProxyCreator True 4/g0XRRCnE+BRDBMKbUeowAA 4 ztXO2yPmMUKQlJJttax8lQAA Kzc4daD20kuaNCE79aGz4QAA v/MO38u2nk6IzfCTJZS1vAAA IoMpGEo5Vku0/b86RDZEMwAA 1 qotP7v+knUWgQwU+N/0UkQAA 1 R1qmbep8s0O6/OmF4nIvrQAA 1 setBeanFactory vkProtected HNnPiiVsiEeZpojsAB0nVQAA AbstractAutoProxyCreator True 4/g0XRRCnE+BRDBMKbUeowAA 4 OegjZvpL6UKZ3T+rI0hS6gAA 62zqfXFI/0y58mSLDm8W/gAA H+2mYZZ/8kGDtate7O7zsgAA z4HqAsmTakmmt21cY03WxQAA 2 lwb5010XBUqckTdZEV9/fQAA g2lt6Ei3mk2wvVwRZ2gPeAAA 1 Ijo47wkrTUers1RCMLE19gAA 1 qotP7v+knUWgQwU+N/0UkQAA ProxyProcessorSupport 4/g0XRRCnE+BRDBMKbUeowAA 4 /2ozN7aF1E2luBEqZyzeAQAA DYqsWqy0ZEO2u3ElDl7aVAAA 8JeJ9Ae8rU6xJRCb0w9h6gAA IF4eCyXw40+WqxuIxDv1PAAA 1 zFCYjORwdkyMWspw4lS7iQAA 1 Ijo47wkrTUers1RCMLE19gAA SmartInstantiationAwareBeanPostProcessor 4/g0XRRCnE+BRDBMKbUeowAA 3 tdYRsmfxR0WIv/U5NtTEaQAA waR4bmbXqkS6wzWn4fDzngAA 3p6+oF3xr0OUDSiKWiA3UAAA 1 lwb5010XBUqckTdZEV9/fQAA BeanFactoryAware 4/g0XRRCnE+BRDBMKbUeowAA 6 VUJt3HHdREu6MIwEi5rfdAAA TmpPdg6AwkmK167HfZXUogAA nPWnuoYc+0SjYh7t0LtsswAA Y0epmTHpz0C8k6pAxxpFBAAA 0gqp7oVr2kaKd1xlxE7ZtwAA Ngsk9oU6XUuuhE1zt7k7ogAA 2 g2lt6Ei3mk2wvVwRZ2gPeAAA 66DbQhsQ5keRkqZa+cU4ywAA ProxyConfig 4/g0XRRCnE+BRDBMKbUeowAA 4 ibjd3jUSqkWSBp5mLzHfMQAA NGiKK86Xd0Sxb+TjgUo7DAAA HrCNx7N9Q0yPWvWwbTn2xwAA dYortlMUCUKNBAwghHv1MgAA 2 hbJ+xeFPbkqoadU0mLsnfAAA 1FrI7VI3SkiAQPIcyedceAAA 1 zFCYjORwdkyMWspw4lS7iQAA BeanClassLoaderAware 4/g0XRRCnE+BRDBMKbUeowAA 3 DHA+poGHTkmzW3Ittxu7SQAA jRFZ3r3KYUCLUsk2V6q6kgAA C7yesgVkMU+tPzppFWdwtgAA 1 hbJ+xeFPbkqoadU0mLsnfAAA AopInfrastructureBean 4/g0XRRCnE+BRDBMKbUeowAA 3 zkonJ5fd2UuLk0bmajpqbgAA YHYyaMt0nkCkWoUD/cqx3QAA uMEY7ALPG0eYbssSb5E5JQAA 1 1FrI7VI3SkiAQPIcyedceAAA 4/g0XRRCnE+BRDBMKbUeowAA UzF4SipjU0uItwHXa+S9cwAA UhlaPnzDKEiDl5ZkqQdoHQAA 4 GSvbsD00e02CwTZpZE/M6gAA aOE4s5wIWUCuqfVfKJp8YQAA zm+cF90EBU+mIjZWN0b90AAA ZxwWwRxst0enpjeTZueaLgAA 4/g0XRRCnE+BRDBMKbUeowAA UzF4SipjU0uItwHXa+S9cwAA 7QeZsLF0BUSWvYbK+TyVyQAA 4 ZWyTVsKi50S2aS5pTfwL9wAA qRI/005GSkemhJkBD4xueQAA 124RdFvTR0WebSk+qSKghAAA 4Nv8D978D0Shpb47ytfsfAAA 4/g0XRRCnE+BRDBMKbUeowAA YR5K8G3Ae0uHO8hGYkRcugAA UzF4SipjU0uItwHXa+S9cwAA 4 4hhqmIELakWQnXO5OEC+dQAA Fs05d7CeFkCuwZJbZbs+yQAA verg5UTTNkSl/NwTkil2bgAA +IGdHVCiXECSonWfJbkmeQAA 4/g0XRRCnE+BRDBMKbUeowAA Rgyjn2I3+EGHKP59r7NEkgAA YR5K8G3Ae0uHO8hGYkRcugAA 4 1x01whKuG0SC27MwIpf0+wAA UvRsPA6S1UaXpEtrcMKwEgAA vewu4OTLikOYamz1f+P65wAA PCk1KCp27EattBuhOA/0KgAA 4/g0XRRCnE+BRDBMKbUeowAA HNnPiiVsiEeZpojsAB0nVQAA Rgyjn2I3+EGHKP59r7NEkgAA 4 TnAqo7/B3EmSZ+urUX7aBgAA g1I67w9gS0KVnN4VflV+ygAA /vxyEUyEQ0+UbmW4W8ZasgAA dSvfB07BrU2YSW0d6oGiTQAA 4/g0XRRCnE+BRDBMKbUeowAA OURIOVH6Gk+k8yBfH+iytwAA HNnPiiVsiEeZpojsAB0nVQAA 4 F73sccsrY0S1QdS4wO0ddwAA J293/jMi5keHltT/2JMiggAA oeFhTE3760ybazUIPXkRiwAA GNlnIIu4FUmos5dkb6KAHwAA 4/g0XRRCnE+BRDBMKbUeowAA Rgyjn2I3+EGHKP59r7NEkgAA fVlMZ3kxA0G8C7jTVwoj6AAA 4 JnynN/FFFUW+HUzYlhoiGAAA 4vOgsP75J02npRSPCb1DMAAA Xh3C1aqb8U24Xn05Vc2wwgAA uYRlosgTYE+c5PHR6SxT1wAA 4/g0XRRCnE+BRDBMKbUeowAA Rgyjn2I3+EGHKP59r7NEkgAA oxuJ4yReAEqBDxleppN8GwAA 4 Bgqf0ooNRku1i/IIovlNOgAA qL5cfAicTkWj1I8J+8AXbgAA cTgu4Lr9JUiMU4EQcDqMeAAA GVGyZYqy7Em9zsMBhajBzQAA BeanFactoryTransactionAttributeSourceAdvisor 4/g0XRRCnE+BRDBMKbUeowAA 4 1/G/7jIr6USeRjf5MRIzigAA sd9ZlE19+kCdbiGXJINynwAA 4CFT74JAI0SVTtj9QGw9zwAA 39LfYvXsqUevf8vDy2187AAA 1 n4/3Xp0TOkWZ2iEbFapIHAAA 1 TransactionAttributeSourcePointcut pointcut vkPrivate /iWNr6Q6pUOpa1OyJG4G4QAA AbstractBeanFactoryPointcutAdvisor True 4/g0XRRCnE+BRDBMKbUeowAA 4 8QLBDofBkkis8DbQ41ZqdwAA zWscDx2mHk6Un50T/kYd9QAA We7JNvOCwUy2jw7Grif6OgAA DEV2Ltg/xkeZK94QCR1sngAA 1 66DbQhsQ5keRkqZa+cU4ywAA 1 fnWwC02sG0aUxkE90dYtygAA 1 n4/3Xp0TOkWZ2iEbFapIHAAA 1 Advice getAdvice pmAPRNqON0yXaVV/QX4zbwAA AbstractPointcutAdvisor True 4/g0XRRCnE+BRDBMKbUeowAA 4 s5hcnoVCV0W7kLsFfRBBXAAA lEjaL9ae0kOmnGmXBcIu7wAA xW/Fu5wXx0GMzEcdqoWgzQAA MffzSlPtIECo+baFcmE8+QAA 1 ZuClLVC9nECYCc+6/xxZ7AAA 1 fnWwC02sG0aUxkE90dYtygAA PointcutAdvisor 4/g0XRRCnE+BRDBMKbUeowAA 3 noAWtl3mY0GTMNzBBIcpZQAA pguCiRRQU0K4PtVSAmw5LgAA khPAKwc+sk2E6yLtVCfZDgAA 1 ZuClLVC9nECYCc+6/xxZ7AAA 1 i09hwfBQ6EadDKuW7BVcmAAA Advisor 4/g0XRRCnE+BRDBMKbUeowAA 3 +gGoMzEWV0Cz7p1OrtrSCAAA l1zRXcU3l0+fDT527AdG+QAA haRSBOf7lEqDSPaRHuK8zgAA 1 i09hwfBQ6EadDKuW7BVcmAAA 4/g0XRRCnE+BRDBMKbUeowAA n3Jk+j9o+Eu8gFNDrvPTJgAA Psdp+/L0S0StPiBYyjsorQAA 4 7Iw1op93MU67Y87TIYGbJgAA 9/xZc27gWECGz8fFNwcFNQAA vDBSalF5y0CX55QMKONa4wAA zTR9GFGec0y/J1u9QilEGwAA 4/g0XRRCnE+BRDBMKbUeowAA pmAPRNqON0yXaVV/QX4zbwAA rXx8AJEZP06IL4oXPQKcbgAA 4 gKa68uKvYUqdBpixm0r4UwAA o5Wkd0d+XEm3opx54LgmMgAA 1eZCN5aniEmFtKgq2jgO2AAA YzGIa0dMbUWZ9S/MIF47wAAA 4/g0XRRCnE+BRDBMKbUeowAA /iWNr6Q6pUOpa1OyJG4G4QAA pmAPRNqON0yXaVV/QX4zbwAA 4 50g828NbRkWqqXbujjhRDgAA +bnkvFVT5U+YbrMHL1VzpwAA QRYW8nQp5UyBxRT9DxUAIQAA eGDWSulaxE6mf0Uc8NCnyQAA 4/g0XRRCnE+BRDBMKbUeowAA pmAPRNqON0yXaVV/QX4zbwAA oxuJ4yReAEqBDxleppN8GwAA 4 g/Z/ckIjr0SiU7KW1FP+vgAA a11n0m7jlEe0zYhf2jMeiQAA JZ2qC6Boa06SIDzsKfG1RQAA AtFJ9dbUeUWBWTK1zUfmvwAA 4/g0XRRCnE+BRDBMKbUeowAA rXx8AJEZP06IL4oXPQKcbgAA n3Jk+j9o+Eu8gFNDrvPTJgAA 4 NBT03e7HQEuUZk2NX7yezAAA 9k+Y3amq2EqpKLxgAtpzfAAA NLFdNaufXkW95cpYLQIFHAAA g5CDa/hc6Uq0ot24zAoOiQAA TransactionAttributeSourcePointcut 4/g0XRRCnE+BRDBMKbUeowAA 4 PpEf+Xpd606jMA/YWDCUjAAA 5zqHyGf6QUCUPX1chUW0HwAA WLGbgQssS0eZJt/ZRItnHgAA 2B3yThJW/k67laty2vyNQwAA 1 3MWhlnM4ckuqt9AtayFW7QAA 1 boolean matches 2+CAT6p2AUC0zNeJjV9PEwAA 2 Method method 8KLDqPKEtUeAEQ4SPELgDQAA Class<?> targetClass 8KLDqPKEtUeAEQ4SPELgDQAA StaticMethodMatcherPointcut True 4/g0XRRCnE+BRDBMKbUeowAA 4 OuXElcwiGEKtNCuw4GAV/QAA 74rp7FWTQ0yZwmGCjJHDGQAA o6sPSKzVP0mEQgVg1Tm2uAAA 6M1y+BoPM0m/3CTZQdr3cQAA 1 tvDwwVwKm0mkr9zblC0WsgAA 1 COzw0w2sJkCv9O5js72PKAAA 1 3MWhlnM4ckuqt9AtayFW7QAA 1 ClassFilter classFilter vkPrivate YsAznIstjES2qgaX9sNEJAAA Pointcut 4/g0XRRCnE+BRDBMKbUeowAA 3 h84zru5BWkunQ5V6EbJHYQAA ARs2ODfg3Uq/x0o6+WYc/wAA ujdZ0TZld0+o0XKrfmLVkQAA 1 tvDwwVwKm0mkr9zblC0WsgAA 2 ClassFilter getClassFilter pTee9bG9DkC+dvqgCgpS9QAA MethodMatcher getMethodMatcher pTee9bG9DkC+dvqgCgpS9QAA StaticMethodMatcher True 4/g0XRRCnE+BRDBMKbUeowAA 4 wsTu7PiteUu6Js+OQKMw1wAA cyniZghzOEKnam98XwnOaAAA 1TulwG0vWUCmBOW36rzsnwAA 0kr+YGcPkkSf+4+bQ2mZMAAA 1 +HOP2QhwiEGPN6ag5HHAxgAA 1 COzw0w2sJkCv9O5js72PKAAA MethodMatcher 4/g0XRRCnE+BRDBMKbUeowAA 3 Rov8V1/J+UG4AbHeaqyccAAA MMXb6bCa50O4JNoHd4WekQAA 4OL51sBfM0SRSY9IfNYoRwAA 1 +HOP2QhwiEGPN6ag5HHAxgAA 4/g0XRRCnE+BRDBMKbUeowAA Bj7jdsRA7E6cCs2yKxccuwAA OA8eX1NjOUmQO9sLTriuXwAA 4 KndmsDfPf0S4T02nQmmGOwAA D4I4UjVHgUmydsiSUMfBTAAA YMzjHQrAHkGzxzpE45YsRgAA Kt18k+5n10mf9l43hnqzuAAA 4/g0XRRCnE+BRDBMKbUeowAA YsAznIstjES2qgaX9sNEJAAA pTee9bG9DkC+dvqgCgpS9QAA 4 WcHNBtZgVUCKWo9FdOb7hgAA NkBhEY4JO0yHwSS0R+sFJwAA pqNdc8kVGkepqV+ZONJ1fAAA x8m3rmhHZE2iAMmaEyWv1gAA 4/g0XRRCnE+BRDBMKbUeowAA YsAznIstjES2qgaX9sNEJAAA Bj7jdsRA7E6cCs2yKxccuwAA 4 fQQEfN0OIEShBBDarTwtagAA Rtgp+9NPzUOYUtjPu5Tm1wAA A7JInJkcxUSh1WYgOEnTlAAA ysVNI7yDsUik/vTzyho1FAAA 4/g0XRRCnE+BRDBMKbUeowAA 2+CAT6p2AUC0zNeJjV9PEwAA YsAznIstjES2qgaX9sNEJAAA 4 EIWp0BXw+kquiWaovP4TVQAA +qDaHS+3wkm9ITRMC1E3LwAA TWmCEikHYUK2Mxf2coJpuQAA 2Hma6wnp3Ee3yDYGScAAJwAA DataSourceTransactionManager 4/g0XRRCnE+BRDBMKbUeowAA 4 iI3BJNCcjUOzDSiTkb2gfQAA b7nAaNeZWEeB/KhatgzW5QAA hKKgi97Qh0i5L+a3rWbheQAA KYWFKCvYBUKQHj+g72e/MwAA 2 ritqzSUpQUyJJm3Kh9tI3QAA 6/Iemqyjt0Kp9ojKFFyVIQAA 1 8/wufy2A002e0OUiKnMDewAA AbstractPlatformTransactionManager True 4/g0XRRCnE+BRDBMKbUeowAA 4 sR5+j+SlykC06Cdtq86XlQAA 9NjSdWsPyEupcO5qdv4vmgAA n19YzVc6uEuCFQ+1LOhwaQAA SilSd0tYnEqZEfc1WUDodwAA 1 0FtdsPcNhkWbfrAuuX2XSwAA 1 8/wufy2A002e0OUiKnMDewAA ResourceTransactionManager 4/g0XRRCnE+BRDBMKbUeowAA 3 65E5AqwKIUu9qCKVBp+zfgAA LGEMWEZ6n02BIpUvnVMFggAA RsV37oI0hEyzcLAOslr3mQAA 1 ritqzSUpQUyJJm3Kh9tI3QAA 1 Object getResourceFactory /OgqxqoyGECWpduHQkeF1wAA InitializingBean 4/g0XRRCnE+BRDBMKbUeowAA 3 fNkRgZJWpU6Zyfp4rUy8vQAA CjkOjMQpfEyvdd4bzNqHygAA JUTRpJAKQ023XOv7/VP/IQAA 1 6/Iemqyjt0Kp9ojKFFyVIQAA 1 void afterPropertiesSet() AkYBmR/EIkapAGm0eamf2AAA PlatformTransactionManager 4/g0XRRCnE+BRDBMKbUeowAA 3 CFC2PhMfnUmJzsshYBlLrgAA 4J/OJqaIi0uPyUErwYAIzQAA zY0sZxZT3kmP1B5SnungDQAA 1 0FtdsPcNhkWbfrAuuX2XSwAA 3 TransactionStatus getTransaction 7MPRpz02eUanlcfCpzoKzgAA 1 TransactionDefinition definition JVhIpLxh4UmcEdKRhhomMgAA void commit 7MPRpz02eUanlcfCpzoKzgAA 1 TransactionStatus status 1n+cgu6ZQUGHNQnPhymt3wAA void rollback 7MPRpz02eUanlcfCpzoKzgAA 1 TransactionStatus status Exx7DOz2Y0Wg5+/0yVUC7AAA 4/g0XRRCnE+BRDBMKbUeowAA 4yVErD+okEqFY+OdbQtclQAA 7MPRpz02eUanlcfCpzoKzgAA 4 FE1tqHuPSUuYR0gaU2D3mAAA TU1ilMN9zUamT0qpCl13RgAA T8oSsIHNOE6pyGosMLrcAwAA 5vLIw4di202/duJLMPEYEgAA 4/g0XRRCnE+BRDBMKbUeowAA O/ZdEO1qP0G8nS62o9aUjAAA 4yVErD+okEqFY+OdbQtclQAA 4 Qz8P/SsMZE6ve8el2kyI1gAA PdZtOuO00UKLDIEjKLr7/AAA ztUn+SH9qkG7jOaZx8QkswAA qAzda2RnO0a6AdOtBPN5gQAA 4/g0XRRCnE+BRDBMKbUeowAA O/ZdEO1qP0G8nS62o9aUjAAA /OgqxqoyGECWpduHQkeF1wAA 4 if2s0v9U2UqBwlou0QXYKgAA pexXyCP6GUeFs/7h0cKX6wAA DM/y2MayPkOA/F9YfAlL2QAA aCZpSGQw00S1KmmSvq76aQAA 4/g0XRRCnE+BRDBMKbUeowAA O/ZdEO1qP0G8nS62o9aUjAAA AkYBmR/EIkapAGm0eamf2AAA 4 Bgw51muKPUOvxvJsc+w3PQAA UWw0WfHo2USBwwHC9r5mygAA JISXtbf0bU6ZEwwpcDBy4AAA oRAghbzfFEiyFG2jCyYMGwAA DriverManagerDataSource 4/g0XRRCnE+BRDBMKbUeowAA 4 vhbT+01/WU6f+5dtePeA1AAA rW33fDdQF0el1LjtdaPzWQAA X+Do/FpJdESGgFOScxxg8wAA oFxrD6ROFkyIEM2HmHh/EwAA 1 GHlP+3U4JUedwmBXQdyqWgAA AbstractDriverBasedDataSource True 4/g0XRRCnE+BRDBMKbUeowAA 4 1v0yqMrCz0erjtVYb5WFlwAA f7vixO6LDU+Gop+5rzOTcQAA BZZwn1TS3U2MPXzdhruABgAA lPpQ8q3Gi0KSUxvMwtiE1wAA 1 3xHN8fS1aUC84EKD/g59MwAA 1 GHlP+3U4JUedwmBXQdyqWgAA AbstractDataSource True 4/g0XRRCnE+BRDBMKbUeowAA 4 aDcv/eozCE6QUiYNn+EYPgAA q5jJdQiuik6rTlWjrPe7kwAA s89mtaSAb0+fmvv/FvMVrwAA ZDLqGc1f40uTOMOHPW1hBwAA 1 UauPfCi9ckWkd6Mz33SdkwAA 1 gOgTsEa89Eu9clwawo2s4wAA 1 3xHN8fS1aUC84EKD/g59MwAA DataSource 4/g0XRRCnE+BRDBMKbUeowAA 3 0/VKMvq9tkiaBdNSZvrX8gAA IIkMIaEwZk2Ejif609rq+wAA QkyxX5zSiU2b40ufFret5AAA 1 UauPfCi9ckWkd6Mz33SdkwAA 2 8cMceJDXoU6KgYd4baJ8xQAA rUQTFcAELk6FyLtFYqqFLAAA 1 gOgTsEa89Eu9clwawo2s4wAA 2 Connection getConnection tZHv0A7jrkqAWCLTEoyVkwAA Connection getConnection tZHv0A7jrkqAWCLTEoyVkwAA 2 String username lmd30E5OlUaamClqm4BsvQAA String password lmd30E5OlUaamClqm4BsvQAA CommonDataSource 4/g0XRRCnE+BRDBMKbUeowAA 3 hLInrooPN0+zrX7/ltKodgAA nj4L8P/ie0qeVzbzNfOLuAAA AwWcN0nLBkSZOEuWdE3vSgAA 1 8cMceJDXoU6KgYd4baJ8xQAA 5 PrintWriter getLogWriter f6gGVFuWm0Kid7vcBCnY2gAA void setLogWriter f6gGVFuWm0Kid7vcBCnY2gAA 1 PrintWriter out 8teX8X8v50eFstnwd0WT0wAA void setLoginTimeout f6gGVFuWm0Kid7vcBCnY2gAA 1 int seconds DRc9rJ1Y7EKSoPIz8ygxqgAA int getLoginTimeout f6gGVFuWm0Kid7vcBCnY2gAA Logger getParentLogger f6gGVFuWm0Kid7vcBCnY2gAA Wrapper 4/g0XRRCnE+BRDBMKbUeowAA 3 H4HcZ8QfkUChOFkZ9HpkmQAA XremU4RX+UaYcVeA0GhgtQAA Y89NDzo0cEqpNNTGHUfxVQAA 1 rUQTFcAELk6FyLtFYqqFLAAA 2 unwrap c6Ua/fKgQUW0O5oJO+2EZgAA 1 Class<T> iface GyAwI68LpUK6SRkeWhnP9wAA boolean isWrapperFor c6Ua/fKgQUW0O5oJO+2EZgAA 1 Class<?> iface VMnVbuHuH0q31XTtDsOD8wAA 4/g0XRRCnE+BRDBMKbUeowAA tZHv0A7jrkqAWCLTEoyVkwAA f6gGVFuWm0Kid7vcBCnY2gAA 4 +iuYczIAjkujnq7v9rI4+wAA +OXaONw7x0GUxIMfNFr7EQAA FWYYVmXak06J8adUZoy+NAAA q0DL7UpBCUW6UEJYsTn+hwAA 4/g0XRRCnE+BRDBMKbUeowAA tZHv0A7jrkqAWCLTEoyVkwAA c6Ua/fKgQUW0O5oJO+2EZgAA 4 r9T0TtCzTUCTqw5kFLhK7AAA wGyY538kqEi7qfbA4uz7EAAA QL26JKh5ZEaT4mnTjwXzgQAA WIL795MsWEiNLFA9CHWxzAAA 4/g0XRRCnE+BRDBMKbUeowAA zRrszsVFDEy8rdVdkGRz+QAA tZHv0A7jrkqAWCLTEoyVkwAA 4/g0XRRCnE+BRDBMKbUeowAA 5XVmbsiAeUiiO9GL5cczVgAA zRrszsVFDEy8rdVdkGRz+QAA 4 rQhKfohzT0qAaZT1OaQNFwAA uxi4PJFhtEmG3DboPWpACAAA TbJkb0eVdkqBHgpq9kbDbAAA PzNlgL55pE+tPv7pNjNaQQAA 4/g0XRRCnE+BRDBMKbUeowAA 2Wo+jWdYiEWcMUP5qZLwpAAA 5XVmbsiAeUiiO9GL5cczVgAA 4 JFcFvcW4Z0e81KmZtBpoYwAA A51NzYTMYkmUL8TDQcNJcwAA BSfdwGgpsE+VHkvKDTYj/QAA mRoc1UWcmE2Zotnzg59chQAA 4/g0XRRCnE+BRDBMKbUeowAA zRrszsVFDEy8rdVdkGRz+QAA tZHv0A7jrkqAWCLTEoyVkwAA 4 Fn3KQX+GRE2QyK2PyDBHBwAA e5c2AtvAUE2H7tgybwKKsQAA k8bYICEe4kq8hbzp2t+/AAAA IDKudTZSBkSf1IIMA0W1dAAA DataSourceTransactionObject 4/g0XRRCnE+BRDBMKbUeowAA 4 sXC81qSbEEKDKZC0tQnHTQAA 5LLpcMbdUky5nYv6e/q7EAAA zdZPXgPiJ0WY72m0kXTAwAAA /FYw/JzYgECjWeBXUazgzwAA 1 QLeeWZUfv0GWEE8T58wmwgAA 1 boolean isRollbackOnly 7h7Ek9zxv0am2IDOtmwjTgAA JdbcTransactionObjectSupport True 4/g0XRRCnE+BRDBMKbUeowAA 4 MPH/dk9YREeVVPhIXWeuUwAA Y3cBT1ugiEKNiz85GuGydwAA WhhliWqg5EqplAN8WDZRkQAA MFsN2O4ND0WvLTodVs1tbwAA 2 TWFh7FMPNkKAuAD3DO2XYQAA u7T9mKjwD0+kxR9ls3/d7AAA 1 QLeeWZUfv0GWEE8T58wmwgAA 3 Object createSavepoint() YcPyfdVdh06WO4qbbV9SAQAA void rollbackToSavepoint YcPyfdVdh06WO4qbbV9SAQAA 1 Object savepoint GGulcLUX5U6zJpHhIYhXgwAA void releaseSavepoint YcPyfdVdh06WO4qbbV9SAQAA 1 Object savepoint NFq2qcOzHE2jtHmTt9OJvAAA SavepointManager 4/g0XRRCnE+BRDBMKbUeowAA 3 rkWtYM6vokOwu0xXKNY0KgAA tQNId6Be80aceFSN+5FXJAAA 5Uiy8N5Dr0+5wPx6GN+ntwAA 1 TWFh7FMPNkKAuAD3DO2XYQAA 3 Object createSavepoint r11u67X3eUy9KfHAANaqdQAA void rollbackToSavepoint r11u67X3eUy9KfHAANaqdQAA 1 Object savepoint dwBPX/dWtUKKcJDeJDdyFQAA void releaseSavepoint r11u67X3eUy9KfHAANaqdQAA 1 Object savepoint rvodD5SY9EaRE/81Pjsf9AAA SmartTransactionObject 4/g0XRRCnE+BRDBMKbUeowAA 3 zePgE/mx20yA56aefEUQJwAA IgLRyPagZUGgqJxa6RtVmgAA 7tJ2yg/r+EmqcNuSRpB8TgAA 1 u7T9mKjwD0+kxR9ls3/d7AAA 1 z2b0Wc2vvEaRVkwPTpaKKgAA 2 boolean isRollbackOnly bCWRdmdjMEyiGniMaeoUfgAA void flush bCWRdmdjMEyiGniMaeoUfgAA Flushable 4/g0XRRCnE+BRDBMKbUeowAA 3 kj7Sc4I/cUOZjbYrOpG9tAAA wK6FncI6OEeRyhsYQYcBKQAA ySuE3N9ZfE6jh9m0KUatYAAA 1 z2b0Wc2vvEaRVkwPTpaKKgAA 1 void flush HnW8BTY3pE+3mU13CCMz3QAA 4/g0XRRCnE+BRDBMKbUeowAA 7h7Ek9zxv0am2IDOtmwjTgAA YcPyfdVdh06WO4qbbV9SAQAA 4 m5rfPeHHMkCSsj5Hr/gZBgAA MMK7+w2CskiQyWY/K3pGmAAA USdaB5G/eEO4YDz/BwFubwAA q5WBpakM00+4g1p7Eupy5gAA 4/g0XRRCnE+BRDBMKbUeowAA bCWRdmdjMEyiGniMaeoUfgAA HnW8BTY3pE+3mU13CCMz3QAA 4 dYpX6CKOnEm65hZ7zCcu2QAA WJkHNaHfHU2EzfqMDuRtDQAA 2aTZS6TWG0eGF56If/VqxgAA bY2sZsOOY0yVhgHxhHPPpAAA 4/g0XRRCnE+BRDBMKbUeowAA YcPyfdVdh06WO4qbbV9SAQAA r11u67X3eUy9KfHAANaqdQAA 4 N4TTpaz5HkKWYVvDHUjCJAAA lY/8ylev00+lOUBF6EVuDQAA 3GFZLrwrXE+cTKIBj5CO/gAA Gls6HiVBOUmeIjdEYIrregAA 4/g0XRRCnE+BRDBMKbUeowAA YcPyfdVdh06WO4qbbV9SAQAA bCWRdmdjMEyiGniMaeoUfgAA 4 81cz/qm1bkKXt1kKvvpMBAAA f1MfLYWnB0ebRlf9dpoVaAAA I8oJ29f77ki5rsDRCVj5eQAA P9kEwSUs4EatY5CJN+SCzwAA Savepoint 4/g0XRRCnE+BRDBMKbUeowAA 3 GraXL/y4fUCoFNiP/8b2tQAA I/+BoSvXM0ejSZsdL4mihwAA IbCTPNf9SECSwQcJPzc23QAA 1 jwloT7ezpk+4MmUt3Mb12AAA 2 int getSavepointId cTZgAvgbtUmpd5Z9Qqm/qAAA String getSavepointName cTZgAvgbtUmpd5Z9Qqm/qAAA MysqlSavepoint 4/g0XRRCnE+BRDBMKbUeowAA 4 Fiprd5JcEECwMRZRPZnLwgAA cSzTd/HnNkeyHlG6vlIKPwAA aIF1ACcsL0KpkidK11rtWgAA ThQJNeHeV0G1icIWitZM/wAA 1 jwloT7ezpk+4MmUt3Mb12AAA 4/g0XRRCnE+BRDBMKbUeowAA bEbzKJCX9ECUXzXu9vXqrgAA cTZgAvgbtUmpd5Z9Qqm/qAAA 4 Qn42vnZn+kaGDYxPldwHvwAA fTo8nFexcUmYQIGxQBEnZwAA 57yByQsKtEO+iyuDKW2gQQAA sPXWtKgfUEq0chpBcRXf8gAA ================================================ FILE: pom.xml ================================================ 4.0.0 skywalker spring war 1.0-SNAPSHOT spring Maven Webapp http://maven.apache.org UTF-8 4.3.18.RELEASE org.springframework spring-core ${spring-version} org.springframework spring-context ${spring-version} org.springframework spring-web ${spring-version} org.springframework spring-jdbc ${spring-version} org.springframework spring-tx ${spring-version} org.springframework spring-webmvc ${spring-version} javax.servlet javax.servlet-api 3.1.0 provided javax.servlet jstl 1.2 org.aspectj aspectjweaver 1.8.9 junit junit 4.12 com.google.guava guava 21.0 com.google.code.findbugs jsr305 3.0.1 com.google.j2objc j2objc-annotations 1.3 org.codehaus.jackson jackson-mapper-asl 1.9.13 com.fasterxml.jackson.core jackson-databind 2.10.0.pr1 mysql mysql-connector-java 5.1.20 cglib cglib 3.2.5 org.hibernate.validator hibernate-validator 6.1.0.Final org.apache.maven.plugins maven-compiler-plugin false 1.8 1.8 org.apache.tomcat.maven tomcat7-maven-plugin 2.2 8080 /spring UTF-8 TomcatServer tiger tiger ================================================ FILE: src/main/java/annotation/Init.java ================================================ package annotation; import org.springframework.beans.factory.annotation.Configurable; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 测试自定义初始化标签 * * @author skywalker */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Init { } ================================================ FILE: src/main/java/aop/Bootstrap.java ================================================ package aop; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * AOP测试启动类. * * @author skywalker */ public class Bootstrap { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("config.xml"); SimpleAopBean bean = context.getBean(SimpleAopBean.class); bean.testB(); System.out.println(bean.getClass().getSimpleName()); } } ================================================ FILE: src/main/java/aop/SimpleAopBean.java ================================================ package aop; import org.springframework.aop.framework.AopContext; /** * @author skywalker */ public class SimpleAopBean { public void boo() { System.out.println("testA执行"); testB(); } public void testB() { System.out.println("testB执行"); ((SimpleAopBean) AopContext.currentProxy()).testC(); } public void testC() { System.out.println("testC执行"); } } ================================================ FILE: src/main/java/aop/SimpleChildAopBean.java ================================================ package aop; /** * @author skywalker */ public class SimpleChildAopBean extends SimpleAopBean { @Override public void testC() { System.out.println("child testC"); } } ================================================ FILE: src/main/java/aop/SimpleMethodInterceptor.java ================================================ package aop; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; /** * @author skywalker */ public class SimpleMethodInterceptor implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println("SimpleMethodInterceptor被调用: " + invocation.getMethod().getName()); return invocation.proceed(); } } ================================================ FILE: src/main/java/base/BaseStudent.java ================================================ package base; /** * @author skywalker */ public abstract class BaseStudent { private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } } ================================================ FILE: src/main/java/base/Boostrap.java ================================================ package base; import base.aop.AopDemo; import base.transaction.TransactionBean; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Boostrap { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("config.xml"); TransactionBean bean = context.getBean(TransactionBean.class); bean.process(); } } ================================================ FILE: src/main/java/base/SimpleBean.java ================================================ package base; import annotation.Init; /** * SimpleBean * * @author skywalker * */ public class SimpleBean { private Student student; public SimpleBean() {} public SimpleBean(Student student) { this.student = student; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } public void send() { System.out.println("I am send method from SimpleBean!"); } @Init public void init() { System.out.println("Init!"); } } ================================================ FILE: src/main/java/base/SimpleBeanFactoryPostProcessor.java ================================================ package base; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Configurable; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; @Configurable public class SimpleBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory( ConfigurableListableBeanFactory beanFactory) throws BeansException { SimpleBean bean = beanFactory.getBean(SimpleBean.class); bean.getStudent().setName("^_^"); } } ================================================ FILE: src/main/java/base/SimpleBeanPostProcessor.java ================================================ package base; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; /** * @author skywalker */ public class SimpleBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return null; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return null; } } ================================================ FILE: src/main/java/base/Student.java ================================================ package base; public class Student extends BaseStudent { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Student(String name, int age) { this.age = age; this.name = name; } public Student() { } @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } } ================================================ FILE: src/main/java/base/aop/AopDemo.java ================================================ package base.aop; /** * @author skywalker */ public class AopDemo implements AopDemoInter { public void send() { System.out.println("send from aopdemo"); } public void receive() { System.out.println("receive from aopdemo"); } @Override public void inter() { System.out.println("inter"); } } ================================================ FILE: src/main/java/base/aop/AopDemoAdvice.java ================================================ package base.aop; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; /** * @author skywalker */ public class AopDemoAdvice implements MethodInterceptor { public void beforeSend() { System.out.println("before send"); } public void afterSend() { System.out.println("after send"); } public void beforeReceive() { System.out.println("before receive"); } public void afterReceive() { System.out.println("after receive"); } @Override public Object invoke(MethodInvocation invocation) throws Throwable { return null; } } ================================================ FILE: src/main/java/base/aop/AopDemoInter.java ================================================ package base.aop; /** * @author skywalker */ public interface AopDemoInter { void inter(); } ================================================ FILE: src/main/java/base/aop/annotation/AspectDemo.java ================================================ package base.aop.annotation; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; /** * @author skywalker */ @Aspect public class AspectDemo { @Pointcut("execution(void base.aop.AopDemo.send(..))") public void beforeSend() {} @Before("beforeSend()") public void before() { System.out.println("send之前"); } } ================================================ FILE: src/main/java/base/scope/OneScope.java ================================================ package base.scope; import base.Student; import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.config.Scope; /** * {@link org.springframework.beans.factory.config.Scope}简单实现,每调用一次变返回一个 * 新的对象. * * @author skywalker */ public class OneScope implements Scope { private int index = 0; @Override public Object get(String name, ObjectFactory objectFactory) { System.out.println("get被调用"); return new Student("skywalker-" + (index++), index); } @Override public Object remove(String name) { return null; } @Override public void registerDestructionCallback(String name, Runnable callback) { } @Override public Object resolveContextualObject(String key) { return null; } @Override public String getConversationId() { return null; } } ================================================ FILE: src/main/java/base/transaction/NestedBean.java ================================================ package base.transaction; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; /** * 测试嵌套事务. * * @author skywalker */ @Component public class NestedBean { @Transactional(propagation = Propagation.NESTED) public void nest() { System.out.println("嵌套事务"); } } ================================================ FILE: src/main/java/base/transaction/TransactionBean.java ================================================ package base.transaction; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; /** * 测试事务. * * @author skywalker */ @Component public class TransactionBean { public NestedBean getNestedBean() { return nestedBean; } public void setNestedBean(NestedBean nestedBean) { this.nestedBean = nestedBean; } private NestedBean nestedBean; @Transactional(propagation = Propagation.REQUIRED) public void process() { System.out.println("事务执行"); nestedBean.nest(); } } ================================================ FILE: src/main/java/cache/CacheDemo.java ================================================ package cache; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import org.junit.Test; import java.util.concurrent.ExecutionException; /** * Guava demo. * * @author skywalker */ public class CacheDemo { @Test public void cacheLoader() throws ExecutionException { LoadingCache cache = CacheBuilder.newBuilder().maximumSize(2) .build(new CacheLoader() { @Override public String load(String s) throws Exception { return "Hello: " + s; } }); System.out.println(cache.get("China")); cache.put("US", "US"); System.out.println(cache.get("US")); //放不进去 cache.put("UK", "UK"); } } ================================================ FILE: src/main/java/controller/SimpleController.java ================================================ package controller; import model.SimpleModel; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.DataBinder; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.PostConstruct; import javax.servlet.http.HttpServletRequest; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; import java.util.Set; /** * 简单的Spring {@link org.springframework.stereotype.Controller}. * * @author skywalker */ @Controller public class SimpleController { private Validator validator; @InitBinder public void initBinder(DataBinder dataBinder) { //dataBinder.setValidator(new SimpleModelValidator()); //dataBinder.addValidators(new SimpleModelValidator()); } @PostConstruct public void initValidator() { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); this.validator = factory.getValidator(); } @RequestMapping("/echo") public String echo(@RequestParam("name") String name, Model model, HttpServletRequest request) throws InterruptedException { model.addAttribute("echo", "hello " + name); return "echo"; } @RequestMapping(value = "/echoAgain", method = RequestMethod.POST) public String echo(@RequestBody SimpleModel simpleModel, BindingResult bindingResult, Model model) { Set> result = validator.validate(simpleModel); for (ConstraintViolation r : result) { System.out.println("错误消息: " + r.getMessage()); } String hello; if (bindingResult.hasErrors()) { hello = "Ops, error!"; } else { hello = "hello " + simpleModel.getName() + ", your age is " + simpleModel.getAge() + "."; } model.addAttribute("echo", hello); System.out.println(simpleModel); return "echo"; } } ================================================ FILE: src/main/java/java_config/Bootrap.java ================================================ package java_config; import base.SimpleBean; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import java.util.Arrays; /** * @author skywalker */ public class Bootrap { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SimpleBeanConfig.class); SimpleBean simpleBean = context.getBean(SimpleBean.class); System.out.println(simpleBean.getStudent().getName()); System.out.println(Arrays.toString(context.getBeanDefinitionNames())); } } ================================================ FILE: src/main/java/java_config/SimpleBeanConfig.java ================================================ package java_config; import base.SimpleBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; /** * {@link base.SimpleBean}配置 * * @author skywalker */ @Configuration @Import(StudentConfig.class) public class SimpleBeanConfig { @Autowired private StudentConfig studentConfig; @Bean public SimpleBean simpleBean() { SimpleBean simpleBean = new SimpleBean(studentConfig.student()); return simpleBean; } } ================================================ FILE: src/main/java/java_config/StudentConfig.java ================================================ package java_config; import base.Student; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportAware; import org.springframework.context.annotation.Scope; import org.springframework.core.type.AnnotationMetadata; /** * {@link base.Student}配置 * * @author skywalker */ @Configuration public class StudentConfig implements ImportAware { @Bean @Scope("prototype") public Student student() { Student student = new Student(); student.setAge(22); student.setName("skywalker"); return student; } @Override public void setImportMetadata(AnnotationMetadata importMetadata) { System.out.println("importaware"); } } ================================================ FILE: src/main/java/local/Local.java ================================================ package local; import java.util.Locale; import java.util.ResourceBundle; import org.junit.Test; /** * 测试java本地化相关 * * @author skywalker * */ public class Local { @Test public void resourceBoundle() { //此文件必须放在classpath下面 ResourceBundle bundle = ResourceBundle.getBundle("resource/resource", Locale.US); System.out.println("US: " + bundle.getString("greeting.common")); bundle = ResourceBundle.getBundle("resource/resource", Locale.CHINA); System.out.println("CN: " + bundle.getString("greeting.common")); } } ================================================ FILE: src/main/java/model/SimpleModel.java ================================================ package model; import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.Max; import java.util.Date; /** * 简单的model. * * @author skywalker */ public class SimpleModel { private String name; @Max(value = 90, message = "年龄最大不能超过90") private Integer age; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date date; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } @Override public String toString() { return "SimpleModel{" + "name='" + name + '\'' + ", age=" + age + ", date='" + date + '\'' + '}'; } } ================================================ FILE: src/main/java/task/Task.java ================================================ package task; import org.springframework.scheduling.annotation.Async; /** * 测试Spring Task. * * @author skywalker */ public class Task { @Async("executor") public void print() { System.out.println("print执行"); } } ================================================ FILE: src/main/java/test/JavaTest.java ================================================ package test; import base.Student; import org.junit.Test; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.io.IOException; import java.lang.reflect.Method; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; /** * @author skywalker */ public class JavaTest { private class MyList extends ArrayList { @Override public String get(int index) { return ""; } } public static void main(String[] args) { for (Method method : MyList.class.getDeclaredMethods()) { System.out.println("name: " + method.getName() + ", return: " + method.getReturnType()); } } @Test public void classpath() { System.out.println(System.getProperty("java.class.path")); } @Test public void findClass() throws IOException { Enumeration base = JavaTest.class.getClassLoader().getResources("base/*"); while (base.hasMoreElements()) { System.out.println(base.nextElement().toString()); } } @Test public void intro() throws IntrospectionException { BeanInfo info = Introspector.getBeanInfo(Student.class); for (PropertyDescriptor pd : info.getPropertyDescriptors()) { System.out.println(pd.getReadMethod()); System.out.println(pd.getWriteMethod()); } } @Test public void split() { String str = "1\t2\taug\tfri\t14.7\t66\t2.7\t0\t0"; String[] arr = str.split("\t"); System.out.println(Arrays.toString(arr)); System.out.println(arr); System.out.println("月份: " + arr[2]); System.out.println("天气: " + arr[4]); } } ================================================ FILE: src/main/java/test/proxy/Handler.java ================================================ package test.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * {@link java.lang.reflect.InvocationHandler}实现. * * @author skywalker */ public class Handler implements InvocationHandler { private final Object target; public Handler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String name = method.getName(); System.out.println("Method " + name + " is proxyed."); return method.invoke(target, args); } } ================================================ FILE: src/main/java/test/proxy/JDKProxy.java ================================================ package test.proxy; import java.lang.reflect.Proxy; /** * 测试JDK动态代理. * * @author skywalker */ public class JDKProxy { public static void main(String[] args) { UserService userService = new UserServiceImpl(); UserService proxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(), new Class[]{UserService.class}, new Handler(userService)); proxy.printName(); } } ================================================ FILE: src/main/java/test/proxy/UserService.java ================================================ package test.proxy; /** * 动态代理接口. * * @author skywalker */ public interface UserService { void printName(); void printAge(); } ================================================ FILE: src/main/java/test/proxy/UserServiceImpl.java ================================================ package test.proxy; /** * {@link UserService}实现. * * @author skywalker */ public class UserServiceImpl implements UserService { @Override public void printName() { System.out.println("Name is XXX"); printAge(); } @Override public void printAge() { System.out.println("Age: " + 18); } } ================================================ FILE: src/main/java/validator/SimpleModelValidator.java ================================================ package validator; import model.SimpleModel; import org.springframework.validation.Errors; import org.springframework.validation.Validator; /** * 自定义Spring校验器. * * @author skywalker */ public class SimpleModelValidator implements Validator { @Override public boolean supports(Class clazz) { return (clazz == SimpleModel.class); } @Override public void validate(Object target, Errors errors) { SimpleModel simpleModel = (SimpleModel) target; Integer age = simpleModel.getAge(); if (age == null || age < 1 || age > 200) { errors.reject("100", "年龄不合法"); } } } ================================================ FILE: src/main/resources/config.xml ================================================ ================================================ FILE: src/main/resources/property.properties ================================================ student.name= skywalker student.age=20 student.id= id ================================================ FILE: src/main/resources/resource/resource_en_US.properties ================================================ greeting.common=How are you! greeting.morning = Good morning! greeting.afternoon = Good Afternoon! ================================================ FILE: src/main/resources/resource/resource_zh_CN.properties ================================================ greeting.common=\u60a8\u597d\uff01 greeting.morning=\u65e9\u4e0a\u597d\uff01 greeting.afternoon=\u4e0b\u5348\u597d\uff01 ================================================ FILE: src/main/resources/spring-servlet.xml ================================================ ================================================ FILE: src/main/webapp/WEB-INF/echo.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

${echo}

================================================ FILE: src/main/webapp/WEB-INF/web.xml ================================================ spring index.jsp EncodeFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true EncodeFilter /* SpringMVC org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring-servlet.xml SpringMVC / ================================================ FILE: src/main/webapp/index.jsp ================================================

Hello World!