设计模式之代理模式
来源自《重学Java设计模式》链接提取码:ytc3
代理模式
代理模式有点像;老大和小弟,也有点像分销商。主要解决的问题是为某些资源的访问、对象的类的易用操作上提供方便使用的代理服务。而这种设计思想的模式经常会出现在我们的系统中,或者你用过的组件中,它们都提供给你一种非常简单易用的方式控制原本你需要编写很多代码的进行使用的服务类。
类似的场景可以想到:
- 你的数据库访问层面经常会提供一个较为基础的应用,以此来减少应用服务扩容时不至于数据库连接数暴增。
- 使用过的一些中间件例如:rpc框架,在拿到jar包对接口的描述后,中间件会在服务启动的时候生成对应的代理类,当调用接口的时候,实际是通过代理类发出的socket信息进行通过。
- 另外像我们使用的
MyBatis
,基本是定义接口但是不需要写实现类,就可以通过xml
或者自定义注解中的sql
语句进行增删拆改操作。
案例场景模拟
在本案例中我们模拟实现mybatis-spring中代理类生成部分
对于MyBatis的使用中只需要定义接口不需要写实现类就可以完成增删查改的操作,有疑问的小伙伴,在本章节就可以学习到这部分知识。解析下来我们通过实现一个这样的代理类交给spring管理的核心过程来讲述代理模式。这样的案例场景在实际业务中其实不多,因为这是将这种思想运用在中间件开发上,而很多小伙伴经常是做业务开发,所以对Spring的bean定义以及注册和代理以及反射调用的知识了解的相对较少。
代理类模式实现过程
接下来会使用代理模式来模拟实现一个MyBatis中对类的代理过程,也就是只需要定义接口,就可以关联到方法注解中的sql
语句完成对数据库的操作。
这里需要注意到的一些知识点:
BeanDefinitionRegistryPostProcessor
,spring的接口类用于处理对bean的定义注册。GenericBeanDefinition
,定义bean的信息,在mybatis-spring
中使用到的 。FactoryBean
,用于处理bean工厂的类,这个类非常常见。
代理模式结构模型
- 此模型中涉及的类并不多,但都是抽离出来的核心处理类。主要的事情就是对类的代理和注册到spring中。
- 上图中最上面是关于中间件的实现,下面是对应功能的使用。
代码实现
自定义注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Select {
String value() default "";
}
- 这里我们定义了一个模拟
mybatis-spring
中的自定义注解,用于使用在方法层面。
dao层接口
public interface IUserDao {
@Select("select userName from user where id = #{uId}")
String queryUserInfo(String uId);
}
- 这里定义一个Dao层接口,并把自定义注解加上。这与你使用MyBatis组件是一样的。
- 后面开始实现中间件部分
代理类定义
public class MapperFactoryBean<T> implements FactoryBean<T> {
private Logger logger = LoggerFactory.getLogger(MapperFactoryBean.class);
private Class<T> mapperInterface;
public MapperFactoryBean(Class<T> mapperInterface) {
this.mapperInterface = mapperInterface;
}
@Override
public T getObject() throws Exception {
InvocationHandler handler = (proxy, method, args) -> {
Select select = method.getAnnotation(Select.class);
logger.info("SQL:{}", select.value().replace("#{uId}", args[0].toString()));
return args[0] + ",小傅哥,bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!";
};
return (T) Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{mapperInterface}, handler);
}
@Override
public Class<?> getObjectType() {
return mapperInterface;
}
@Override
public boolean isSingleton() {
return true;
}
}
- 如果你有阅读过
mybatis
的源码,是可以看到这样一个类:MapperFactoryBean
,这里我们也模拟一个这样的类,在里面实现我们对代理类的定义。 - 通过继承
FactoryBean
,提供bean对象,也就是方法:T getObject()
。 - 在方法
getObject()
中提供类的代理以及模拟对sql语句的处理,这里包含了用户调用dao层方法是的处理逻辑。 - 还有最上面我们提供构造函数来透传需要被代理的类,
Class<T> mapperInterface
,在mybatis中也是用相同的方式来进行透传。 - 另外
getObject()
提供对象反馈类型,以及isSinglenton()
返回类是单例的。
将Bean定义注册到Spring容器
public class RegisterBeanFactory implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(MapperFactoryBean.class);
beanDefinition.setScope("singleton");
beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(IUserDao.class);
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(beanDefinition, "userDao");
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, registry);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
// left intentionally blank
}
}
- 这里我们将代理的bean交给spring容器管理,也就是可以非常方便的让我们可以获得代理的bean。这部分是spring中关于一个bean注册过程的源码。
GenericBeanDefinition
,用于定义一个bean的基本信息beanDefinition.setBeanClass(MapperFactoryBean.class);
,也包括可以透传给构造函数的信息beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(IUserDao.class);
- 最后使用
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, registry);
,进行bean的注册,也就是注册到DefaultListableBeanFactory
中。
配置文件spring-config
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-autowire="byName">
<bean id="userDao" class="org.itstack.demo.design.agent.RegisterBeanFactory"/>
</beans>
- 接下来将配置写入
spring-config
中,在mybatis中我们一般进行包扫描,这样可以减少这部分的配置。
测试验证
public class ApiTest {
private Logger logger = LoggerFactory.getLogger(ApiTest.class);
@Test
public void test_IUserDao() {
BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring-config.xml");
IUserDao userDao = beanFactory.getBean("userDao", IUserDao.class);
String res = userDao.queryUserInfo("100001");
logger.info("测试结果:{}", res);
}
}
- 测试的过程比较简单,通过bean工厂获取我们的代理类的实例对象,之后调用方法返回结果。
- 那么这个过程中你可以看到我们是没有对接口先实现类的,而是使用代理的方式给接口生成一个实现类,然后交给spirng管理。
测试结果
19:04:19.042 [main] DEBUG o.s.core.env.StandardEnvironment - Adding PropertySource 'systemProperties' with lowest search precedence
19:04:19.065 [main] DEBUG o.s.core.env.StandardEnvironment - Adding PropertySource 'systemEnvironment' with lowest search precedence
19:04:19.067 [main] DEBUG o.s.core.env.StandardEnvironment - Initialized StandardEnvironment with PropertySources [MapPropertySource@415138788 {name='systemProperties', properties={java.runtime.name=Java(TM) SE Runtime Environment, sun.boot.library.path=D:\JDK8\jre\bin, java.vm.version=25.211-b12, java.vm.vendor=Oracle Corporation, java.vendor.url=http://java.oracle.com/, path.separator=;, java.vm.name=Java HotSpot(TM) 64-Bit Server VM, file.encoding.pkg=sun.io, user.country=CN, user.script=, sun.java.launcher=SUN_STANDARD, sun.os.patch.level=, java.vm.specification.name=Java Virtual Machine Specification, user.dir=D:\workspace\itstack-demo-design\itstack-demo-design-12-00, java.runtime.version=1.8.0_211-b12, java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment, java.endorsed.dirs=D:\JDK8\jre\lib\endorsed, os.arch=amd64, java.io.tmpdir=C:\Users\asus6878\AppData\Local\Temp\, line.separator=
, java.vm.specification.vendor=Oracle Corporation, user.variant=, os.name=Windows 10, sun.jnu.encoding=GBK, java.library.path=D:\JDK8\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Microsoft MPI\Bin\;C:\Program Files (x86)\Common Files\Intel\Shared Libraries\redist\intel64\compiler;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\150\Tools\Binn\;C:\Program Files\Microsoft SQL Server\150\Tools\Binn\;C:\Program Files\Microsoft SQL Server\150\DTS\Binn\;C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Binn\;";D:\JDK8\bin;D:\JDK8\jre\bin";D:\JDK8\bin;d:\JDK8\jre\bin;D:\Git\cmd;D:\Git\bin;D:\Maven\apache-maven-3.6.3-bin\apache-maven-3.6.3\bin\;%MYSQL_HOME%\bin;"D:\apache-tomcat-8.5.55\bin;";D:\tools\svn\bin;C:\Program Files\TortoiseSVN\bin;D:\Microsoft VS Code\bin;C:\Program Files\nodejs\;D:\npm_repository;D:\Gradle\gradle-6.5.1\bin;D:\tools\Uedit;C:\Users\asus6878\AppData\Local\Microsoft\WindowsApps;C:\Users\asus6878\AppData\Roaming\npm;C:\Users\asus6878\AppData\Local\Pandoc\;., java.specification.name=Java Platform API Specification, java.class.version=52.0, sun.management.compiler=HotSpot 64-Bit Tiered Compilers, os.version=10.0, user.home=C:\Users\asus6878, user.timezone=Asia/Shanghai, java.awt.printerjob=sun.awt.windows.WPrinterJob, file.encoding=UTF-8, java.specification.version=1.8, java.class.path=D:\IDEA\IntelliJ IDEA 2020.1\lib\idea_rt.jar;D:\IDEA\IntelliJ IDEA 2020.1\plugins\junit\lib\junit5-rt.jar;D:\IDEA\IntelliJ IDEA 2020.1\plugins\junit\lib\junit-rt.jar;D:\JDK8\jre\lib\charsets.jar;D:\JDK8\jre\lib\deploy.jar;D:\JDK8\jre\lib\ext\access-bridge-64.jar;D:\JDK8\jre\lib\ext\cldrdata.jar;D:\JDK8\jre\lib\ext\dnsns.jar;D:\JDK8\jre\lib\ext\jaccess.jar;D:\JDK8\jre\lib\ext\jfxrt.jar;D:\JDK8\jre\lib\ext\localedata.jar;D:\JDK8\jre\lib\ext\nashorn.jar;D:\JDK8\jre\lib\ext\sunec.jar;D:\JDK8\jre\lib\ext\sunjce_provider.jar;D:\JDK8\jre\lib\ext\sunmscapi.jar;D:\JDK8\jre\lib\ext\sunpkcs11.jar;D:\JDK8\jre\lib\ext\zipfs.jar;D:\JDK8\jre\lib\javaws.jar;D:\JDK8\jre\lib\jce.jar;D:\JDK8\jre\lib\jfr.jar;D:\JDK8\jre\lib\jfxswt.jar;D:\JDK8\jre\lib\jsse.jar;D:\JDK8\jre\lib\management-agent.jar;D:\JDK8\jre\lib\plugin.jar;D:\JDK8\jre\lib\resources.jar;D:\JDK8\jre\lib\rt.jar;D:\workspace\itstack-demo-design\itstack-demo-design-12-00\target\test-classes;D:\workspace\itstack-demo-design\itstack-demo-design-12-00\target\classes;D:\Maven\RepMaven\org\quartz-scheduler\quartz\2.3.2\quartz-2.3.2.jar;D:\Maven\RepMaven\com\mchange\c3p0\0.9.5.4\c3p0-0.9.5.4.jar;D:\Maven\RepMaven\com\mchange\mchange-commons-java\0.2.15\mchange-commons-java-0.2.15.jar;D:\Maven\RepMaven\com\zaxxer\HikariCP-java7\2.4.13\HikariCP-java7-2.4.13.jar;D:\Maven\RepMaven\org\aspectj\aspectjweaver\1.6.12\aspectjweaver-1.6.12.jar;D:\Maven\RepMaven\org\aspectj\aspectjrt\1.6.12\aspectjrt-1.6.12.jar;D:\Maven\RepMaven\org\apache\commons\commons-dbcp2\2.5.0\commons-dbcp2-2.5.0.jar;D:\Maven\RepMaven\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\Maven\RepMaven\org\apache\commons\commons-pool2\2.5.0\commons-pool2-2.5.0.jar;D:\Maven\RepMaven\org\mybatis\mybatis-spring\1.3.2\mybatis-spring-1.3.2.jar;D:\Maven\RepMaven\org\mybatis\mybatis\3.4.6\mybatis-3.4.6.jar;D:\Maven\RepMaven\org\apache\commons\commons-lang3\3.8.1\commons-lang3-3.8.1.jar;D:\Maven\RepMaven\com\alibaba\fastjson\1.2.60\fastjson-1.2.60.jar;D:\Maven\RepMaven\junit\junit\4.12\junit-4.12.jar;D:\Maven\RepMaven\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\Maven\RepMaven\ch\qos\logback\logback-classic\1.0.9\logback-classic-1.0.9.jar;D:\Maven\RepMaven\ch\qos\logback\logback-core\1.0.9\logback-core-1.0.9.jar;D:\Maven\RepMaven\mysql\mysql-connector-java\5.1.20\mysql-connector-java-5.1.20.jar;D:\Maven\RepMaven\org\jboss\resteasy\resteasy-jaxrs\2.2.1.GA\resteasy-jaxrs-2.2.1.GA.jar;D:\Maven\RepMaven\org\scannotation\scannotation\1.0.3\scannotation-1.0.3.jar;D:\Maven\RepMaven\javassist\javassist\3.12.1.GA\javassist-3.12.1.GA.jar;D:\Maven\RepMaven\javax\annotation\jsr250-api\1.0\jsr250-api-1.0.jar;D:\Maven\RepMaven\javax\activation\activation\1.1\activation-1.1.jar;D:\Maven\RepMaven\commons-httpclient\commons-httpclient\3.1\commons-httpclient-3.1.jar;D:\Maven\RepMaven\commons-codec\commons-codec\1.2\commons-codec-1.2.jar;D:\Maven\RepMaven\org\apache\httpcomponents\httpclient\4.0.3\httpclient-4.0.3.jar;D:\Maven\RepMaven\org\apache\httpcomponents\httpcore\4.0.1\httpcore-4.0.1.jar;D:\Maven\RepMaven\net\jcip\jcip-annotations\1.0\jcip-annotations-1.0.jar;D:\Maven\RepMaven\org\jboss\resteasy\jaxrs-api\2.2.1.GA\jaxrs-api-2.2.1.GA.jar;D:\Maven\RepMaven\org\jboss\resteasy\resteasy-jaxb-provider\2.2.1.GA\resteasy-jaxb-provider-2.2.1.GA.jar;D:\Maven\RepMaven\com\sun\xml\bind\jaxb-impl\2.2.4\jaxb-impl-2.2.4.jar;D:\Maven\RepMaven\javax\xml\bind\jaxb-api\2.2.3\jaxb-api-2.2.3.jar;D:\Maven\RepMaven\com\sun\xml\stream\sjsxp\1.0.1\sjsxp-1.0.1.jar;D:\Maven\RepMaven\javax\xml\stream\stax-api\1.0\stax-api-1.0.jar;D:\Maven\RepMaven\org\jboss\resteasy\resteasy-spring\2.2.1.GA\resteasy-spring-2.2.1.GA.jar;D:\Maven\RepMaven\org\jboss\resteasy\resteasy-jettison-provider\2.2.1.GA\resteasy-jettison-provider-2.2.1.GA.jar;D:\Maven\RepMaven\org\codehaus\jettison\jettison\1.2\jettison-1.2.jar;D:\Maven\RepMaven\org\slf4j\slf4j-api\1.7.7\slf4j-api-1.7.7.jar;D:\Maven\RepMaven\org\springframework\spring-core\4.3.24.RELEASE\spring-core-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-test\4.3.24.RELEASE\spring-test-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-context\4.3.24.RELEASE\spring-context-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-expression\4.3.24.RELEASE\spring-expression-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-context-support\4.3.24.RELEASE\spring-context-support-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-beans\4.3.24.RELEASE\spring-beans-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-jdbc\4.3.24.RELEASE\spring-jdbc-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-aop\4.3.24.RELEASE\spring-aop-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-orm\3.1.1.RELEASE\spring-orm-3.1.1.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-web\4.3.24.RELEASE\spring-web-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-aspects\4.3.24.RELEASE\spring-aspects-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-tx\4.3.24.RELEASE\spring-tx-4.3.24.RELEASE.jar;D:\Maven\RepMaven\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar;D:\Maven\RepMaven\org\slf4j\jcl-over-slf4j\1.7.5\jcl-over-slf4j-1.7.5.jar;D:\IDEA\IntelliJ IDEA 2020.1\lib\idea_rt.jar, user.name=asus6878, java.vm.specification.version=1.8, sun.java.command=com.intellij.rt.junit.JUnitStarter -ideVersion5 org.itstack.demo.design.test.ApiTest,test_IUserDao, java.home=D:\JDK8\jre, sun.arch.data.model=64, user.language=zh, java.specification.vendor=Oracle Corporation, awt.toolkit=sun.awt.windows.WToolkit, java.vm.info=mixed mode, java.version=1.8.0_211, java.ext.dirs=D:\JDK8\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext, sun.boot.class.path=D:\JDK8\jre\lib\resources.jar;D:\JDK8\jre\lib\rt.jar;D:\JDK8\jre\lib\sunrsasign.jar;D:\JDK8\jre\lib\jsse.jar;D:\JDK8\jre\lib\jce.jar;D:\JDK8\jre\lib\charsets.jar;D:\JDK8\jre\lib\jfr.jar;D:\JDK8\jre\classes, java.vendor=Oracle Corporation, file.separator=\, java.vendor.url.bug=http://bugreport.sun.com/bugreport/, idea.test.cyclic.buffer.size=1048576, sun.io.unicode.encoding=UnicodeLittle, sun.cpu.endian=little, sun.desktop=windows, sun.cpu.isalist=amd64}}, SystemEnvironmentPropertySource@13326370 {name='systemEnvironment', properties={USERDOMAIN_ROAMINGPROFILE=GUANKANG, PROCESSOR_LEVEL=6, SESSIONNAME=Console, ALLUSERSPROFILE=C:\ProgramData, LNKEVN=C:\Program Files (x86)\Internet Explorer\iexplore.exe, INTEL_DEV_REDIST=C:\Program Files (x86)\Common Files\Intel\Shared Libraries\, PROCESSOR_ARCHITECTURE=AMD64, MIC_LD_LIBRARY_PATH=C:\Program Files (x86)\Common Files\Intel\Shared Libraries\compiler\lib\mic, PSModulePath=C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules;C:\Program Files (x86)\Microsoft SQL Server\150\Tools\PowerShell\Modules\, SystemDrive=C:, KMP_DUPLICATE_LIB_OK=TRUE, MAVEN_HOME=D:\Maven\apache-maven-3.6.3-bin\apache-maven-3.6.3, USERNAME=asus6878, ProgramFiles(x86)=C:\Program Files (x86), FPS_BROWSER_USER_PROFILE_STRING=Default, PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC, DriverData=C:\Windows\System32\Drivers\DriverData, OneDriveConsumer=C:\Users\asus6878\Desktop\OneDrive, ProgramData=C:\ProgramData, ProgramW6432=C:\Program Files, HOMEPATH=\Users\asus6878, PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 94 Stepping 3, GenuineIntel, ProgramFiles=C:\Program Files, PUBLIC=C:\Users\Public, windir=C:\WINDOWS, =::=::\, MSMPI_BENCHMARKS=C:\Program Files\Microsoft MPI\Benchmarks\, LOCALAPPDATA=C:\Users\asus6878\AppData\Local, MSMPI_BIN=C:\Program Files\Microsoft MPI\Bin\, APR_ICONV_PATH=D:\tools\svn\iconv, USERDOMAIN=GUANKANG, FPS_BROWSER_APP_PROFILE_STRING=Internet Explorer, LOGONSERVER=\\GUANKANG, JAVA_HOME=D:\JDK8, GRADLE_HOME=D:\Gradle\gradle-6.5.1, OneDrive=C:\Users\asus6878\Desktop\OneDrive, APPDATA=C:\Users\asus6878\AppData\Roaming, MYSQL_HOME=C:\Program Files\MySQL\MySQL Server 8.0, CommonProgramFiles=C:\Program Files\Common Files, Path=C:\Program Files\Microsoft MPI\Bin\;C:\Program Files (x86)\Common Files\Intel\Shared Libraries\redist\intel64\compiler;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\150\Tools\Binn\;C:\Program Files\Microsoft SQL Server\150\Tools\Binn\;C:\Program Files\Microsoft SQL Server\150\DTS\Binn\;C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Binn\;";D:\JDK8\bin;D:\JDK8\jre\bin";D:\JDK8\bin;d:\JDK8\jre\bin;D:\Git\cmd;D:\Git\bin;D:\Maven\apache-maven-3.6.3-bin\apache-maven-3.6.3\bin\;%MYSQL_HOME%\bin;"D:\apache-tomcat-8.5.55\bin;";D:\tools\svn\bin;C:\Program Files\TortoiseSVN\bin;D:\Microsoft VS Code\bin;C:\Program Files\nodejs\;D:\npm_repository;D:\Gradle\gradle-6.5.1\bin;D:\tools\Uedit;C:\Users\asus6878\AppData\Local\Microsoft\WindowsApps;C:\Users\asus6878\AppData\Roaming\npm;C:\Users\asus6878\AppData\Local\Pandoc\, MKL_SERIAL=YES, OS=Windows_NT, COMPUTERNAME=GUANKANG, CATALINA_HOME=D:\apache-tomcat-8.5.55, PROCESSOR_REVISION=5e03, CLASSPATH=.;D:\JDK8\lib;D:\JDK8\lib\dt.jar;D:\JDK8\lib\tools.jar;, CommonProgramW6432=C:\Program Files\Common Files, ComSpec=C:\WINDOWS\system32\cmd.exe, SystemRoot=C:\WINDOWS, TEMP=C:\Users\asus6878\AppData\Local\Temp, HOMEDRIVE=C:, USERPROFILE=C:\Users\asus6878, TMP=C:\Users\asus6878\AppData\Local\Temp, CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files, NUMBER_OF_PROCESSORS=4, IDEA_INITIAL_DIRECTORY=D:\IDEA\IntelliJ IDEA 2020.1\bin}}]
19:04:19.100 [main] INFO o.s.c.s.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7921b0a2: startup date [Sun Dec 13 19:04:19 CST 2020]; root of context hierarchy
19:04:19.554 [main] DEBUG o.s.core.env.StandardEnvironment - Adding PropertySource 'systemProperties' with lowest search precedence
19:04:19.555 [main] DEBUG o.s.core.env.StandardEnvironment - Adding PropertySource 'systemEnvironment' with lowest search precedence
19:04:19.555 [main] DEBUG o.s.core.env.StandardEnvironment - Initialized StandardEnvironment with PropertySources [MapPropertySource@1709366259 {name='systemProperties', properties={java.runtime.name=Java(TM) SE Runtime Environment, sun.boot.library.path=D:\JDK8\jre\bin, java.vm.version=25.211-b12, java.vm.vendor=Oracle Corporation, java.vendor.url=http://java.oracle.com/, path.separator=;, java.vm.name=Java HotSpot(TM) 64-Bit Server VM, file.encoding.pkg=sun.io, user.country=CN, user.script=, sun.java.launcher=SUN_STANDARD, sun.os.patch.level=, java.vm.specification.name=Java Virtual Machine Specification, user.dir=D:\workspace\itstack-demo-design\itstack-demo-design-12-00, java.runtime.version=1.8.0_211-b12, java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment, java.endorsed.dirs=D:\JDK8\jre\lib\endorsed, os.arch=amd64, java.io.tmpdir=C:\Users\asus6878\AppData\Local\Temp\, line.separator=
, java.vm.specification.vendor=Oracle Corporation, user.variant=, os.name=Windows 10, sun.jnu.encoding=GBK, java.library.path=D:\JDK8\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Microsoft MPI\Bin\;C:\Program Files (x86)\Common Files\Intel\Shared Libraries\redist\intel64\compiler;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\150\Tools\Binn\;C:\Program Files\Microsoft SQL Server\150\Tools\Binn\;C:\Program Files\Microsoft SQL Server\150\DTS\Binn\;C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Binn\;";D:\JDK8\bin;D:\JDK8\jre\bin";D:\JDK8\bin;d:\JDK8\jre\bin;D:\Git\cmd;D:\Git\bin;D:\Maven\apache-maven-3.6.3-bin\apache-maven-3.6.3\bin\;%MYSQL_HOME%\bin;"D:\apache-tomcat-8.5.55\bin;";D:\tools\svn\bin;C:\Program Files\TortoiseSVN\bin;D:\Microsoft VS Code\bin;C:\Program Files\nodejs\;D:\npm_repository;D:\Gradle\gradle-6.5.1\bin;D:\tools\Uedit;C:\Users\asus6878\AppData\Local\Microsoft\WindowsApps;C:\Users\asus6878\AppData\Roaming\npm;C:\Users\asus6878\AppData\Local\Pandoc\;., java.specification.name=Java Platform API Specification, java.class.version=52.0, sun.management.compiler=HotSpot 64-Bit Tiered Compilers, os.version=10.0, user.home=C:\Users\asus6878, user.timezone=Asia/Shanghai, java.awt.printerjob=sun.awt.windows.WPrinterJob, file.encoding=UTF-8, java.specification.version=1.8, java.class.path=D:\IDEA\IntelliJ IDEA 2020.1\lib\idea_rt.jar;D:\IDEA\IntelliJ IDEA 2020.1\plugins\junit\lib\junit5-rt.jar;D:\IDEA\IntelliJ IDEA 2020.1\plugins\junit\lib\junit-rt.jar;D:\JDK8\jre\lib\charsets.jar;D:\JDK8\jre\lib\deploy.jar;D:\JDK8\jre\lib\ext\access-bridge-64.jar;D:\JDK8\jre\lib\ext\cldrdata.jar;D:\JDK8\jre\lib\ext\dnsns.jar;D:\JDK8\jre\lib\ext\jaccess.jar;D:\JDK8\jre\lib\ext\jfxrt.jar;D:\JDK8\jre\lib\ext\localedata.jar;D:\JDK8\jre\lib\ext\nashorn.jar;D:\JDK8\jre\lib\ext\sunec.jar;D:\JDK8\jre\lib\ext\sunjce_provider.jar;D:\JDK8\jre\lib\ext\sunmscapi.jar;D:\JDK8\jre\lib\ext\sunpkcs11.jar;D:\JDK8\jre\lib\ext\zipfs.jar;D:\JDK8\jre\lib\javaws.jar;D:\JDK8\jre\lib\jce.jar;D:\JDK8\jre\lib\jfr.jar;D:\JDK8\jre\lib\jfxswt.jar;D:\JDK8\jre\lib\jsse.jar;D:\JDK8\jre\lib\management-agent.jar;D:\JDK8\jre\lib\plugin.jar;D:\JDK8\jre\lib\resources.jar;D:\JDK8\jre\lib\rt.jar;D:\workspace\itstack-demo-design\itstack-demo-design-12-00\target\test-classes;D:\workspace\itstack-demo-design\itstack-demo-design-12-00\target\classes;D:\Maven\RepMaven\org\quartz-scheduler\quartz\2.3.2\quartz-2.3.2.jar;D:\Maven\RepMaven\com\mchange\c3p0\0.9.5.4\c3p0-0.9.5.4.jar;D:\Maven\RepMaven\com\mchange\mchange-commons-java\0.2.15\mchange-commons-java-0.2.15.jar;D:\Maven\RepMaven\com\zaxxer\HikariCP-java7\2.4.13\HikariCP-java7-2.4.13.jar;D:\Maven\RepMaven\org\aspectj\aspectjweaver\1.6.12\aspectjweaver-1.6.12.jar;D:\Maven\RepMaven\org\aspectj\aspectjrt\1.6.12\aspectjrt-1.6.12.jar;D:\Maven\RepMaven\org\apache\commons\commons-dbcp2\2.5.0\commons-dbcp2-2.5.0.jar;D:\Maven\RepMaven\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\Maven\RepMaven\org\apache\commons\commons-pool2\2.5.0\commons-pool2-2.5.0.jar;D:\Maven\RepMaven\org\mybatis\mybatis-spring\1.3.2\mybatis-spring-1.3.2.jar;D:\Maven\RepMaven\org\mybatis\mybatis\3.4.6\mybatis-3.4.6.jar;D:\Maven\RepMaven\org\apache\commons\commons-lang3\3.8.1\commons-lang3-3.8.1.jar;D:\Maven\RepMaven\com\alibaba\fastjson\1.2.60\fastjson-1.2.60.jar;D:\Maven\RepMaven\junit\junit\4.12\junit-4.12.jar;D:\Maven\RepMaven\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\Maven\RepMaven\ch\qos\logback\logback-classic\1.0.9\logback-classic-1.0.9.jar;D:\Maven\RepMaven\ch\qos\logback\logback-core\1.0.9\logback-core-1.0.9.jar;D:\Maven\RepMaven\mysql\mysql-connector-java\5.1.20\mysql-connector-java-5.1.20.jar;D:\Maven\RepMaven\org\jboss\resteasy\resteasy-jaxrs\2.2.1.GA\resteasy-jaxrs-2.2.1.GA.jar;D:\Maven\RepMaven\org\scannotation\scannotation\1.0.3\scannotation-1.0.3.jar;D:\Maven\RepMaven\javassist\javassist\3.12.1.GA\javassist-3.12.1.GA.jar;D:\Maven\RepMaven\javax\annotation\jsr250-api\1.0\jsr250-api-1.0.jar;D:\Maven\RepMaven\javax\activation\activation\1.1\activation-1.1.jar;D:\Maven\RepMaven\commons-httpclient\commons-httpclient\3.1\commons-httpclient-3.1.jar;D:\Maven\RepMaven\commons-codec\commons-codec\1.2\commons-codec-1.2.jar;D:\Maven\RepMaven\org\apache\httpcomponents\httpclient\4.0.3\httpclient-4.0.3.jar;D:\Maven\RepMaven\org\apache\httpcomponents\httpcore\4.0.1\httpcore-4.0.1.jar;D:\Maven\RepMaven\net\jcip\jcip-annotations\1.0\jcip-annotations-1.0.jar;D:\Maven\RepMaven\org\jboss\resteasy\jaxrs-api\2.2.1.GA\jaxrs-api-2.2.1.GA.jar;D:\Maven\RepMaven\org\jboss\resteasy\resteasy-jaxb-provider\2.2.1.GA\resteasy-jaxb-provider-2.2.1.GA.jar;D:\Maven\RepMaven\com\sun\xml\bind\jaxb-impl\2.2.4\jaxb-impl-2.2.4.jar;D:\Maven\RepMaven\javax\xml\bind\jaxb-api\2.2.3\jaxb-api-2.2.3.jar;D:\Maven\RepMaven\com\sun\xml\stream\sjsxp\1.0.1\sjsxp-1.0.1.jar;D:\Maven\RepMaven\javax\xml\stream\stax-api\1.0\stax-api-1.0.jar;D:\Maven\RepMaven\org\jboss\resteasy\resteasy-spring\2.2.1.GA\resteasy-spring-2.2.1.GA.jar;D:\Maven\RepMaven\org\jboss\resteasy\resteasy-jettison-provider\2.2.1.GA\resteasy-jettison-provider-2.2.1.GA.jar;D:\Maven\RepMaven\org\codehaus\jettison\jettison\1.2\jettison-1.2.jar;D:\Maven\RepMaven\org\slf4j\slf4j-api\1.7.7\slf4j-api-1.7.7.jar;D:\Maven\RepMaven\org\springframework\spring-core\4.3.24.RELEASE\spring-core-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-test\4.3.24.RELEASE\spring-test-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-context\4.3.24.RELEASE\spring-context-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-expression\4.3.24.RELEASE\spring-expression-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-context-support\4.3.24.RELEASE\spring-context-support-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-beans\4.3.24.RELEASE\spring-beans-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-jdbc\4.3.24.RELEASE\spring-jdbc-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-aop\4.3.24.RELEASE\spring-aop-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-orm\3.1.1.RELEASE\spring-orm-3.1.1.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-web\4.3.24.RELEASE\spring-web-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-aspects\4.3.24.RELEASE\spring-aspects-4.3.24.RELEASE.jar;D:\Maven\RepMaven\org\springframework\spring-tx\4.3.24.RELEASE\spring-tx-4.3.24.RELEASE.jar;D:\Maven\RepMaven\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar;D:\Maven\RepMaven\org\slf4j\jcl-over-slf4j\1.7.5\jcl-over-slf4j-1.7.5.jar;D:\IDEA\IntelliJ IDEA 2020.1\lib\idea_rt.jar, user.name=asus6878, java.vm.specification.version=1.8, sun.java.command=com.intellij.rt.junit.JUnitStarter -ideVersion5 org.itstack.demo.design.test.ApiTest,test_IUserDao, java.home=D:\JDK8\jre, sun.arch.data.model=64, user.language=zh, java.specification.vendor=Oracle Corporation, awt.toolkit=sun.awt.windows.WToolkit, java.vm.info=mixed mode, java.version=1.8.0_211, java.ext.dirs=D:\JDK8\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext, sun.boot.class.path=D:\JDK8\jre\lib\resources.jar;D:\JDK8\jre\lib\rt.jar;D:\JDK8\jre\lib\sunrsasign.jar;D:\JDK8\jre\lib\jsse.jar;D:\JDK8\jre\lib\jce.jar;D:\JDK8\jre\lib\charsets.jar;D:\JDK8\jre\lib\jfr.jar;D:\JDK8\jre\classes, java.vendor=Oracle Corporation, file.separator=\, java.vendor.url.bug=http://bugreport.sun.com/bugreport/, idea.test.cyclic.buffer.size=1048576, sun.io.unicode.encoding=UnicodeLittle, sun.cpu.endian=little, sun.desktop=windows, sun.cpu.isalist=amd64}}, SystemEnvironmentPropertySource@1335298403 {name='systemEnvironment', properties={USERDOMAIN_ROAMINGPROFILE=GUANKANG, PROCESSOR_LEVEL=6, SESSIONNAME=Console, ALLUSERSPROFILE=C:\ProgramData, LNKEVN=C:\Program Files (x86)\Internet Explorer\iexplore.exe, INTEL_DEV_REDIST=C:\Program Files (x86)\Common Files\Intel\Shared Libraries\, PROCESSOR_ARCHITECTURE=AMD64, MIC_LD_LIBRARY_PATH=C:\Program Files (x86)\Common Files\Intel\Shared Libraries\compiler\lib\mic, PSModulePath=C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules;C:\Program Files (x86)\Microsoft SQL Server\150\Tools\PowerShell\Modules\, SystemDrive=C:, KMP_DUPLICATE_LIB_OK=TRUE, MAVEN_HOME=D:\Maven\apache-maven-3.6.3-bin\apache-maven-3.6.3, USERNAME=asus6878, ProgramFiles(x86)=C:\Program Files (x86), FPS_BROWSER_USER_PROFILE_STRING=Default, PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC, DriverData=C:\Windows\System32\Drivers\DriverData, OneDriveConsumer=C:\Users\asus6878\Desktop\OneDrive, ProgramData=C:\ProgramData, ProgramW6432=C:\Program Files, HOMEPATH=\Users\asus6878, PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 94 Stepping 3, GenuineIntel, ProgramFiles=C:\Program Files, PUBLIC=C:\Users\Public, windir=C:\WINDOWS, =::=::\, MSMPI_BENCHMARKS=C:\Program Files\Microsoft MPI\Benchmarks\, LOCALAPPDATA=C:\Users\asus6878\AppData\Local, MSMPI_BIN=C:\Program Files\Microsoft MPI\Bin\, APR_ICONV_PATH=D:\tools\svn\iconv, USERDOMAIN=GUANKANG, FPS_BROWSER_APP_PROFILE_STRING=Internet Explorer, LOGONSERVER=\\GUANKANG, JAVA_HOME=D:\JDK8, GRADLE_HOME=D:\Gradle\gradle-6.5.1, OneDrive=C:\Users\asus6878\Desktop\OneDrive, APPDATA=C:\Users\asus6878\AppData\Roaming, MYSQL_HOME=C:\Program Files\MySQL\MySQL Server 8.0, CommonProgramFiles=C:\Program Files\Common Files, Path=C:\Program Files\Microsoft MPI\Bin\;C:\Program Files (x86)\Common Files\Intel\Shared Libraries\redist\intel64\compiler;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\150\Tools\Binn\;C:\Program Files\Microsoft SQL Server\150\Tools\Binn\;C:\Program Files\Microsoft SQL Server\150\DTS\Binn\;C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Binn\;";D:\JDK8\bin;D:\JDK8\jre\bin";D:\JDK8\bin;d:\JDK8\jre\bin;D:\Git\cmd;D:\Git\bin;D:\Maven\apache-maven-3.6.3-bin\apache-maven-3.6.3\bin\;%MYSQL_HOME%\bin;"D:\apache-tomcat-8.5.55\bin;";D:\tools\svn\bin;C:\Program Files\TortoiseSVN\bin;D:\Microsoft VS Code\bin;C:\Program Files\nodejs\;D:\npm_repository;D:\Gradle\gradle-6.5.1\bin;D:\tools\Uedit;C:\Users\asus6878\AppData\Local\Microsoft\WindowsApps;C:\Users\asus6878\AppData\Roaming\npm;C:\Users\asus6878\AppData\Local\Pandoc\, MKL_SERIAL=YES, OS=Windows_NT, COMPUTERNAME=GUANKANG, CATALINA_HOME=D:\apache-tomcat-8.5.55, PROCESSOR_REVISION=5e03, CLASSPATH=.;D:\JDK8\lib;D:\JDK8\lib\dt.jar;D:\JDK8\lib\tools.jar;, CommonProgramW6432=C:\Program Files\Common Files, ComSpec=C:\WINDOWS\system32\cmd.exe, SystemRoot=C:\WINDOWS, TEMP=C:\Users\asus6878\AppData\Local\Temp, HOMEDRIVE=C:, USERPROFILE=C:\Users\asus6878, TMP=C:\Users\asus6878\AppData\Local\Temp, CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files, NUMBER_OF_PROCESSORS=4, IDEA_INITIAL_DIRECTORY=D:\IDEA\IntelliJ IDEA 2020.1\bin}}]
19:04:19.686 [main] INFO o.s.b.f.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [spring-config.xml]
19:04:19.914 [main] DEBUG o.s.b.f.xml.DefaultDocumentLoader - Using JAXP provider [com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl]
19:04:20.294 [main] DEBUG o.s.b.f.xml.PluggableSchemaResolver - Loading schema mappings from [META-INF/spring.schemas]
19:04:20.368 [main] DEBUG o.s.b.f.xml.PluggableSchemaResolver - Loaded schema mappings: {https://www.springframework.org/schema/aop/spring-aop.xsd=org/springframework/aop/config/spring-aop-4.3.xsd, https://www.springframework.org/schema/jdbc/spring-jdbc.xsd=org/springframework/jdbc/config/spring-jdbc-4.3.xsd, https://www.springframework.org/schema/tx/spring-tx-4.3.xsd=org/springframework/transaction/config/spring-tx-4.3.xsd, http://www.springframework.org/schema/task/spring-task-3.0.xsd=org/springframework/scheduling/config/spring-task-3.0.xsd, https://www.springframework.org/schema/task/spring-task-4.3.xsd=org/springframework/scheduling/config/spring-task-4.3.xsd, http://www.springframework.org/schema/aop/spring-aop-4.3.xsd=org/springframework/aop/config/spring-aop-4.3.xsd, https://www.springframework.org/schema/jee/spring-jee-2.0.xsd=org/springframework/ejb/config/spring-jee-2.0.xsd, http://www.springframework.org/schema/lang/spring-lang-2.0.xsd=org/springframework/scripting/config/spring-lang-2.0.xsd, http://www.springframework.org/schema/tx/spring-tx-3.0.xsd=org/springframework/transaction/config/spring-tx-3.0.xsd, https://www.springframework.org/schema/jee/spring-jee-3.0.xsd=org/springframework/ejb/config/spring-jee-3.0.xsd, https://www.springframework.org/schema/util/spring-util-3.1.xsd=org/springframework/beans/factory/xml/spring-util-3.1.xsd, http://www.springframework.org/schema/lang/spring-lang-3.0.xsd=org/springframework/scripting/config/spring-lang-3.0.xsd, http://www.springframework.org/schema/cache/spring-cache-4.0.xsd=org/springframework/cache/config/spring-cache-4.0.xsd, http://www.springframework.org/schema/util/spring-util-4.1.xsd=org/springframework/beans/factory/xml/spring-util-4.1.xsd, https://www.springframework.org/schema/tool/spring-tool-3.1.xsd=org/springframework/beans/factory/xml/spring-tool-3.1.xsd, http://www.springframework.org/schema/tx/spring-tx-4.0.xsd=org/springframework/transaction/config/spring-tx-4.0.xsd, https://www.springframework.org/schema/lang/spring-lang-4.3.xsd=org/springframework/scripting/config/spring-lang-4.3.xsd, http://www.springframework.org/schema/beans/spring-beans.xsd=org/springframework/beans/factory/xml/spring-beans-4.3.xsd, https://www.springframework.org/schema/jee/spring-jee-4.0.xsd=org/springframework/ejb/config/spring-jee-4.0.xsd, http://www.springframework.org/schema/tool/spring-tool-4.1.xsd=org/springframework/beans/factory/xml/spring-tool-4.1.xsd, http://www.springframework.org/schema/beans/spring-beans-3.0.xsd=org/springframework/beans/factory/xml/spring-beans-3.0.xsd, https://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd=org/springframework/jdbc/config/spring-jdbc-3.1.xsd, https://www.springframework.org/schema/jee/spring-jee.xsd=org/springframework/ejb/config/spring-jee-4.3.xsd, http://www.springframework.org/schema/beans/spring-beans-4.0.xsd=org/springframework/beans/factory/xml/spring-beans-4.0.xsd, https://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd=org/springframework/jdbc/config/spring-jdbc-4.1.xsd, http://www.springframework.org/schema/task/spring-task-4.3.xsd=org/springframework/scheduling/config/spring-task-4.3.xsd, http://www.springframework.org/schema/context/spring-context-3.2.xsd=org/springframework/context/config/spring-context-3.2.xsd, https://www.springframework.org/schema/aop/spring-aop-2.5.xsd=org/springframework/aop/config/spring-aop-2.5.xsd, http://www.springframework.org/schema/context/spring-context-4.2.xsd=org/springframework/context/config/spring-context-4.2.xsd, http://www.springframework.org/schema/tx/spring-tx-2.0.xsd=org/springframework/transaction/config/spring-tx-2.0.xsd, http://www.springframework.org/schema/jee/spring-jee-2.5.xsd=org/springframework/ejb/config/spring-jee-2.5.xsd, http://www.springframework.org/schema/util/spring-util-3.1.xsd=org/springframework/beans/factory/xml/spring-util-3.1.xsd, http://www.springframework.org/schema/tool/spring-tool-3.1.xsd=org/springframework/beans/factory/xml/spring-tool-3.1.xsd, http://www.springframework.org/schema/lang/spring-lang-4.3.xsd=org/springframework/scripting/config/spring-lang-4.3.xsd, https://www.springframework.org/schema/context/spring-context-4.3.xsd=org/springframework/context/config/spring-context-4.3.xsd, http://www.springframework.org/schema/beans/spring-beans-2.0.xsd=org/springframework/beans/factory/xml/spring-beans-2.0.xsd, https://www.springframework.org/schema/lang/spring-lang.xsd=org/springframework/scripting/config/spring-lang-4.3.xsd, http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd=org/springframework/jdbc/config/spring-jdbc-3.1.xsd, https://www.springframework.org/schema/cache/spring-cache-4.2.xsd=org/springframework/cache/config/spring-cache-4.2.xsd, https://www.springframework.org/schema/aop/spring-aop-3.1.xsd=org/springframework/aop/config/spring-aop-3.1.xsd, http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd=org/springframework/jdbc/config/spring-jdbc-4.1.xsd, https://www.springframework.org/schema/beans/spring-beans-3.2.xsd=org/springframework/beans/factory/xml/spring-beans-3.2.xsd, https://www.springframework.org/schema/aop/spring-aop-4.1.xsd=org/springframework/aop/config/spring-aop-4.1.xsd, https://www.springframework.org/schema/beans/spring-beans-4.2.xsd=org/springframework/beans/factory/xml/spring-beans-4.2.xsd, http://www.springframework.org/schema/tool/spring-tool.xsd=org/springframework/beans/factory/xml/spring-tool-4.3.xsd, http://www.springframework.org/schema/jee/spring-jee-4.1.xsd=org/springframework/ejb/config/spring-jee-4.1.xsd, http://mybatis.org/schema/mybatis-spring-1.2.xsd=org/mybatis/spring/config/mybatis-spring-1.2.xsd, http://www.springframework.org/schema/cache/spring-cache-4.3.xsd=org/springframework/cache/config/spring-cache-4.3.xsd, http://www.springframework.org/schema/jdbc/spring-jdbc.xsd=org/springframework/jdbc/config/spring-jdbc-4.3.xsd, http://www.springframework.org/schema/tx/spring-tx-4.3.xsd=org/springframework/transaction/config/spring-tx-4.3.xsd, https://www.springframework.org/schema/jee/spring-jee-4.3.xsd=org/springframework/ejb/config/spring-jee-4.3.xsd, https://www.springframework.org/schema/cache/spring-cache-3.2.xsd=org/springframework/cache/config/spring-cache-3.2.xsd, http://www.springframework.org/schema/beans/spring-beans-4.3.xsd=org/springframework/beans/factory/xml/spring-beans-4.3.xsd, http://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-4.3.xsd, https://www.springframework.org/schema/util/spring-util.xsd=org/springframework/beans/factory/xml/spring-util-4.3.xsd, http://www.springframework.org/schema/lang/spring-lang.xsd=org/springframework/scripting/config/spring-lang-4.3.xsd, https://www.springframework.org/schema/util/spring-util-4.0.xsd=org/springframework/beans/factory/xml/spring-util-4.0.xsd, http://www.springframework.org/schema/jee/spring-jee-3.1.xsd=org/springframework/ejb/config/spring-jee-3.1.xsd, https://www.springframework.org/schema/tool/spring-tool-4.0.xsd=org/springframework/beans/factory/xml/spring-tool-4.0.xsd, https://www.springframework.org/schema/tx/spring-tx-4.2.xsd=org/springframework/transaction/config/spring-tx-4.2.xsd, https://www.springframework.org/schema/task/spring-task-4.2.xsd=org/springframework/scheduling/config/spring-task-4.2.xsd, http://www.springframework.org/schema/aop/spring-aop-4.2.xsd=org/springframework/aop/config/spring-aop-4.2.xsd, https://www.springframework.org/schema/util/spring-util-2.0.xsd=org/springframework/beans/factory/xml/spring-util-2.0.xsd, https://www.springframework.org/schema/tool/spring-tool-2.0.xsd=org/springframework/beans/factory/xml/spring-tool-2.0.xsd, http://www.springframework.org/schema/context/spring-context-2.5.xsd=org/springframework/context/config/spring-context-2.5.xsd, https://www.springframework.org/schema/util/spring-util-3.0.xsd=org/springframework/beans/factory/xml/spring-util-3.0.xsd, http://www.springframework.org/schema/util/spring-util-4.0.xsd=org/springframework/beans/factory/xml/spring-util-4.0.xsd, https://www.springframework.org/schema/tool/spring-tool-3.0.xsd=org/springframework/beans/factory/xml/spring-tool-3.0.xsd, https://www.springframework.org/schema/lang/spring-lang-4.2.xsd=org/springframework/scripting/config/spring-lang-4.2.xsd, http://www.springframework.org/schema/tool/spring-tool-4.0.xsd=org/springframework/beans/factory/xml/spring-tool-4.0.xsd, https://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd=org/springframework/jdbc/config/spring-jdbc-3.0.xsd, https://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd=org/springframework/jdbc/config/spring-jdbc-4.0.xsd, https://www.springframework.org/schema/tx/spring-tx-3.2.xsd=org/springframework/transaction/config/spring-tx-3.2.xsd, https://www.springframework.org/schema/task/spring-task-3.2.xsd=org/springframework/scheduling/config/spring-task-3.2.xsd, http://www.springframework.org/schema/aop/spring-aop-3.2.xsd=org/springframework/aop/config/spring-aop-3.2.xsd, http://www.springframework.org/schema/task/spring-task-4.2.xsd=org/springframework/scheduling/config/spring-task-4.2.xsd, http://www.springframework.org/schema/context/spring-context-3.1.xsd=org/springframework/context/config/spring-context-3.1.xsd, http://www.springframework.org/schema/context/spring-context-4.1.xsd=org/springframework/context/config/spring-context-4.1.xsd, https://www.springframework.org/schema/beans/spring-beans-2.5.xsd=org/springframework/beans/factory/xml/spring-beans-2.5.xsd, http://www.springframework.org/schema/util/spring-util-2.0.xsd=org/springframework/beans/factory/xml/spring-util-2.0.xsd, http://www.springframework.org/schema/tool/spring-tool-2.0.xsd=org/springframework/beans/factory/xml/spring-tool-2.0.xsd, https://www.springframework.org/schema/context/spring-context-3.2.xsd=org/springframework/context/config/spring-context-3.2.xsd, http://www.springframework.org/schema/tx/spring-tx.xsd=org/springframework/transaction/config/spring-tx-4.3.xsd, http://www.springframework.org/schema/util/spring-util-3.0.xsd=org/springframework/beans/factory/xml/spring-util-3.0.xsd, http://www.springframework.org/schema/tool/spring-tool-3.0.xsd=org/springframework/beans/factory/xml/spring-tool-3.0.xsd, https://www.springframework.org/schema/lang/spring-lang-3.2.xsd=org/springframework/scripting/config/spring-lang-3.2.xsd, https://www.springframework.org/schema/util/spring-util-4.3.xsd=org/springframework/beans/factory/xml/spring-util-4.3.xsd, http://www.springframework.org/schema/lang/spring-lang-4.2.xsd=org/springframework/scripting/config/spring-lang-4.2.xsd, https://www.springframework.org/schema/context/spring-context-4.2.xsd=org/springframework/context/config/spring-context-4.2.xsd, https://www.springframework.org/schema/tool/spring-tool-4.3.xsd=org/springframework/beans/factory/xml/spring-tool-4.3.xsd, http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd=org/springframework/jdbc/config/spring-jdbc-3.0.xsd, http://www.springframework.org/schema/util/spring-util.xsd=org/springframework/beans/factory/xml/spring-util-4.3.xsd, https://www.springframework.org/schema/cache/spring-cache-4.1.xsd=org/springframework/cache/config/spring-cache-4.1.xsd, https://www.springframework.org/schema/aop/spring-aop-3.0.xsd=org/springframework/aop/config/spring-aop-3.0.xsd, http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd=org/springframework/jdbc/config/spring-jdbc-4.0.xsd, https://www.springframework.org/schema/beans/spring-beans-3.1.xsd=org/springframework/beans/factory/xml/spring-beans-3.1.xsd, http://www.springframework.org/schema/task/spring-task-3.2.xsd=org/springframework/scheduling/config/spring-task-3.2.xsd, https://www.springframework.org/schema/aop/spring-aop-4.0.xsd=org/springframework/aop/config/spring-aop-4.0.xsd, https://www.springframework.org/schema/beans/spring-beans-4.1.xsd=org/springframework/beans/factory/xml/spring-beans-4.1.xsd, http://www.springframework.org/schema/jee/spring-jee-4.0.xsd=org/springframework/ejb/config/spring-jee-4.0.xsd, http://www.springframework.org/schema/cache/spring-cache-3.2.xsd=org/springframework/cache/config/spring-cache-3.2.xsd, http://www.springframework.org/schema/tx/spring-tx-3.2.xsd=org/springframework/transaction/config/spring-tx-3.2.xsd, https://www.springframework.org/schema/jee/spring-jee-3.2.xsd=org/springframework/ejb/config/spring-jee-3.2.xsd, http://www.springframework.org/schema/lang/spring-lang-3.2.xsd=org/springframework/scripting/config/spring-lang-3.2.xsd, http://www.springframework.org/schema/cache/spring-cache-4.2.xsd=org/springframework/cache/config/spring-cache-4.2.xsd, http://www.springframework.org/schema/util/spring-util-4.3.xsd=org/springframework/beans/factory/xml/spring-util-4.3.xsd, http://www.springframework.org/schema/tx/spring-tx-4.2.xsd=org/springframework/transaction/config/spring-tx-4.2.xsd, https://www.springframework.org/schema/jee/spring-jee-4.2.xsd=org/springframework/ejb/config/spring-jee-4.2.xsd, http://www.springframework.org/schema/tool/spring-tool-4.3.xsd=org/springframework/beans/factory/xml/spring-tool-4.3.xsd, http://www.springframework.org/schema/beans/spring-beans-3.2.xsd=org/springframework/beans/factory/xml/spring-beans-3.2.xsd, https://www.springframework.org/schema/cache/spring-cache-3.1.xsd=org/springframework/cache/config/spring-cache-3.1.xsd, https://www.springframework.org/schema/tx/spring-tx-2.5.xsd=org/springframework/transaction/config/spring-tx-2.5.xsd, http://www.springframework.org/schema/beans/spring-beans-4.2.xsd=org/springframework/beans/factory/xml/spring-beans-4.2.xsd, https://www.springframework.org/schema/aop/spring-aop-2.0.xsd=org/springframework/aop/config/spring-aop-2.0.xsd, http://www.springframework.org/schema/aop/spring-aop-2.5.xsd=org/springframework/aop/config/spring-aop-2.5.xsd, https://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd=org/springframework/jdbc/config/spring-jdbc-4.3.xsd, http://www.springframework.org/schema/jee/spring-jee-2.0.xsd=org/springframework/ejb/config/spring-jee-2.0.xsd, https://www.springframework.org/schema/cache/spring-cache.xsd=org/springframework/cache/config/spring-cache-4.3.xsd, http://www.springframework.org/schema/jee/spring-jee-3.0.xsd=org/springframework/ejb/config/spring-jee-3.0.xsd, https://www.springframework.org/schema/context/spring-context-2.5.xsd=org/springframework/context/config/spring-context-2.5.xsd, https://www.springframework.org/schema/lang/spring-lang-2.5.xsd=org/springframework/scripting/config/spring-lang-2.5.xsd, https://www.springframework.org/schema/tx/spring-tx-4.1.xsd=org/springframework/transaction/config/spring-tx-4.1.xsd, https://www.springframework.org/schema/task/spring-task-4.1.xsd=org/springframework/scheduling/config/spring-task-4.1.xsd, http://www.springframework.org/schema/aop/spring-aop-4.1.xsd=org/springframework/aop/config/spring-aop-4.1.xsd, http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd=org/springframework/jdbc/config/spring-jdbc-4.3.xsd, https://www.springframework.org/schema/aop/spring-aop-4.3.xsd=org/springframework/aop/config/spring-aop-4.3.xsd, https://www.springframework.org/schema/jee/spring-jee-2.5.xsd=org/springframework/ejb/config/spring-jee-2.5.xsd, https://www.springframework.org/schema/lang/spring-lang-4.1.xsd=org/springframework/scripting/config/spring-lang-4.1.xsd, http://www.springframework.org/schema/jee/spring-jee-4.3.xsd=org/springframework/ejb/config/spring-jee-4.3.xsd, http://www.springframework.org/schema/lang/spring-lang-2.5.xsd=org/springframework/scripting/config/spring-lang-2.5.xsd, https://www.springframework.org/schema/beans/spring-beans.xsd=org/springframework/beans/factory/xml/spring-beans-4.3.xsd, https://www.springframework.org/schema/tx/spring-tx.xsd=org/springframework/transaction/config/spring-tx-4.3.xsd, https://www.springframework.org/schema/tx/spring-tx-3.1.xsd=org/springframework/transaction/config/spring-tx-3.1.xsd, https://www.springframework.org/schema/task/spring-task-3.1.xsd=org/springframework/scheduling/config/spring-task-3.1.xsd, http://www.springframework.org/schema/aop/spring-aop-3.1.xsd=org/springframework/aop/config/spring-aop-3.1.xsd, http://www.springframework.org/schema/task/spring-task-4.1.xsd=org/springframework/scheduling/config/spring-task-4.1.xsd, http://www.springframework.org/schema/context/spring-context-3.0.xsd=org/springframework/context/config/spring-context-3.0.xsd, http://www.springframework.org/schema/context/spring-context-4.0.xsd=org/springframework/context/config/spring-context-4.0.xsd, https://www.springframework.org/schema/context/spring-context-3.1.xsd=org/springframework/context/config/spring-context-3.1.xsd, https://www.springframework.org/schema/lang/spring-lang-3.1.xsd=org/springframework/scripting/config/spring-lang-3.1.xsd, https://www.springframework.org/schema/util/spring-util-4.2.xsd=org/springframework/beans/factory/xml/spring-util-4.2.xsd, https://www.springframework.org/schema/context/spring-context-4.1.xsd=org/springframework/context/config/spring-context-4.1.xsd, http://www.springframework.org/schema/lang/spring-lang-4.1.xsd=org/springframework/scripting/config/spring-lang-4.1.xsd, https://www.springframework.org/schema/tool/spring-tool-4.2.xsd=org/springframework/beans/factory/xml/spring-tool-4.2.xsd, http://www.springframework.org/schema/tx/spring-tx-2.5.xsd=org/springframework/transaction/config/spring-tx-2.5.xsd, https://www.springframework.org/schema/cache/spring-cache-4.0.xsd=org/springframework/cache/config/spring-cache-4.0.xsd, http://www.springframework.org/schema/beans/spring-beans-2.5.xsd=org/springframework/beans/factory/xml/spring-beans-2.5.xsd, https://www.springframework.org/schema/beans/spring-beans-3.0.xsd=org/springframework/beans/factory/xml/spring-beans-3.0.xsd, http://www.springframework.org/schema/task/spring-task-3.1.xsd=org/springframework/scheduling/config/spring-task-3.1.xsd, https://www.springframework.org/schema/beans/spring-beans-4.0.xsd=org/springframework/beans/factory/xml/spring-beans-4.0.xsd, http://www.springframework.org/schema/cache/spring-cache-3.1.xsd=org/springframework/cache/config/spring-cache-3.1.xsd, http://www.springframework.org/schema/tx/spring-tx-3.1.xsd=org/springframework/transaction/config/spring-tx-3.1.xsd, https://www.springframework.org/schema/jee/spring-jee-3.1.xsd=org/springframework/ejb/config/spring-jee-3.1.xsd, https://www.springframework.org/schema/util/spring-util-3.2.xsd=org/springframework/beans/factory/xml/spring-util-3.2.xsd, http://www.springframework.org/schema/lang/spring-lang-3.1.xsd=org/springframework/scripting/config/spring-lang-3.1.xsd, http://www.springframework.org/schema/cache/spring-cache-4.1.xsd=org/springframework/cache/config/spring-cache-4.1.xsd, http://www.springframework.org/schema/util/spring-util-4.2.xsd=org/springframework/beans/factory/xml/spring-util-4.2.xsd, https://www.springframework.org/schema/tool/spring-tool-3.2.xsd=org/springframework/beans/factory/xml/spring-tool-3.2.xsd, http://www.springframework.org/schema/tx/spring-tx-4.1.xsd=org/springframework/transaction/config/spring-tx-4.1.xsd, https://www.springframework.org/schema/jee/spring-jee-4.1.xsd=org/springframework/ejb/config/spring-jee-4.1.xsd, http://www.springframework.org/schema/tool/spring-tool-4.2.xsd=org/springframework/beans/factory/xml/spring-tool-4.2.xsd, http://www.springframework.org/schema/beans/spring-beans-3.1.xsd=org/springframework/beans/factory/xml/spring-beans-3.1.xsd, https://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd=org/springframework/jdbc/config/spring-jdbc-3.2.xsd, http://www.springframework.org/schema/beans/spring-beans-4.1.xsd=org/springframework/beans/factory/xml/spring-beans-4.1.xsd, https://www.springframework.org/schema/beans/spring-beans-2.0.xsd=org/springframework/beans/factory/xml/spring-beans-2.0.xsd, https://www.springframework.org/schema/jdbc/spring-jdbc-4.2.xsd=org/springframework/jdbc/config/spring-jdbc-4.2.xsd, http://www.springframework.org/schema/context/spring-context-4.3.xsd=org/springframework/context/config/spring-context-4.3.xsd, http://www.springframework.org/schema/util/spring-util-3.2.xsd=org/springframework/beans/factory/xml/spring-util-3.2.xsd, http://www.springframework.org/schema/tool/spring-tool-3.2.xsd=org/springframework/beans/factory/xml/spring-tool-3.2.xsd, https://www.springframework.org/schema/tx/spring-tx-4.0.xsd=org/springframework/transaction/config/spring-tx-4.0.xsd, https://www.springframework.org/schema/task/spring-task.xsd=org/springframework/scheduling/config/spring-task-4.3.xsd, http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd=org/springframework/jdbc/config/spring-jdbc-3.2.xsd, https://www.springframework.org/schema/task/spring-task-4.0.xsd=org/springframework/scheduling/config/spring-task-4.0.xsd, http://www.springframework.org/schema/aop/spring-aop-4.0.xsd=org/springframework/aop/config/spring-aop-4.0.xsd, https://www.springframework.org/schema/cache/spring-cache-4.3.xsd=org/springframework/cache/config/spring-cache-4.3.xsd, https://www.springframework.org/schema/aop/spring-aop-3.2.xsd=org/springframework/aop/config/spring-aop-3.2.xsd, http://www.springframework.org/schema/jdbc/spring-jdbc-4.2.xsd=org/springframework/jdbc/config/spring-jdbc-4.2.xsd, https://www.springframework.org/schema/aop/spring-aop-4.2.xsd=org/springframework/aop/config/spring-aop-4.2.xsd, https://www.springframework.org/schema/beans/spring-beans-4.3.xsd=org/springframework/beans/factory/xml/spring-beans-4.3.xsd, http://mybatis.org/schema/mybatis-spring.xsd=org/mybatis/spring/config/mybatis-spring-1.2.xsd, https://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-4.3.xsd, https://www.springframework.org/schema/lang/spring-lang-4.0.xsd=org/springframework/scripting/config/spring-lang-4.0.xsd, http://www.springframework.org/schema/jee/spring-jee-4.2.xsd=org/springframework/ejb/config/spring-jee-4.2.xsd, https://www.springframework.org/schema/util/spring-util-2.5.xsd=org/springframework/beans/factory/xml/spring-util-2.5.xsd, https://www.springframework.org/schema/tool/spring-tool-2.5.xsd=org/springframework/beans/factory/xml/spring-tool-2.5.xsd, https://www.springframework.org/schema/tx/spring-tx-2.0.xsd=org/springframework/transaction/config/spring-tx-2.0.xsd, http://www.springframework.org/schema/aop/spring-aop-2.0.xsd=org/springframework/aop/config/spring-aop-2.0.xsd, https://www.springframework.org/schema/tx/spring-tx-3.0.xsd=org/springframework/transaction/config/spring-tx-3.0.xsd, https://www.springframework.org/schema/task/spring-task-3.0.xsd=org/springframework/scheduling/config/spring-task-3.0.xsd, http://www.springframework.org/schema/aop/spring-aop-3.0.xsd=org/springframework/aop/config/spring-aop-3.0.xsd, http://www.springframework.org/schema/task/spring-task-4.0.xsd=org/springframework/scheduling/config/spring-task-4.0.xsd, http://www.springframework.org/schema/jee/spring-jee.xsd=org/springframework/ejb/config/spring-jee-4.3.xsd, http://www.springframework.org/schema/cache/spring-cache.xsd=org/springframework/cache/config/spring-cache-4.3.xsd, https://www.springframework.org/schema/lang/spring-lang-2.0.xsd=org/springframework/scripting/config/spring-lang-2.0.xsd, https://www.springframework.org/schema/context/spring-context-3.0.xsd=org/springframework/context/config/spring-context-3.0.xsd, http://www.springframework.org/schema/task/spring-task.xsd=org/springframework/scheduling/config/spring-task-4.3.xsd, http://www.springframework.org/schema/aop/spring-aop.xsd=org/springframework/aop/config/spring-aop-4.3.xsd, https://www.springframework.org/schema/lang/spring-lang-3.0.xsd=org/springframework/scripting/config/spring-lang-3.0.xsd, https://www.springframework.org/schema/util/spring-util-4.1.xsd=org/springframework/beans/factory/xml/spring-util-4.1.xsd, http://www.springframework.org/schema/lang/spring-lang-4.0.xsd=org/springframework/scripting/config/spring-lang-4.0.xsd, http://www.springframework.org/schema/jee/spring-jee-3.2.xsd=org/springframework/ejb/config/spring-jee-3.2.xsd, https://www.springframework.org/schema/context/spring-context-4.0.xsd=org/springframework/context/config/spring-context-4.0.xsd, https://www.springframework.org/schema/tool/spring-tool-4.1.xsd=org/springframework/beans/factory/xml/spring-tool-4.1.xsd, http://www.springframework.org/schema/util/spring-util-2.5.xsd=org/springframework/beans/factory/xml/spring-util-2.5.xsd, http://www.springframework.org/schema/tool/spring-tool-2.5.xsd=org/springframework/beans/factory/xml/spring-tool-2.5.xsd, https://www.springframework.org/schema/tool/spring-tool.xsd=org/springframework/beans/factory/xml/spring-tool-4.3.xsd}
19:04:20.370 [main] DEBUG o.s.b.f.xml.PluggableSchemaResolver - Found XML schema [http://www.springframework.org/schema/beans/spring-beans-3.0.xsd] in classpath: org/springframework/beans/factory/xml/spring-beans-3.0.xsd
19:04:20.612 [main] DEBUG o.s.b.f.x.DefaultBeanDefinitionDocumentReader - Loading bean definitions
19:04:20.669 [main] DEBUG o.s.b.f.xml.XmlBeanDefinitionReader - Loaded 1 bean definitions from location pattern [spring-config.xml]
19:04:20.669 [main] DEBUG o.s.c.s.ClassPathXmlApplicationContext - Bean factory for org.springframework.context.support.ClassPathXmlApplicationContext@7921b0a2: org.springframework.beans.factory.support.DefaultListableBeanFactory@33c7e1bb: defining beans [userDao]; root of factory hierarchy
19:04:20.747 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'userDao'
19:04:20.747 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating instance of bean 'userDao'
19:04:20.829 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Eagerly caching bean 'userDao' to allow for resolving potential circular references
19:04:21.004 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Finished creating instance of bean 'userDao'
19:04:21.013 [main] INFO o.s.b.f.s.DefaultListableBeanFactory - Overriding bean definition for bean 'userDao' with a different definition: replacing [Generic bean: class [org.itstack.demo.design.agent.RegisterBeanFactory]; scope=; abstract=false; lazyInit=false; autowireMode=1; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [spring-config.xml]] with [Generic bean: class [org.itstack.demo.design.agent.MapperFactoryBean]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]
19:04:21.017 [main] DEBUG o.s.c.s.ClassPathXmlApplicationContext - Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@530612ba]
19:04:21.031 [main] DEBUG o.s.c.s.ClassPathXmlApplicationContext - Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframework.context.event.SimpleApplicationEventMulticaster@2f490758]
19:04:21.033 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@33c7e1bb: defining beans [userDao]; root of factory hierarchy
19:04:21.033 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'userDao'
19:04:21.033 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating instance of bean 'userDao'
19:04:21.121 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Eagerly caching bean 'userDao' to allow for resolving potential circular references
19:04:21.122 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Finished creating instance of bean 'userDao'
19:04:21.123 [main] DEBUG o.s.c.s.ClassPathXmlApplicationContext - Unable to locate LifecycleProcessor with name 'lifecycleProcessor': using default [org.springframework.context.support.DefaultLifecycleProcessor@3d3fcdb0]
19:04:21.124 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'lifecycleProcessor'
19:04:21.139 [main] DEBUG o.s.c.e.PropertySourcesPropertyResolver - Could not find key 'spring.liveBeansView.mbeanDomain' in any property source
19:04:21.141 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'userDao'
19:04:21.195 [main] INFO o.i.d.design.agent.MapperFactoryBean - SQL:select userName from user where id = 100001
19:04:21.196 [main] INFO org.itstack.demo.design.test.ApiTest - 测试结果:100001,小傅哥,bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
- 从测试结果来看,我们打印了sql语句,这部分语句是从自定义注解中获取的
select userName from user where id = 100001
,我们做了简单的适配。在mybatis框架中会交给SqlSession
来进行逻辑处理返回数据库中的查询数据。 - 而这里我们的测试结果是固定的,如果你愿意更加深入的研究可以尝试与数据库操作层进行关联,让这个框架更加完善。
总结
- 关于这部分代理模式的讲解我们采用了开发一个关于
mybatis-spring
中间件的核心功能来体现代理模式的强大之处,所以涉及到一些关于代理类的创建以及spring中bean的注册这些知识点,可能在平常的业务开发中都是很少用到的,但是在中间件开发中确实非常常见。 - 代理模式除了在中间件的开发外还可以是对服务的包装,物联网组件等等,让复杂的各项服务变为轻量级调用、缓存调用。
- 代理模式可以让代码变得更加简洁,干净而且易于维护,虽然这部分开发中增加了很多类和自己除了bean的注册等,但是这样的中间件复用性极高也更加智能,可以非常方便的扩展到各个服务应用中。
评论区