├── README.md ├── itstack-demo-code-idea ├── pom.xml └── src │ ├── main │ ├── java │ │ └── org │ │ │ └── itstack │ │ │ └── demo │ │ │ └── JetbrainsCrack.java │ └── resources │ │ └── META-INF │ │ └── MANIFEST.MF │ └── test │ └── java │ ├── com │ └── jetbrains │ │ └── ls │ │ └── newLicenses │ │ └── DecodeCertificates.java │ └── org │ └── itstack │ └── demo │ └── test │ └── ApiTest.java ├── itstack-demo-code-mybatis ├── pom.xml └── src │ ├── main │ ├── java │ │ └── org │ │ │ └── itstack │ │ │ └── demo │ │ │ ├── dao │ │ │ ├── ISchoolDao.java │ │ │ └── IUserDao.java │ │ │ ├── like │ │ │ ├── mybatis │ │ │ │ ├── Configuration.java │ │ │ │ ├── DefaultSqlSession.java │ │ │ │ ├── DefaultSqlSessionFactory.java │ │ │ │ ├── Resources.java │ │ │ │ ├── SqlSession.java │ │ │ │ ├── SqlSessionFactory.java │ │ │ │ ├── SqlSessionFactoryBuilder.java │ │ │ │ └── XNode.java │ │ │ └── spring │ │ │ │ ├── MapperFactoryBean.java │ │ │ │ ├── MapperScannerConfigurer.java │ │ │ │ ├── SimpleMetadataReader.java │ │ │ │ └── SqlSessionFactoryBean.java │ │ │ ├── po │ │ │ ├── School.java │ │ │ └── User.java │ │ │ └── service │ │ │ └── UserService.java │ └── resources │ │ ├── logback.xml │ │ ├── mapper │ │ ├── School_Mapper.xml │ │ └── User_Mapper.xml │ │ ├── mybatis-config.xml │ │ ├── props │ │ └── jdbc.properties │ │ ├── spring-config.xml │ │ ├── spring │ │ ├── mybatis-config-datasource.xml │ │ └── spring-config-datasource.xml │ │ └── test-config.xml │ └── test │ └── java │ └── org │ └── itstack │ └── demo │ ├── ApiLikeTest.java │ ├── ApiTest.java │ ├── MybatisApiTest.java │ ├── SpringApiTest.java │ └── SpringTest.java ├── itstack-demo-code-proxy ├── pom.xml └── src │ ├── main │ └── java │ │ └── org │ │ └── itstack │ │ └── demo │ │ ├── proxy │ │ ├── cglib │ │ │ └── CglibProxy.java │ │ └── jdk │ │ │ ├── reflect │ │ │ ├── JDKInvocationHandler.java │ │ │ └── JDKProxy.java │ │ │ └── util │ │ │ └── ClassLoaderUtils.java │ │ └── service │ │ ├── IUserService.java │ │ └── UserService.java │ └── test │ └── java │ └── org │ └── itstack │ └── demo │ └── test │ └── ApiTest.java ├── itstack-demo-code-schedule ├── pom.xml └── src │ ├── main │ ├── java │ │ └── org │ │ │ └── itstack │ │ │ └── demo │ │ │ ├── DemoTask.java │ │ │ └── JobImpl.java │ └── resources │ │ ├── logback.xml │ │ ├── props │ │ └── config.properties │ │ ├── spring-config.xml │ │ └── spring │ │ └── spring-config-schedule-task.xml │ └── test │ └── java │ └── org │ └── itstack │ └── demo │ └── test │ ├── ApiTest.java │ ├── MyQuartz.java │ ├── MyTask.java │ └── TestCronExpression.java ├── itstack-demo-code-spring ├── pom.xml └── src │ ├── main │ ├── java │ │ └── org │ │ │ └── itstack │ │ │ └── demo │ │ │ ├── IUserDao.java │ │ │ ├── UserService.java │ │ │ └── bean │ │ │ ├── ProxyBeanFactory.java │ │ │ └── RegisterBeanFactory.java │ └── resources │ │ └── spring-config.xml │ └── test │ └── java │ └── org │ └── itstack │ └── demo │ └── test │ └── ApiTest.java └── pom.xml /README.md: -------------------------------------------------------------------------------- 1 | # itstack-demo-code 源码分析 2 | 3 | ## 目录 4 | 5 | - [源码分析 | Spring定时任务Quartz执行全过程源码解读](https://bugstack.cn/itstack-demo-any/2020/01/01/%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-Spring%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1Quartz%E6%89%A7%E8%A1%8C%E5%85%A8%E8%BF%87%E7%A8%8B%E6%BA%90%E7%A0%81%E8%A7%A3%E8%AF%BB.html) 6 | - [源码分析 | Mybatis接口没有实现类为什么可以执行增删改查](https://bugstack.cn/itstack-demo-any/2019/12/25/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-Mybatis%E6%8E%A5%E5%8F%A3%E6%B2%A1%E6%9C%89%E5%AE%9E%E7%8E%B0%E7%B1%BB%E4%B8%BA%E4%BB%80%E4%B9%88%E5%8F%AF%E4%BB%A5%E6%89%A7%E8%A1%8C%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5.html) 7 | - [源码分析 | 咋嘞?你的IDEA过期了吧!加个Jar包就破解了,为什么?](https://bugstack.cn/itstack-demo-any/2020/01/06/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-%E5%92%8B%E5%98%9E-%E4%BD%A0%E7%9A%84IDEA%E8%BF%87%E6%9C%9F%E4%BA%86%E5%90%A7-%E5%8A%A0%E4%B8%AAJar%E5%8C%85%E5%B0%B1%E7%A0%B4%E8%A7%A3%E4%BA%86-%E4%B8%BA%E4%BB%80%E4%B9%88.html) 8 | - [源码分析 | 像盗墓一样分析Spring是怎么初始化xml并注册bean的](https://bugstack.cn/itstack-demo-any/2020/01/08/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-%E5%83%8F%E7%9B%97%E5%A2%93%E4%B8%80%E6%A0%B7%E5%88%86%E6%9E%90Spring%E6%98%AF%E6%80%8E%E4%B9%88%E5%88%9D%E5%A7%8B%E5%8C%96xml%E5%B9%B6%E6%B3%A8%E5%86%8Cbean%E7%9A%84.html) 9 | - [源码分析 | 基于jdbc实现一个Demo版的Mybatis](https://bugstack.cn/itstack-demo-any/2020/01/13/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-%E5%9F%BA%E4%BA%8Ejdbc%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AADemo%E7%89%88%E7%9A%84Mybatis.html) 10 | -------------------------------------------------------------------------------- /itstack-demo-code-idea/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | itstack-demo-code 7 | org.itstack.demo 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | itstack-demo-code-idea 13 | 1.0-SNAPSHOT 14 | 15 | 16 | 17 | 18 | -Xms512m -Xmx512m 19 | false 20 | true 21 | utf-8 22 | true 23 | 24 | src/main/resources/META-INF/MANIFEST.MF 25 | 26 | 3.3.1 27 | 2.2 28 | 1.7.7 29 | 1.0.9 30 | 1.2.62 31 | 32 | 33 | 34 | 35 | 36 | asm 37 | asm-all 38 | ${asm-all.version} 39 | 40 | 41 | 42 | commons-io 43 | commons-io 44 | ${commons-io.version} 45 | 46 | 47 | 48 | org.slf4j 49 | slf4j-api 50 | ${slf4j-api.version} 51 | 52 | 53 | ch.qos.logback 54 | logback-classic 55 | ${logback-classic.version} 56 | 57 | 58 | slf4j-api 59 | org.slf4j 60 | 61 | 62 | 63 | 64 | 65 | com.alibaba 66 | fastjson 67 | ${fastjson.version} 68 | 69 | 70 | 71 | 72 | src/main/java 73 | 74 | 75 | src/main/resources 76 | true 77 | 78 | **/** 79 | 80 | 81 | 82 | src/test/java 83 | 84 | 85 | src/test/resources 86 | true 87 | 88 | **/** 89 | 90 | 91 | 92 | 93 | 94 | 95 | org.apache.maven.plugins 96 | maven-shade-plugin 97 | 98 | 99 | package 100 | 101 | shade 102 | 103 | 104 | 105 | 106 | 107 | 108 | asm:asm-all:jar: 109 | 110 | 111 | 112 | 113 | 114 | 115 | org.apache.maven.plugins 116 | maven-jar-plugin 117 | 2.4 118 | 119 | 120 | ${maven.configuration.manifestFile} 121 | 122 | 123 | 124 | 125 | org.apache.maven.plugins 126 | maven-resources-plugin 127 | 2.5 128 | 129 | ${project.build.sourceEncoding} 130 | 131 | 132 | 133 | org.apache.maven.plugins 134 | maven-compiler-plugin 135 | 2.3.2 136 | 137 | 1.8 138 | 1.8 139 | ${project.build.sourceEncoding} 140 | 141 | 142 | 143 | org.apache.maven.plugins 144 | maven-source-plugin 145 | 2.1.2 146 | 147 | 148 | attach-sources 149 | 150 | jar 151 | 152 | 153 | 154 | 155 | 156 | 157 | -------------------------------------------------------------------------------- /itstack-demo-code-idea/src/main/java/org/itstack/demo/JetbrainsCrack.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo; 2 | 3 | import org.objectweb.asm.ClassReader; 4 | import org.objectweb.asm.ClassWriter; 5 | import org.objectweb.asm.Opcodes; 6 | import org.objectweb.asm.tree.*; 7 | import org.slf4j.Logger; 8 | import org.slf4j.LoggerFactory; 9 | 10 | import java.io.File; 11 | import java.io.FileOutputStream; 12 | import java.io.IOException; 13 | import java.lang.instrument.ClassFileTransformer; 14 | import java.lang.instrument.IllegalClassFormatException; 15 | import java.lang.instrument.Instrumentation; 16 | import java.security.ProtectionDomain; 17 | import java.util.List; 18 | 19 | /** 20 | * 博客:http://bugstack.cn 21 | * 公众号:bugstack虫洞栈 | 更多原处优质干货 22 | * Agent 类,所有程序启动只要配置了 -javaagent: 都会走到 premain 方法 23 | */ 24 | public class JetbrainsCrack { 25 | 26 | public static void premain(String args, Instrumentation inst) { 27 | System.out.println("**************************************"); 28 | System.out.println("* 公众号:bugstack虫洞栈 *"); 29 | System.out.println("* 博客:https://bugstack.cn *"); 30 | System.out.println("* 你用剑,我用刀,好的代码都很烧! *"); 31 | System.out.println("**************************************"); 32 | inst.addTransformer(new MethodEntryTransformer()); 33 | } 34 | 35 | static class MethodEntryTransformer implements ClassFileTransformer { 36 | 37 | private Logger logger = LoggerFactory.getLogger(MethodEntryTransformer.class); 38 | 39 | public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { 40 | 41 | try { 42 | if (className.equals("com/jetbrains/ls/newLicenses/DecodeCertificates")) { 43 | ClassReader cr = new ClassReader(classfileBuffer); 44 | ClassNode cn = new ClassNode(); 45 | cr.accept(cn, 0); 46 | List methodNodes = cn.methods; 47 | for (MethodNode methodNode : methodNodes) { 48 | if ("decodeLicense".equals(methodNode.name)) { 49 | InsnList insns = methodNode.instructions; 50 | //清除指令 51 | insns.clear(); 52 | insns.add(new VarInsnNode(Opcodes.ALOAD, 1)); // 将本地指定的引用存入栈中 53 | insns.add(new InsnNode(Opcodes.ARETURN)); // 从方法中返回引用类型的数据 54 | // 访问结束 55 | methodNode.visitEnd(); 56 | ClassWriter cw = new ClassWriter(0); 57 | cn.accept(cw); 58 | byte[] bytes = cw.toByteArray(); 59 | // 输出字节码到Class 60 | this.outputClazz(bytes); 61 | // 返回最新字节码 62 | return cw.toByteArray(); 63 | } 64 | } 65 | } 66 | } catch (Exception e) { 67 | return classfileBuffer; 68 | } 69 | 70 | return classfileBuffer; 71 | } 72 | 73 | private void outputClazz(byte[] bytes) { 74 | // 输出类字节码 75 | FileOutputStream out = null; 76 | try { 77 | out = new FileOutputStream("ASMDecodeCertificates.class"); 78 | logger.info("ASM类输出路径:{}", (new File("")).getAbsolutePath()); 79 | out.write(bytes); 80 | } catch (Exception e) { 81 | e.printStackTrace(); 82 | } finally { 83 | if (null != out) try { 84 | out.close(); 85 | } catch (IOException e) { 86 | e.printStackTrace(); 87 | } 88 | } 89 | } 90 | 91 | } 92 | 93 | } 94 | -------------------------------------------------------------------------------- /itstack-demo-code-idea/src/main/resources/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Premain-Class: org.itstack.demo.JetbrainsCrack 3 | Can-Redefine-Classes: true 4 | -------------------------------------------------------------------------------- /itstack-demo-code-idea/src/test/java/com/jetbrains/ls/newLicenses/DecodeCertificates.java: -------------------------------------------------------------------------------- 1 | package com.jetbrains.ls.newLicenses; 2 | 3 | /** 4 | * 博客:http://bugstack.cn 5 | * 公众号:bugstack虫洞栈 | 更多原处优质干货 6 | * 模拟 ideaIU-15.0.1 软件授权码校验类 7 | */ 8 | public class DecodeCertificates { 9 | 10 | public String decodeLicense(String usingKey) { 11 | // 模拟校验授权码 12 | return "usingKey is error:"+ usingKey; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /itstack-demo-code-idea/src/test/java/org/itstack/demo/test/ApiTest.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.test; 2 | 3 | import com.jetbrains.ls.newLicenses.DecodeCertificates; 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | 7 | /** 8 | * 博客:http://bugstack.cn 9 | * 公众号:bugstack虫洞栈 | 更多原处优质干货 10 | * 测试类配置 VM 参数 11 | * Idea VM options:-javaagent:E:\itstack\GIT\itstack.org\itstack-demo-code\itstack-demo-code-idea\target\itstack-demo-code-idea-1.0-SNAPSHOT.jar 12 | */ 13 | public class ApiTest { 14 | 15 | private static Logger logger = LoggerFactory.getLogger(ApiTest.class); 16 | 17 | public static void main(String[] args) throws Exception { 18 | DecodeCertificates decodeCertificates = new DecodeCertificates(); 19 | // 模拟usingKey:认购有效期至2089年7月8日 20 | String license = decodeCertificates.decodeLicense("Subscription is active until July 8, 2089"); 21 | logger.info("测试结果:{}", license); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | itstack-demo-code 7 | org.itstack.demo 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | itstack-demo-code-mybatis 13 | 14 | 15 | 16 | 17 | dom4j 18 | dom4j 19 | 1.6.1 20 | 21 | 22 | 23 | jaxen 24 | jaxen 25 | 1.1.6 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/java/org/itstack/demo/dao/ISchoolDao.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.dao; 2 | 3 | import org.itstack.demo.po.School; 4 | 5 | public interface ISchoolDao { 6 | 7 | School querySchoolInfoById(Long treeId); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/java/org/itstack/demo/dao/IUserDao.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.dao; 2 | 3 | import org.itstack.demo.po.User; 4 | 5 | public interface IUserDao { 6 | 7 | User queryUserInfoById(Long id); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/java/org/itstack/demo/like/mybatis/Configuration.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.like.mybatis; 2 | 3 | import java.sql.Connection; 4 | import java.util.Map; 5 | 6 | 7 | /** 8 | * 公众号 | bugstack虫洞栈 9 | * 博 客 | https://bugstack.cn 10 | * Create by 小傅哥 @2020 11 | */ 12 | public class Configuration { 13 | 14 | protected Connection connection; 15 | protected Map dataSource; 16 | protected Map mapperElement; 17 | 18 | public void setConnection(Connection connection) { 19 | this.connection = connection; 20 | } 21 | 22 | public void setDataSource(Map dataSource) { 23 | this.dataSource = dataSource; 24 | } 25 | 26 | public void setMapperElement(Map mapperElement) { 27 | this.mapperElement = mapperElement; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/java/org/itstack/demo/like/mybatis/DefaultSqlSession.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.like.mybatis; 2 | 3 | import java.lang.reflect.Field; 4 | import java.lang.reflect.Method; 5 | import java.sql.*; 6 | import java.util.Date; 7 | import java.util.*; 8 | 9 | 10 | /** 11 | * 公众号 | bugstack虫洞栈 12 | * 博 客 | https://bugstack.cn 13 | * Create by 小傅哥 @2020 14 | */ 15 | public class DefaultSqlSession implements SqlSession { 16 | 17 | private Connection connection; 18 | private Map mapperElement; 19 | 20 | public DefaultSqlSession(Connection connection, Map mapperElement) { 21 | this.connection = connection; 22 | this.mapperElement = mapperElement; 23 | } 24 | 25 | @Override 26 | public T selectOne(String statement) { 27 | try { 28 | XNode xNode = mapperElement.get(statement); 29 | PreparedStatement preparedStatement = connection.prepareStatement(xNode.getSql()); 30 | ResultSet resultSet = preparedStatement.executeQuery(); 31 | List objects = resultSet2Obj(resultSet, Class.forName(xNode.getResultType())); 32 | return objects.get(0); 33 | } catch (Exception e) { 34 | e.printStackTrace(); 35 | } 36 | return null; 37 | } 38 | 39 | @Override 40 | public T selectOne(String statement, Object parameter) { 41 | XNode xNode = mapperElement.get(statement); 42 | Map parameterMap = xNode.getParameter(); 43 | try { 44 | PreparedStatement preparedStatement = connection.prepareStatement(xNode.getSql()); 45 | buildParameter(preparedStatement, parameter, parameterMap); 46 | ResultSet resultSet = preparedStatement.executeQuery(); 47 | List objects = resultSet2Obj(resultSet, Class.forName(xNode.getResultType())); 48 | return objects.get(0); 49 | } catch (Exception e) { 50 | e.printStackTrace(); 51 | } 52 | return null; 53 | } 54 | 55 | @Override 56 | public List selectList(String statement) { 57 | XNode xNode = mapperElement.get(statement); 58 | try { 59 | PreparedStatement preparedStatement = connection.prepareStatement(xNode.getSql()); 60 | ResultSet resultSet = preparedStatement.executeQuery(); 61 | return resultSet2Obj(resultSet, Class.forName(xNode.getResultType())); 62 | } catch (Exception e) { 63 | e.printStackTrace(); 64 | } 65 | return null; 66 | } 67 | 68 | @Override 69 | public List selectList(String statement, Object parameter) { 70 | XNode xNode = mapperElement.get(statement); 71 | Map parameterMap = xNode.getParameter(); 72 | try { 73 | PreparedStatement preparedStatement = connection.prepareStatement(xNode.getSql()); 74 | buildParameter(preparedStatement, parameter, parameterMap); 75 | ResultSet resultSet = preparedStatement.executeQuery(); 76 | return resultSet2Obj(resultSet, Class.forName(xNode.getResultType())); 77 | } catch (Exception e) { 78 | e.printStackTrace(); 79 | } 80 | return null; 81 | } 82 | 83 | private void buildParameter(PreparedStatement preparedStatement, Object parameter, Map parameterMap) throws SQLException, IllegalAccessException { 84 | 85 | int size = parameterMap.size(); 86 | // 单个参数 87 | if (parameter instanceof Long) { 88 | for (int i = 1; i <= size; i++) { 89 | preparedStatement.setLong(i, Long.parseLong(parameter.toString())); 90 | } 91 | return; 92 | } 93 | 94 | if (parameter instanceof Integer) { 95 | for (int i = 1; i <= size; i++) { 96 | preparedStatement.setInt(i, Integer.parseInt(parameter.toString())); 97 | } 98 | return; 99 | } 100 | 101 | if (parameter instanceof String) { 102 | for (int i = 1; i <= size; i++) { 103 | preparedStatement.setString(i, parameter.toString()); 104 | } 105 | return; 106 | } 107 | 108 | Map fieldMap = new HashMap<>(); 109 | // 对象参数 110 | Field[] declaredFields = parameter.getClass().getDeclaredFields(); 111 | for (Field field : declaredFields) { 112 | String name = field.getName(); 113 | field.setAccessible(true); 114 | Object obj = field.get(parameter); 115 | field.setAccessible(false); 116 | fieldMap.put(name, obj); 117 | } 118 | 119 | for (int i = 1; i <= size; i++) { 120 | String parameterDefine = parameterMap.get(i); 121 | Object obj = fieldMap.get(parameterDefine); 122 | 123 | if (obj instanceof Short) { 124 | preparedStatement.setShort(i, Short.parseShort(obj.toString())); 125 | continue; 126 | } 127 | 128 | if (obj instanceof Integer) { 129 | preparedStatement.setInt(i, Integer.parseInt(obj.toString())); 130 | continue; 131 | } 132 | 133 | if (obj instanceof Long) { 134 | preparedStatement.setLong(i, Long.parseLong(obj.toString())); 135 | continue; 136 | } 137 | 138 | if (obj instanceof String) { 139 | preparedStatement.setString(i, obj.toString()); 140 | continue; 141 | } 142 | 143 | if (obj instanceof Date) { 144 | preparedStatement.setDate(i, (java.sql.Date) obj); 145 | } 146 | 147 | } 148 | 149 | } 150 | 151 | private List resultSet2Obj(ResultSet resultSet, Class clazz) { 152 | List list = new ArrayList<>(); 153 | try { 154 | ResultSetMetaData metaData = resultSet.getMetaData(); 155 | int columnCount = metaData.getColumnCount(); 156 | // 每次遍历行值 157 | while (resultSet.next()) { 158 | T obj = (T) clazz.newInstance(); 159 | for (int i = 1; i <= columnCount; i++) { 160 | Object value = resultSet.getObject(i); 161 | String columnName = metaData.getColumnName(i); 162 | String setMethod = "set" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1); 163 | Method method; 164 | if (value instanceof Timestamp) { 165 | method = clazz.getMethod(setMethod, Date.class); 166 | } else { 167 | method = clazz.getMethod(setMethod, value.getClass()); 168 | } 169 | method.invoke(obj, value); 170 | } 171 | list.add(obj); 172 | } 173 | } catch (Exception e) { 174 | e.printStackTrace(); 175 | } 176 | return list; 177 | } 178 | 179 | @Override 180 | public void close() { 181 | if (null == connection) return; 182 | try { 183 | connection.close(); 184 | } catch (SQLException e) { 185 | e.printStackTrace(); 186 | } 187 | } 188 | } 189 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/java/org/itstack/demo/like/mybatis/DefaultSqlSessionFactory.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.like.mybatis; 2 | 3 | /** 4 | * 公众号 | bugstack虫洞栈 5 | * 博 客 | https://bugstack.cn 6 | * Create by 小傅哥 @2020 7 | */ 8 | public class DefaultSqlSessionFactory implements SqlSessionFactory { 9 | 10 | private final Configuration configuration; 11 | 12 | public DefaultSqlSessionFactory(Configuration configuration) { 13 | this.configuration = configuration; 14 | } 15 | 16 | @Override 17 | public SqlSession openSession() { 18 | return new DefaultSqlSession(configuration.connection, configuration.mapperElement); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/java/org/itstack/demo/like/mybatis/Resources.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.like.mybatis; 2 | 3 | import java.io.IOException; 4 | import java.io.InputStream; 5 | import java.io.InputStreamReader; 6 | import java.io.Reader; 7 | 8 | /** 9 | * 公众号 | bugstack虫洞栈 10 | * 博 客 | https://bugstack.cn 11 | * Create by 小傅哥 @2020 12 | */ 13 | public class Resources { 14 | 15 | public static Reader getResourceAsReader(String resource) throws IOException { 16 | return new InputStreamReader(getResourceAsStream(resource)); 17 | } 18 | 19 | private static InputStream getResourceAsStream(String resource) throws IOException { 20 | ClassLoader[] classLoaders = getClassLoaders(); 21 | for (ClassLoader classLoader : classLoaders) { 22 | InputStream inputStream = classLoader.getResourceAsStream(resource); 23 | if (null != inputStream) { 24 | return inputStream; 25 | } 26 | } 27 | throw new IOException("Could not find resource " + resource); 28 | } 29 | 30 | private static ClassLoader[] getClassLoaders() { 31 | return new ClassLoader[]{ 32 | ClassLoader.getSystemClassLoader(), 33 | Thread.currentThread().getContextClassLoader()}; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/java/org/itstack/demo/like/mybatis/SqlSession.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.like.mybatis; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * 公众号 | bugstack虫洞栈 7 | * 博 客 | https://bugstack.cn 8 | * Create by 小傅哥 @2020 9 | */ 10 | public interface SqlSession { 11 | 12 | T selectOne(String statement); 13 | 14 | T selectOne(String statement, Object parameter); 15 | 16 | List selectList(String statement); 17 | 18 | List selectList(String statement, Object parameter); 19 | 20 | void close(); 21 | } 22 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/java/org/itstack/demo/like/mybatis/SqlSessionFactory.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.like.mybatis; 2 | 3 | /** 4 | * 公众号 | bugstack虫洞栈 5 | * 博 客 | https://bugstack.cn 6 | * Create by 小傅哥 @2020 7 | */ 8 | public interface SqlSessionFactory { 9 | 10 | SqlSession openSession(); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/java/org/itstack/demo/like/mybatis/SqlSessionFactoryBuilder.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.like.mybatis; 2 | 3 | import org.dom4j.Document; 4 | import org.dom4j.DocumentException; 5 | import org.dom4j.Element; 6 | import org.dom4j.io.SAXReader; 7 | import org.xml.sax.InputSource; 8 | 9 | import java.io.Reader; 10 | import java.sql.Connection; 11 | import java.sql.DriverManager; 12 | import java.sql.SQLException; 13 | import java.util.HashMap; 14 | import java.util.List; 15 | import java.util.Map; 16 | import java.util.regex.Matcher; 17 | import java.util.regex.Pattern; 18 | 19 | /** 20 | * 公众号 | bugstack虫洞栈 21 | * 博 客 | https://bugstack.cn 22 | * Create by 小傅哥 @2020 23 | */ 24 | public class SqlSessionFactoryBuilder { 25 | 26 | public DefaultSqlSessionFactory build(Reader reader) { 27 | SAXReader saxReader = new SAXReader(); 28 | try { 29 | Document document = saxReader.read(new InputSource(reader)); 30 | Configuration configuration = parseConfiguration(document.getRootElement()); 31 | return new DefaultSqlSessionFactory(configuration); 32 | } catch (DocumentException e) { 33 | e.printStackTrace(); 34 | } 35 | return null; 36 | } 37 | 38 | private Configuration parseConfiguration(Element root) { 39 | Configuration configuration = new Configuration(); 40 | configuration.setDataSource(dataSource(root.selectNodes("//dataSource"))); 41 | configuration.setConnection(connection(configuration.dataSource)); 42 | configuration.setMapperElement(mapperElement(root.selectNodes("mappers"))); 43 | return configuration; 44 | } 45 | 46 | // 获取数据源配置信息 47 | private Map dataSource(List list) { 48 | Map dataSource = new HashMap<>(4); 49 | Element element = list.get(0); 50 | List content = element.content(); 51 | for (Object o : content) { 52 | Element e = (Element) o; 53 | String name = e.attributeValue("name"); 54 | String value = e.attributeValue("value"); 55 | dataSource.put(name, value); 56 | } 57 | return dataSource; 58 | } 59 | 60 | private Connection connection(Map dataSource) { 61 | try { 62 | Class.forName(dataSource.get("driver")); 63 | return DriverManager.getConnection(dataSource.get("url"), dataSource.get("username"), dataSource.get("password")); 64 | } catch (ClassNotFoundException | SQLException e) { 65 | e.printStackTrace(); 66 | } 67 | return null; 68 | } 69 | 70 | // 获取SQL语句信息 71 | private Map mapperElement(List list) { 72 | Map map = new HashMap<>(); 73 | 74 | Element element = list.get(0); 75 | List content = element.content(); 76 | for (Object o : content) { 77 | Element e = (Element) o; 78 | String resource = e.attributeValue("resource"); 79 | 80 | try { 81 | Reader reader = Resources.getResourceAsReader(resource); 82 | SAXReader saxReader = new SAXReader(); 83 | Document document = saxReader.read(new InputSource(reader)); 84 | Element root = document.getRootElement(); 85 | //命名空间 86 | String namespace = root.attributeValue("namespace"); 87 | 88 | // SELECT 89 | List selectNodes = root.selectNodes("select"); 90 | for (Element node : selectNodes) { 91 | String id = node.attributeValue("id"); 92 | String parameterType = node.attributeValue("parameterType"); 93 | String resultType = node.attributeValue("resultType"); 94 | String sql = node.getText(); 95 | 96 | // ? 匹配 97 | Map parameter = new HashMap<>(); 98 | Pattern pattern = Pattern.compile("(#\\{(.*?)})"); 99 | Matcher matcher = pattern.matcher(sql); 100 | for (int i = 1; matcher.find(); i++) { 101 | String g1 = matcher.group(1); 102 | String g2 = matcher.group(2); 103 | parameter.put(i, g2); 104 | sql = sql.replace(g1, "?"); 105 | } 106 | 107 | XNode xNode = new XNode(); 108 | xNode.setNamespace(namespace); 109 | xNode.setId(id); 110 | xNode.setParameterType(parameterType); 111 | xNode.setResultType(resultType); 112 | xNode.setSql(sql); 113 | xNode.setParameter(parameter); 114 | 115 | map.put(namespace + "." + id, xNode); 116 | } 117 | } catch (Exception ex) { 118 | ex.printStackTrace(); 119 | } 120 | 121 | } 122 | return map; 123 | } 124 | 125 | } 126 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/java/org/itstack/demo/like/mybatis/XNode.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.like.mybatis; 2 | 3 | import java.util.Map; 4 | 5 | /** 6 | * 公众号 | bugstack虫洞栈 7 | * 博 客 | https://bugstack.cn 8 | * Create by 小傅哥 @2020 9 | */ 10 | public class XNode { 11 | 12 | private String namespace; 13 | private String id; 14 | private String parameterType; 15 | private String resultType; 16 | private String sql; 17 | private Map parameter; 18 | 19 | public String getNamespace() { 20 | return namespace; 21 | } 22 | 23 | public void setNamespace(String namespace) { 24 | this.namespace = namespace; 25 | } 26 | 27 | public String getId() { 28 | return id; 29 | } 30 | 31 | public void setId(String id) { 32 | this.id = id; 33 | } 34 | 35 | public String getParameterType() { 36 | return parameterType; 37 | } 38 | 39 | public void setParameterType(String parameterType) { 40 | this.parameterType = parameterType; 41 | } 42 | 43 | public String getResultType() { 44 | return resultType; 45 | } 46 | 47 | public void setResultType(String resultType) { 48 | this.resultType = resultType; 49 | } 50 | 51 | public String getSql() { 52 | return sql; 53 | } 54 | 55 | public void setSql(String sql) { 56 | this.sql = sql; 57 | } 58 | 59 | public Map getParameter() { 60 | return parameter; 61 | } 62 | 63 | public void setParameter(Map parameter) { 64 | this.parameter = parameter; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/java/org/itstack/demo/like/spring/MapperFactoryBean.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.like.spring; 2 | 3 | import org.itstack.demo.like.mybatis.SqlSession; 4 | import org.itstack.demo.like.mybatis.SqlSessionFactory; 5 | import org.springframework.beans.factory.FactoryBean; 6 | 7 | import java.lang.reflect.InvocationHandler; 8 | import java.lang.reflect.Proxy; 9 | 10 | /** 11 | * 博 客:http://bugstack.cn 12 | * 公众号:bugstack虫洞栈 | 沉淀、分享、成长,让自己和他人都能有所收获! 13 | * create by 付政委 on @2019 14 | */ 15 | public class MapperFactoryBean implements FactoryBean { 16 | 17 | private Class mapperInterface; 18 | private SqlSessionFactory sqlSessionFactory; 19 | 20 | public MapperFactoryBean(Class mapperInterface, SqlSessionFactory sqlSessionFactory) { 21 | this.mapperInterface = mapperInterface; 22 | this.sqlSessionFactory = sqlSessionFactory; 23 | } 24 | 25 | @Override 26 | public T getObject() throws Exception { 27 | InvocationHandler handler = (proxy, method, args) -> { 28 | System.out.println("你被代理了,执行SQL操作!" + method.getName()); 29 | try { 30 | SqlSession session = sqlSessionFactory.openSession(); 31 | try { 32 | return session.selectOne(mapperInterface.getName() + "." + method.getName(), args[0]); 33 | } finally { 34 | session.close(); 35 | } 36 | } catch (Exception e) { 37 | e.printStackTrace(); 38 | } 39 | 40 | return method.getReturnType().newInstance(); 41 | }; 42 | return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[]{mapperInterface}, handler); 43 | } 44 | 45 | @Override 46 | public Class getObjectType() { 47 | return mapperInterface; 48 | } 49 | 50 | @Override 51 | public boolean isSingleton() { 52 | return true; 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/java/org/itstack/demo/like/spring/MapperScannerConfigurer.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.like.spring; 2 | 3 | import org.itstack.demo.like.mybatis.SqlSessionFactory; 4 | import org.springframework.beans.BeansException; 5 | import org.springframework.beans.factory.config.BeanDefinitionHolder; 6 | import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; 7 | import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; 8 | import org.springframework.beans.factory.support.BeanDefinitionRegistry; 9 | import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; 10 | import org.springframework.context.annotation.ScannedGenericBeanDefinition; 11 | import org.springframework.core.io.Resource; 12 | import org.springframework.core.io.support.PathMatchingResourcePatternResolver; 13 | import org.springframework.core.io.support.ResourcePatternResolver; 14 | import org.springframework.core.type.classreading.MetadataReader; 15 | import org.springframework.util.ClassUtils; 16 | 17 | import java.beans.Introspector; 18 | import java.io.IOException; 19 | 20 | /** 21 | * 博 客:http://bugstack.cn 22 | * 公众号:bugstack虫洞栈 | 沉淀、分享、成长,让自己和他人都能有所收获! 23 | * create by 付政委 on @2019 24 | */ 25 | public class MapperScannerConfigurer implements BeanDefinitionRegistryPostProcessor { 26 | 27 | private String basePackage; 28 | private SqlSessionFactory sqlSessionFactory; 29 | 30 | @Override 31 | public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { 32 | try { 33 | // classpath*:org/itstack/demo/dao/**/*.class 34 | String packageSearchPath = "classpath*:" + basePackage.replace('.', '/') + "/**/*.class"; 35 | 36 | ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); 37 | Resource[] resources = resourcePatternResolver.getResources(packageSearchPath); 38 | 39 | for (Resource resource : resources) { 40 | MetadataReader metadataReader = new SimpleMetadataReader(resource, ClassUtils.getDefaultClassLoader()); 41 | 42 | ScannedGenericBeanDefinition beanDefinition = new ScannedGenericBeanDefinition(metadataReader); 43 | String beanName = Introspector.decapitalize(ClassUtils.getShortName(beanDefinition.getBeanClassName())); 44 | 45 | beanDefinition.setResource(resource); 46 | beanDefinition.setSource(resource); 47 | beanDefinition.setScope("singleton"); 48 | beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(beanDefinition.getBeanClassName()); 49 | beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(sqlSessionFactory); 50 | beanDefinition.setBeanClass(MapperFactoryBean.class); 51 | 52 | BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(beanDefinition, beanName); 53 | registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition()); 54 | } 55 | } catch (IOException e) { 56 | e.printStackTrace(); 57 | } 58 | 59 | } 60 | 61 | @Override 62 | public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 63 | // left intentionally blank 64 | } 65 | 66 | public void setBasePackage(String basePackage) { 67 | this.basePackage = basePackage; 68 | } 69 | 70 | public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { 71 | this.sqlSessionFactory = sqlSessionFactory; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/java/org/itstack/demo/like/spring/SimpleMetadataReader.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.like.spring; 2 | 3 | import org.springframework.asm.ClassReader; 4 | import org.springframework.core.NestedIOException; 5 | import org.springframework.core.io.Resource; 6 | import org.springframework.core.type.AnnotationMetadata; 7 | import org.springframework.core.type.ClassMetadata; 8 | import org.springframework.core.type.classreading.AnnotationMetadataReadingVisitor; 9 | import org.springframework.core.type.classreading.MetadataReader; 10 | 11 | import java.io.BufferedInputStream; 12 | import java.io.IOException; 13 | import java.io.InputStream; 14 | 15 | /** 16 | * 博 客:http://bugstack.cn 17 | * 公众号:bugstack虫洞栈 | 沉淀、分享、成长,让自己和他人都能有所收获! 18 | * create by 付政委 on @2019 19 | */ 20 | public class SimpleMetadataReader implements MetadataReader { 21 | 22 | private final Resource resource; 23 | 24 | private final ClassMetadata classMetadata; 25 | 26 | private final AnnotationMetadata annotationMetadata; 27 | 28 | SimpleMetadataReader(Resource resource, ClassLoader classLoader) throws IOException { 29 | ClassReader classReader; 30 | try (InputStream is = new BufferedInputStream(resource.getInputStream())) { 31 | classReader = new ClassReader(is); 32 | } catch (IllegalArgumentException ex) { 33 | throw new NestedIOException("ASM ClassReader failed to parse class file - " + 34 | "probably due to a new Java class file version that isn't supported yet: " + resource, ex); 35 | } 36 | 37 | AnnotationMetadataReadingVisitor visitor = new AnnotationMetadataReadingVisitor(classLoader); 38 | classReader.accept(visitor, ClassReader.SKIP_DEBUG); 39 | 40 | this.annotationMetadata = visitor; 41 | // (since AnnotationMetadataReadingVisitor extends ClassMetadataReadingVisitor) 42 | this.classMetadata = visitor; 43 | this.resource = resource; 44 | } 45 | 46 | 47 | @Override 48 | public Resource getResource() { 49 | return this.resource; 50 | } 51 | 52 | @Override 53 | public ClassMetadata getClassMetadata() { 54 | return this.classMetadata; 55 | } 56 | 57 | @Override 58 | public AnnotationMetadata getAnnotationMetadata() { 59 | return this.annotationMetadata; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/java/org/itstack/demo/like/spring/SqlSessionFactoryBean.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.like.spring; 2 | 3 | 4 | import org.itstack.demo.like.mybatis.Resources; 5 | import org.itstack.demo.like.mybatis.SqlSessionFactory; 6 | import org.itstack.demo.like.mybatis.SqlSessionFactoryBuilder; 7 | import org.springframework.beans.factory.FactoryBean; 8 | import org.springframework.beans.factory.InitializingBean; 9 | 10 | import java.io.Reader; 11 | 12 | /** 13 | * 博 客:http://bugstack.cn 14 | * 公众号:bugstack虫洞栈 | 沉淀、分享、成长,让自己和他人都能有所收获! 15 | * create by 付政委 on @2019 16 | */ 17 | public class SqlSessionFactoryBean implements FactoryBean, InitializingBean { 18 | 19 | private String resource; 20 | private SqlSessionFactory sqlSessionFactory; 21 | 22 | @Override 23 | public void afterPropertiesSet() throws Exception { 24 | try (Reader reader = Resources.getResourceAsReader(resource)) { 25 | this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 26 | } catch (Exception e) { 27 | e.printStackTrace(); 28 | } 29 | } 30 | 31 | @Override 32 | public SqlSessionFactory getObject() throws Exception { 33 | return sqlSessionFactory; 34 | } 35 | 36 | @Override 37 | public Class getObjectType() { 38 | return sqlSessionFactory.getClass(); 39 | } 40 | 41 | @Override 42 | public boolean isSingleton() { 43 | return true; 44 | } 45 | 46 | public void setResource(String resource) { 47 | this.resource = resource; 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/java/org/itstack/demo/po/School.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.po; 2 | 3 | import java.util.Date; 4 | 5 | /** 6 | * create by fuzhengwei3 on 2019/12/19 7 | */ 8 | public class School { 9 | 10 | private Long id; 11 | private String name; 12 | private String address; 13 | private Date createTime; 14 | private Date updateTime; 15 | 16 | public Long getId() { 17 | return id; 18 | } 19 | 20 | public void setId(Long id) { 21 | this.id = id; 22 | } 23 | 24 | public String getName() { 25 | return name; 26 | } 27 | 28 | public void setName(String name) { 29 | this.name = name; 30 | } 31 | 32 | public String getAddress() { 33 | return address; 34 | } 35 | 36 | public void setAddress(String address) { 37 | this.address = address; 38 | } 39 | 40 | public Date getCreateTime() { 41 | return createTime; 42 | } 43 | 44 | public void setCreateTime(Date createTime) { 45 | this.createTime = createTime; 46 | } 47 | 48 | public Date getUpdateTime() { 49 | return updateTime; 50 | } 51 | 52 | public void setUpdateTime(Date updateTime) { 53 | this.updateTime = updateTime; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/java/org/itstack/demo/po/User.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.po; 2 | 3 | import java.util.Date; 4 | 5 | public class User { 6 | 7 | private Long id; 8 | private String name; 9 | private Integer age; 10 | private Date createTime; 11 | private Date updateTime; 12 | 13 | public Long getId() { 14 | return id; 15 | } 16 | 17 | public void setId(Long id) { 18 | this.id = id; 19 | } 20 | 21 | public String getName() { 22 | return name; 23 | } 24 | 25 | public void setName(String name) { 26 | this.name = name; 27 | } 28 | 29 | public Integer getAge() { 30 | return age; 31 | } 32 | 33 | public void setAge(Integer age) { 34 | this.age = age; 35 | } 36 | 37 | public Date getCreateTime() { 38 | return createTime; 39 | } 40 | 41 | public void setCreateTime(Date createTime) { 42 | this.createTime = createTime; 43 | } 44 | 45 | public Date getUpdateTime() { 46 | return updateTime; 47 | } 48 | 49 | public void setUpdateTime(Date updateTime) { 50 | this.updateTime = updateTime; 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/java/org/itstack/demo/service/UserService.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.service; 2 | 3 | import org.springframework.stereotype.Service; 4 | 5 | @Service 6 | public class UserService { 7 | 8 | public void queryUserInfo(){ 9 | System.out.println("hi userInfo"); 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80}[%L] - %msg%n 9 | 10 | 11 | 12 | 14 | ${log.info.location}/system_info.log 15 | true 16 | 17 | INFO 18 | ACCEPT 19 | DENY 20 | 21 | 22 | ${log.info.location}/system_info.%d{yyyy-MM-dd}.%i.log 23 | 24 | 26 | 100MB 27 | 28 | 100 29 | 30 | 31 | 32 | %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80}[%L] - %msg%n 33 | 34 | 35 | 36 | 38 | ${log.info.location}/system_error.log 39 | true 40 | 41 | ERROR 42 | ACCEPT 43 | DENY 44 | 45 | 46 | ${log.info.location}/system_error.%d{yyyy-MM-dd}.%i.log 47 | 48 | 50 | 100MB 51 | 52 | 100 53 | 54 | 55 | 56 | %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80}[%L] - %msg%n 57 | 58 | 59 | 60 | 62 | ${log.info.location}/app_info.log 63 | true 64 | 65 | INFO 66 | ACCEPT 67 | DENY 68 | 69 | 70 | ${log.info.location}/app_info.%d{yyyy-MM-dd}.%i.log 71 | 72 | 74 | 100MB 75 | 76 | 100 77 | 78 | 79 | 80 | %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80}[%L] - %msg%n 81 | 82 | 83 | 84 | 86 | ${log.info.location}/app_error.log 87 | true 88 | 89 | ERROR 90 | ACCEPT 91 | DENY 92 | 93 | 94 | ${log.info.location}/app_error.%d{yyyy-MM-dd}.%i.log 95 | 96 | 98 | 100MB 99 | 100 | 100 101 | 102 | 103 | 104 | %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80}[%L] - %msg%n 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/resources/mapper/School_Mapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/resources/mapper/User_Mapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/resources/mybatis-config.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/resources/props/jdbc.properties: -------------------------------------------------------------------------------- 1 | db.jdbc.driverClassName=com.mysql.jdbc.Driver 2 | db.jdbc.url=jdbc:mysql://127.0.0.1:3306/itstack?createDatabaseIfNotExist=true&characterEncoding=utf-8&useUnicode=true 3 | db.jdbc.username=root 4 | db.jdbc.password=123456 -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/resources/spring-config.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | classpath:props/*.properties 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/resources/spring/mybatis-config-datasource.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/resources/spring/spring-config-datasource.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/main/resources/test-config.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/test/java/org/itstack/demo/ApiLikeTest.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo; 2 | 3 | import com.alibaba.fastjson.JSON; 4 | import org.itstack.demo.like.mybatis.Resources; 5 | import org.itstack.demo.like.mybatis.SqlSession; 6 | import org.itstack.demo.like.mybatis.SqlSessionFactory; 7 | import org.itstack.demo.like.mybatis.SqlSessionFactoryBuilder; 8 | import org.itstack.demo.po.User; 9 | import org.junit.Test; 10 | 11 | import java.io.Reader; 12 | import java.util.List; 13 | 14 | /** 15 | * 公众号 | bugstack虫洞栈 16 | * 博 客 | https://bugstack.cn 17 | * Create by 小傅哥 @2020 18 | */ 19 | public class ApiLikeTest { 20 | 21 | @Test 22 | public void test_queryUserInfoById() { 23 | String resource = "spring/mybatis-config-datasource.xml"; 24 | Reader reader; 25 | try { 26 | reader = Resources.getResourceAsReader(resource); 27 | SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader); 28 | 29 | SqlSession session = sqlMapper.openSession(); 30 | try { 31 | User user = session.selectOne("org.itstack.demo.dao.IUserDao.queryUserInfoById", 1L); 32 | System.out.println(JSON.toJSONString(user)); 33 | } finally { 34 | session.close(); 35 | reader.close(); 36 | } 37 | } catch (Exception e) { 38 | e.printStackTrace(); 39 | } 40 | 41 | } 42 | 43 | @Test 44 | public void test_queryUserList() { 45 | String resource = "spring/mybatis-config-datasource.xml"; 46 | Reader reader; 47 | try { 48 | reader = Resources.getResourceAsReader(resource); 49 | SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader); 50 | 51 | SqlSession session = sqlMapper.openSession(); 52 | try { 53 | User req = new User(); 54 | req.setAge(18); 55 | List userList = session.selectList("org.itstack.demo.dao.IUserDao.queryUserList", req); 56 | System.out.println(JSON.toJSONString(userList)); 57 | } finally { 58 | session.close(); 59 | reader.close(); 60 | } 61 | } catch (Exception e) { 62 | e.printStackTrace(); 63 | } 64 | } 65 | 66 | } 67 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/test/java/org/itstack/demo/ApiTest.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo; 2 | 3 | import org.itstack.demo.service.UserService; 4 | import org.junit.Test; 5 | import org.junit.runner.RunWith; 6 | import org.springframework.test.context.ContextConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | import javax.annotation.Resource; 10 | import java.sql.SQLOutput; 11 | 12 | @RunWith(SpringJUnit4ClassRunner.class) 13 | @ContextConfiguration("classpath:spring-config.xml") 14 | public class ApiTest { 15 | 16 | @Resource 17 | private UserService userService; 18 | 19 | @Test 20 | public void test_queryUserInfo() { 21 | userService.queryUserInfo(); 22 | } 23 | 24 | 25 | @Test 26 | public void test_long() { 27 | int i = Integer.MAX_VALUE / 8 / 8; 28 | System.out.println(i); 29 | long[][] xx = new long[i][i]; 30 | xx[i - 1][i - 1] = 1; 31 | System.out.println(xx[i - 1][i - 1]); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/test/java/org/itstack/demo/MybatisApiTest.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo; 2 | 3 | import com.alibaba.fastjson.JSON; 4 | import org.apache.ibatis.io.Resources; 5 | import org.apache.ibatis.session.SqlSession; 6 | import org.apache.ibatis.session.SqlSessionFactory; 7 | import org.apache.ibatis.session.SqlSessionFactoryBuilder; 8 | import org.itstack.demo.po.User; 9 | import org.junit.Test; 10 | 11 | import java.io.IOException; 12 | import java.io.Reader; 13 | 14 | public class MybatisApiTest { 15 | 16 | @Test 17 | public void test_queryUserInfoById() { 18 | String resource = "spring/mybatis-config-datasource.xml"; 19 | Reader reader; 20 | try { 21 | reader = Resources.getResourceAsReader(resource); 22 | SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader); 23 | 24 | SqlSession session = sqlMapper.openSession(); 25 | try { 26 | User user = session.selectOne("org.itstack.demo.dao.IUserDao.queryUserInfoById", 1L); 27 | System.out.println(JSON.toJSONString(user)); 28 | } finally { 29 | session.close(); 30 | reader.close(); 31 | } 32 | } catch (IOException e) { 33 | e.printStackTrace(); 34 | } 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/test/java/org/itstack/demo/SpringApiTest.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo; 2 | 3 | import com.alibaba.fastjson.JSON; 4 | import org.itstack.demo.dao.ISchoolDao; 5 | import org.itstack.demo.dao.IUserDao; 6 | import org.itstack.demo.po.School; 7 | import org.itstack.demo.po.User; 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | import org.slf4j.Logger; 11 | import org.slf4j.LoggerFactory; 12 | import org.springframework.test.context.ContextConfiguration; 13 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 14 | 15 | import javax.annotation.Resource; 16 | 17 | /** 18 | * 配置spring和junit整合,junit启动时加载springIOC容器 spring-test,junit 19 | */ 20 | @RunWith(SpringJUnit4ClassRunner.class) 21 | @ContextConfiguration("classpath:spring-config.xml") 22 | public class SpringApiTest { 23 | 24 | private Logger logger = LoggerFactory.getLogger(SpringApiTest.class); 25 | 26 | @Resource 27 | private ISchoolDao schoolDao; 28 | @Resource 29 | private IUserDao userDao; 30 | 31 | @Test 32 | public void test_queryRuleTreeByTreeId(){ 33 | School ruleTree = schoolDao.querySchoolInfoById(1L); 34 | logger.info(JSON.toJSONString(ruleTree)); 35 | 36 | User user = userDao.queryUserInfoById(1L); 37 | logger.info(JSON.toJSONString(user)); 38 | } 39 | 40 | @Test 41 | public void test(){ 42 | B b = new B(); 43 | b.scan(); //我的输出结果是什么? 44 | } 45 | 46 | static class A { 47 | public void scan(){ 48 | doScan(); 49 | } 50 | protected void doScan(){ 51 | System.out.println("A.doScan"); 52 | } 53 | } 54 | 55 | static class B extends A { 56 | @Override 57 | protected void doScan() { 58 | System.out.println("B.doScan"); 59 | } 60 | } 61 | 62 | } 63 | 64 | -------------------------------------------------------------------------------- /itstack-demo-code-mybatis/src/test/java/org/itstack/demo/SpringTest.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo; 2 | 3 | import com.alibaba.fastjson.JSON; 4 | import org.itstack.demo.dao.IUserDao; 5 | import org.itstack.demo.po.User; 6 | import org.junit.Test; 7 | import org.slf4j.Logger; 8 | import org.slf4j.LoggerFactory; 9 | import org.springframework.beans.factory.BeanFactory; 10 | import org.springframework.context.support.ClassPathXmlApplicationContext; 11 | 12 | /** 13 | * 博 客:http://bugstack.cn 14 | * 公众号:bugstack虫洞栈 | 沉淀、分享、成长,让自己和他人都能有所收获! 15 | * create by 付政委 on @2019 16 | */ 17 | public class SpringTest { 18 | 19 | private Logger logger = LoggerFactory.getLogger(SpringTest.class); 20 | 21 | @Test 22 | public void test_ClassPathXmlApplicationContext() { 23 | BeanFactory beanFactory = new ClassPathXmlApplicationContext("test-config.xml"); 24 | IUserDao userDao = beanFactory.getBean("IUserDao", IUserDao.class); 25 | User user = userDao.queryUserInfoById(1L); 26 | logger.info("测试结果:{}", JSON.toJSONString(user)); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /itstack-demo-code-proxy/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | itstack-demo-code 7 | org.itstack.demo 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | itstack-demo-code-proxy 13 | 1.0-SNAPSHOT 14 | 15 | 16 | 17 | junit 18 | junit 19 | 4.12 20 | 21 | 22 | 23 | cglib 24 | cglib 25 | 3.2.12 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /itstack-demo-code-proxy/src/main/java/org/itstack/demo/proxy/cglib/CglibProxy.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.proxy.cglib; 2 | 3 | import net.sf.cglib.proxy.Enhancer; 4 | import net.sf.cglib.proxy.MethodInterceptor; 5 | import net.sf.cglib.proxy.MethodProxy; 6 | 7 | import java.lang.reflect.Method; 8 | 9 | /** 10 | * 微信公众号:bugstack虫洞栈 | 欢迎关注学习专题案例 11 | * 论坛:http://bugstack.cn 12 | * Create by 付政委 on @2019 13 | */ 14 | public class CglibProxy implements MethodInterceptor { 15 | 16 | public Object newInstall(Object object) { 17 | return Enhancer.create(object.getClass(), this); 18 | } 19 | 20 | public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { 21 | System.out.println("我被CglibProxy代理了"); 22 | return methodProxy.invokeSuper(o, objects); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /itstack-demo-code-proxy/src/main/java/org/itstack/demo/proxy/jdk/reflect/JDKInvocationHandler.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.proxy.jdk.reflect; 2 | 3 | import java.lang.reflect.InvocationHandler; 4 | import java.lang.reflect.Method; 5 | 6 | /** 7 | * 微信公众号:bugstack虫洞栈 | 欢迎关注学习专题案例 8 | * 论坛:http://bugstack.cn 9 | * Create by 付政委 on @2019 10 | */ 11 | public class JDKInvocationHandler implements InvocationHandler { 12 | 13 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 14 | System.out.println(method.getName()); 15 | return "我被JDKProxy代理了"; 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /itstack-demo-code-proxy/src/main/java/org/itstack/demo/proxy/jdk/reflect/JDKProxy.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.proxy.jdk.reflect; 2 | 3 | 4 | 5 | import org.itstack.demo.proxy.jdk.util.ClassLoaderUtils; 6 | 7 | import java.lang.reflect.InvocationHandler; 8 | import java.lang.reflect.Proxy; 9 | 10 | public class JDKProxy { 11 | 12 | public static T getProxy(Class interfaceClass) throws Exception { 13 | InvocationHandler handler = new JDKInvocationHandler(); 14 | ClassLoader classLoader = ClassLoaderUtils.getCurrentClassLoader(); 15 | T result = (T) Proxy.newProxyInstance(classLoader, new Class[]{interfaceClass}, handler); 16 | return result; 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /itstack-demo-code-proxy/src/main/java/org/itstack/demo/proxy/jdk/util/ClassLoaderUtils.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.proxy.jdk.util; 2 | 3 | import java.lang.reflect.Constructor; 4 | import java.lang.reflect.Modifier; 5 | import java.util.HashSet; 6 | import java.util.Set; 7 | 8 | /** 9 | * 微信公众号:bugstack虫洞栈 | 欢迎关注学习专题案例 10 | * 论坛:http://bugstack.cn 11 | * Create by 付政委 on @2019 12 | */ 13 | public class ClassLoaderUtils { 14 | 15 | private static Set primitiveSet = new HashSet(); 16 | 17 | static { 18 | primitiveSet.add(Integer.class); 19 | primitiveSet.add(Long.class); 20 | primitiveSet.add(Float.class); 21 | primitiveSet.add(Byte.class); 22 | primitiveSet.add(Short.class); 23 | primitiveSet.add(Double.class); 24 | primitiveSet.add(Character.class); 25 | primitiveSet.add(Boolean.class); 26 | } 27 | 28 | /** 29 | * 得到当前ClassLoader 30 | * 31 | * @return ClassLoader 32 | */ 33 | public static ClassLoader getCurrentClassLoader() { 34 | ClassLoader cl = Thread.currentThread().getContextClassLoader(); 35 | if (cl == null) { 36 | cl = ClassLoaderUtils.class.getClassLoader(); 37 | } 38 | return cl == null ? ClassLoader.getSystemClassLoader() : cl; 39 | } 40 | 41 | /** 42 | * 得到当前ClassLoader 43 | * @param clazz 某个类 44 | * @return ClassLoader 45 | */ 46 | public static ClassLoader getClassLoader(Class clazz) { 47 | ClassLoader loader = Thread.currentThread().getContextClassLoader(); 48 | if (loader != null) { 49 | return loader; 50 | } 51 | if (clazz != null) { 52 | loader = clazz.getClassLoader(); 53 | if (loader != null) { 54 | return loader; 55 | } 56 | return clazz.getClassLoader(); 57 | } 58 | return ClassLoader.getSystemClassLoader(); 59 | } 60 | 61 | /** 62 | * 根据类名加载Class 63 | * 64 | * @param className 65 | * 类名 66 | * @return Class 67 | * @throws ClassNotFoundException 68 | * 找不到类 69 | */ 70 | public static Class forName(String className) 71 | throws ClassNotFoundException { 72 | return forName(className, true); 73 | } 74 | 75 | /** 76 | * 根据类名加载Class 77 | * 78 | * @param className 79 | * 类名 80 | * @param initialize 81 | * 是否初始化 82 | * @return Class 83 | * @throws ClassNotFoundException 84 | * 找不到类 85 | */ 86 | public static Class forName(String className, boolean initialize) 87 | throws ClassNotFoundException { 88 | return Class.forName(className, initialize, getCurrentClassLoader()); 89 | } 90 | 91 | /** 92 | * 根据类名加载Class 93 | * 94 | * @param className 95 | * 类名 96 | * @param cl 97 | * Classloader 98 | * @return Class 99 | * @throws ClassNotFoundException 100 | * 找不到类 101 | */ 102 | public static Class forName(String className, ClassLoader cl) 103 | throws ClassNotFoundException { 104 | return Class.forName(className, true, cl); 105 | } 106 | 107 | /** 108 | * 实例化一个对象(只检测默认构造函数,其它不管) 109 | * 110 | * @param clazz 111 | * 对象类 112 | * @param 113 | * 对象具体类 114 | * @return 对象实例 115 | * @throws Exception 没有找到方法,或者无法处理,或者初始化方法异常等 116 | */ 117 | public static T newInstance(Class clazz) throws Exception { 118 | if(primitiveSet.contains(clazz)){ 119 | return null; 120 | } 121 | if (clazz.isMemberClass() && !Modifier.isStatic(clazz.getModifiers())) { 122 | Constructor constructorList[] = clazz.getDeclaredConstructors(); 123 | Constructor defaultConstructor = null; 124 | for (Constructor con : constructorList) { 125 | if (con.getParameterTypes().length == 1) { 126 | defaultConstructor = con; 127 | break; 128 | } 129 | } 130 | if (defaultConstructor != null) { 131 | if (defaultConstructor.isAccessible()) { 132 | return (T) defaultConstructor.newInstance(new Object[]{null}); 133 | } else { 134 | try { 135 | defaultConstructor.setAccessible(true); 136 | return (T) defaultConstructor.newInstance(new Object[]{null}); 137 | } finally { 138 | defaultConstructor.setAccessible(false); 139 | } 140 | } 141 | } else { 142 | throw new Exception("The " + clazz.getCanonicalName() + " has no default constructor!"); 143 | } 144 | } 145 | try { 146 | return clazz.newInstance(); 147 | } catch (Exception e) { 148 | Constructor constructor = clazz.getDeclaredConstructor(); 149 | if (constructor.isAccessible()) { 150 | throw new Exception("The " + clazz.getCanonicalName() + " has no default constructor!", e); 151 | } else { 152 | try { 153 | constructor.setAccessible(true); 154 | return constructor.newInstance(); 155 | } finally { 156 | constructor.setAccessible(false); 157 | } 158 | } 159 | } 160 | } 161 | 162 | } 163 | -------------------------------------------------------------------------------- /itstack-demo-code-proxy/src/main/java/org/itstack/demo/service/IUserService.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.service; 2 | 3 | /** 4 | * 微信公众号:bugstack虫洞栈 | 欢迎关注学习专题案例 5 | * 论坛:http://bugstack.cn 6 | * Create by 付政委 on @2019 7 | */ 8 | public interface IUserService { 9 | 10 | String queryUserNameById(String userId); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /itstack-demo-code-proxy/src/main/java/org/itstack/demo/service/UserService.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.service; 2 | 3 | import org.itstack.demo.service.IUserService; 4 | 5 | /** 6 | * 微信公众号:bugstack虫洞栈 | 欢迎关注学习专题案例 7 | * 论坛:http://bugstack.cn 8 | * Create by 付政委 on @2019 9 | */ 10 | public class UserService implements IUserService { 11 | 12 | public String queryUserNameById(String userId) { 13 | return "hi user " + userId; 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /itstack-demo-code-proxy/src/test/java/org/itstack/demo/test/ApiTest.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.test; 2 | 3 | import org.itstack.demo.proxy.cglib.CglibProxy; 4 | import org.itstack.demo.proxy.jdk.reflect.JDKProxy; 5 | import org.itstack.demo.proxy.jdk.util.ClassLoaderUtils; 6 | import org.itstack.demo.service.IUserService; 7 | import org.itstack.demo.service.UserService; 8 | import org.junit.Test; 9 | import sun.misc.ProxyGenerator; 10 | 11 | import java.io.File; 12 | import java.io.FileNotFoundException; 13 | import java.io.FileOutputStream; 14 | import java.io.IOException; 15 | 16 | /** 17 | * 微信公众号:bugstack虫洞栈 | 欢迎关注学习专题案例 18 | * 论坛:http://bugstack.cn 19 | * Create by 付政委 on @2019 20 | */ 21 | public class ApiTest { 22 | 23 | @Test 24 | public void test_proxy_jdk() throws Exception { 25 | 26 | IUserService proxy = (IUserService) JDKProxy.getProxy(ClassLoaderUtils.forName("org.itstack.demo.service.IUserService")); 27 | String userName = proxy.queryUserNameById("10001"); 28 | System.out.println(userName); 29 | 30 | String name = "ProxyUserService"; 31 | byte[] data = ProxyGenerator.generateProxyClass(name, new Class[]{IUserService.class}); 32 | 33 | // 输出类字节码 34 | FileOutputStream out = null; 35 | try { 36 | out = new FileOutputStream(name + ".class"); 37 | System.out.println((new File("")).getAbsolutePath()); 38 | out.write(data); 39 | } catch (FileNotFoundException e) { 40 | e.printStackTrace(); 41 | } catch (IOException e) { 42 | e.printStackTrace(); 43 | } finally { 44 | if (null != out) try { 45 | out.close(); 46 | } catch (IOException e) { 47 | e.printStackTrace(); 48 | } 49 | } 50 | 51 | } 52 | 53 | @Test 54 | public void test_proxy_cglib() { 55 | CglibProxy cglibProxy = new CglibProxy(); 56 | UserService userService = (UserService) cglibProxy.newInstall(new UserService()); 57 | String userName = userService.queryUserNameById("10001"); 58 | System.out.println(userName); 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /itstack-demo-code-schedule/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | itstack-demo-code 7 | org.itstack.demo 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | itstack-demo-code-schedule 13 | war 14 | 15 | 16 | dev 17 | 18 | 19 | 20 | itstack-demo-code-schedule 21 | 22 | 23 | 24 | org.apache.maven.plugins 25 | maven-eclipse-plugin 26 | 2.7 27 | 28 | 29 | * 30 | 31 | 32 | 33 | 34 | 35 | org.apache.maven.plugins 36 | maven-compiler-plugin 37 | 38 | 39 | 40 | maven-resources-plugin 41 | 2.4.3 42 | 43 | UTF-8 44 | 45 | 46 | 47 | 48 | maven-source-plugin 49 | 2.0.4 50 | 51 | 52 | attach-sources 53 | 54 | jar 55 | 56 | 57 | 58 | 59 | 60 | org.mortbay.jetty 61 | jetty-maven-plugin 62 | 7.3.1.v20110307 63 | 64 | 65 | 66 | 18010 67 | 68 | 69 | 70 | / 71 | 72 | 5000 73 | manage 74 | 17010 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /itstack-demo-code-schedule/src/main/java/org/itstack/demo/DemoTask.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | 6 | public class DemoTask { 7 | 8 | private Logger logger = LoggerFactory.getLogger(DemoTask.class); 9 | 10 | public void execute() throws Exception{ 11 | logger.info("定时处理用户信息任务:0/5 * * * * ?"); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /itstack-demo-code-schedule/src/main/java/org/itstack/demo/JobImpl.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo; 2 | 3 | import org.quartz.Job; 4 | import org.quartz.JobExecutionContext; 5 | import org.quartz.JobExecutionException; 6 | import org.slf4j.Logger; 7 | import org.slf4j.LoggerFactory; 8 | 9 | public class JobImpl implements Job { 10 | 11 | private Logger logger = LoggerFactory.getLogger(JobImpl.class); 12 | 13 | @Override 14 | public void execute(JobExecutionContext context) throws JobExecutionException { 15 | logger.info("定时处理用户信息任务:0/2 * * * * ?"); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /itstack-demo-code-schedule/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80}[%L] - %msg%n 9 | 10 | 11 | 12 | 14 | ${log.info.location}/system_info.log 15 | true 16 | 17 | INFO 18 | ACCEPT 19 | DENY 20 | 21 | 22 | ${log.info.location}/system_info.%d{yyyy-MM-dd}.%i.log 23 | 24 | 26 | 100MB 27 | 28 | 100 29 | 30 | 31 | 32 | %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80}[%L] - %msg%n 33 | 34 | 35 | 36 | 38 | ${log.info.location}/system_error.log 39 | true 40 | 41 | ERROR 42 | ACCEPT 43 | DENY 44 | 45 | 46 | ${log.info.location}/system_error.%d{yyyy-MM-dd}.%i.log 47 | 48 | 50 | 100MB 51 | 52 | 100 53 | 54 | 55 | 56 | %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80}[%L] - %msg%n 57 | 58 | 59 | 60 | 62 | ${log.info.location}/app_info.log 63 | true 64 | 65 | INFO 66 | ACCEPT 67 | DENY 68 | 69 | 70 | ${log.info.location}/app_info.%d{yyyy-MM-dd}.%i.log 71 | 72 | 74 | 100MB 75 | 76 | 100 77 | 78 | 79 | 80 | %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80}[%L] - %msg%n 81 | 82 | 83 | 84 | 86 | ${log.info.location}/app_error.log 87 | true 88 | 89 | ERROR 90 | ACCEPT 91 | DENY 92 | 93 | 94 | ${log.info.location}/app_error.%d{yyyy-MM-dd}.%i.log 95 | 96 | 98 | 100MB 99 | 100 | 100 101 | 102 | 103 | 104 | %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80}[%L] - %msg%n 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | -------------------------------------------------------------------------------- /itstack-demo-code-schedule/src/main/resources/props/config.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuzhengwei/itstack-demo-code/adc361498a57d7a45a1b7518e8929e5202f16fea/itstack-demo-code-schedule/src/main/resources/props/config.properties -------------------------------------------------------------------------------- /itstack-demo-code-schedule/src/main/resources/spring-config.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | classpath:props/*.properties 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /itstack-demo-code-schedule/src/main/resources/spring/spring-config-schedule-task.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /itstack-demo-code-schedule/src/test/java/org/itstack/demo/test/ApiTest.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.test; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.slf4j.Logger; 6 | import org.slf4j.LoggerFactory; 7 | import org.springframework.test.context.ContextConfiguration; 8 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 9 | 10 | import java.io.IOException; 11 | 12 | @RunWith(SpringJUnit4ClassRunner.class) 13 | @ContextConfiguration("classpath:spring-config.xml") 14 | public class ApiTest { 15 | 16 | private Logger logger = LoggerFactory.getLogger(ApiTest.class); 17 | 18 | @Test 19 | public void test() throws IOException { 20 | System.in.read(); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /itstack-demo-code-schedule/src/test/java/org/itstack/demo/test/MyQuartz.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.test; 2 | 3 | import org.itstack.demo.JobImpl; 4 | import org.quartz.*; 5 | import org.quartz.impl.StdSchedulerFactory; 6 | 7 | import java.util.Date; 8 | 9 | public class MyQuartz { 10 | 11 | public static void main(String[] args) throws SchedulerException { 12 | 13 | // 创建调度器 14 | SchedulerFactory schedulerFactory = new StdSchedulerFactory(); 15 | Scheduler scheduler = schedulerFactory.getScheduler(); 16 | 17 | // 创建任务 18 | JobDetail jobDetail = JobBuilder.newJob(JobImpl.class).withIdentity("myJob", "jobGroup").build(); 19 | 20 | // 创建触发器 21 | // withIntervalInSeconds(2)表示每隔2s执行任务 22 | Date triggerDate = new Date(); 23 | SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever(); 24 | TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger().withIdentity("myTrigger", "triggerGroup"); 25 | Trigger trigger = triggerBuilder.startAt(triggerDate).withSchedule(scheduleBuilder).build(); 26 | 27 | // 将任务及其触发器放入调度器 28 | scheduler.scheduleJob(jobDetail, trigger); 29 | // 调度器开始调度任务 30 | scheduler.start(); 31 | 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /itstack-demo-code-schedule/src/test/java/org/itstack/demo/test/MyTask.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.test; 2 | 3 | import org.itstack.demo.DemoTask; 4 | import org.quartz.JobDetail; 5 | import org.quartz.impl.JobDetailImpl; 6 | import org.springframework.scheduling.quartz.CronTriggerFactoryBean; 7 | import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean; 8 | import org.springframework.scheduling.quartz.SchedulerFactoryBean; 9 | 10 | import java.io.IOException; 11 | import java.text.ParseException; 12 | 13 | public class MyTask { 14 | 15 | public static void main(String[] args) throws Exception { 16 | 17 | DemoTask demoTask = new DemoTask(); 18 | 19 | // 定义了;执行的内容(job) 20 | MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean = new MethodInvokingJobDetailFactoryBean(); 21 | methodInvokingJobDetailFactoryBean.setTargetObject(demoTask); 22 | methodInvokingJobDetailFactoryBean.setTargetMethod("execute"); 23 | methodInvokingJobDetailFactoryBean.setConcurrent(true); 24 | methodInvokingJobDetailFactoryBean.setName("demoTask"); 25 | methodInvokingJobDetailFactoryBean.afterPropertiesSet(); 26 | 27 | // 定义了;执行的计划(trigger) 28 | CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean(); 29 | cronTriggerFactoryBean.setJobDetail(methodInvokingJobDetailFactoryBean.getObject()); 30 | cronTriggerFactoryBean.setCronExpression("0/50 * * * * ?"); 31 | cronTriggerFactoryBean.setName("demoTask"); 32 | cronTriggerFactoryBean.afterPropertiesSet(); 33 | 34 | // 调度了;执行的计划(scheduler) 35 | SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); 36 | schedulerFactoryBean.setTriggers(cronTriggerFactoryBean.getObject()); 37 | schedulerFactoryBean.setAutoStartup(true); 38 | schedulerFactoryBean.afterPropertiesSet(); 39 | 40 | schedulerFactoryBean.start(); 41 | 42 | // 暂停住 43 | System.in.read(); 44 | 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /itstack-demo-code-schedule/src/test/java/org/itstack/demo/test/TestCronExpression.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.test; 2 | 3 | import org.quartz.CronExpression; 4 | 5 | import java.text.ParseException; 6 | import java.text.SimpleDateFormat; 7 | import java.util.Date; 8 | import java.util.TimeZone; 9 | 10 | public class TestCronExpression { 11 | 12 | public static void main(String[] args) throws ParseException { 13 | CronExpression cronExpression = new CronExpression("0/5 * * * * ?"); 14 | cronExpression.setTimeZone(TimeZone.getDefault()); 15 | SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 16 | System.out.println(simpleDateFormat.format(cronExpression.getTimeAfter(new Date()))); 17 | System.out.println(simpleDateFormat.format(cronExpression.getTimeAfter(new Date()))); 18 | System.out.println(simpleDateFormat.format(cronExpression.getTimeAfter(new Date()))); 19 | System.out.println(simpleDateFormat.format(cronExpression.getTimeAfter(new Date()))); 20 | System.out.println(simpleDateFormat.format(cronExpression.getTimeAfter(new Date()))); 21 | System.out.println(simpleDateFormat.format(cronExpression.getTimeAfter(new Date()))); 22 | System.out.println(simpleDateFormat.format(cronExpression.getTimeAfter(new Date()))); 23 | System.out.println(simpleDateFormat.format(cronExpression.getTimeAfter(new Date()))); 24 | 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /itstack-demo-code-spring/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | itstack-demo-code 7 | org.itstack.demo 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | itstack-demo-code-spring 13 | 14 | 15 | -------------------------------------------------------------------------------- /itstack-demo-code-spring/src/main/java/org/itstack/demo/IUserDao.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo; 2 | 3 | /** 4 | * 公众号 | bugstack虫洞栈 5 | * 博 客 | https://bugstack.cn 6 | * Create by 小傅哥 @2020 7 | */ 8 | public interface IUserDao { 9 | 10 | String queryUserInfo(); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /itstack-demo-code-spring/src/main/java/org/itstack/demo/UserService.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo; 2 | 3 | public class UserService { 4 | 5 | public String queryUserInfo(Long userId) { 6 | return "花花 id:" + userId; 7 | } 8 | 9 | } 10 | -------------------------------------------------------------------------------- /itstack-demo-code-spring/src/main/java/org/itstack/demo/bean/ProxyBeanFactory.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.bean; 2 | 3 | import org.itstack.demo.IUserDao; 4 | import org.springframework.beans.factory.FactoryBean; 5 | 6 | import java.lang.reflect.InvocationHandler; 7 | import java.lang.reflect.Proxy; 8 | 9 | /** 10 | * 博 客:http://bugstack.cn 11 | * 公众号:bugstack虫洞栈 | 沉淀、分享、成长,让自己和他人都能有所收获! 12 | * create by 付政委 on @2019 13 | */ 14 | public class ProxyBeanFactory implements FactoryBean { 15 | 16 | @Override 17 | public Object getObject() throws Exception { 18 | 19 | ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 20 | Class[] classes = {IUserDao.class}; 21 | InvocationHandler handler = (proxy, method, args) -> "你被代理了 " + method.getName(); 22 | 23 | return Proxy.newProxyInstance(classLoader, classes, handler); 24 | } 25 | 26 | @Override 27 | public Class getObjectType() { 28 | return IUserDao.class; 29 | } 30 | 31 | @Override 32 | public boolean isSingleton() { 33 | return true; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /itstack-demo-code-spring/src/main/java/org/itstack/demo/bean/RegisterBeanFactory.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.bean; 2 | 3 | import org.springframework.beans.BeansException; 4 | import org.springframework.beans.factory.BeanFactory; 5 | import org.springframework.beans.factory.config.BeanDefinition; 6 | import org.springframework.beans.factory.config.BeanDefinitionHolder; 7 | import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; 8 | import org.springframework.beans.factory.support.*; 9 | 10 | /** 11 | * 博 客:http://bugstack.cn 12 | * 公众号:bugstack虫洞栈 | 沉淀、分享、成长,让自己和他人都能有所收获! 13 | * create by 付政委 on @2019 14 | */ 15 | public class RegisterBeanFactory implements BeanDefinitionRegistryPostProcessor { 16 | 17 | @Override 18 | public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { 19 | 20 | GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); 21 | beanDefinition.setBeanClass(ProxyBeanFactory.class); 22 | 23 | BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(beanDefinition, "userDao"); 24 | 25 | BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, registry); 26 | 27 | } 28 | 29 | @Override 30 | public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 31 | // left intentionally blank 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /itstack-demo-code-spring/src/main/resources/spring-config.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /itstack-demo-code-spring/src/test/java/org/itstack/demo/test/ApiTest.java: -------------------------------------------------------------------------------- 1 | package org.itstack.demo.test; 2 | 3 | import org.itstack.demo.IUserDao; 4 | import org.itstack.demo.UserService; 5 | import org.junit.Test; 6 | import org.slf4j.Logger; 7 | import org.slf4j.LoggerFactory; 8 | import org.springframework.beans.factory.BeanFactory; 9 | import org.springframework.beans.factory.xml.DefaultDocumentLoader; 10 | import org.springframework.beans.factory.xml.DocumentLoader; 11 | import org.springframework.beans.factory.xml.ResourceEntityResolver; 12 | import org.springframework.beans.factory.xml.XmlBeanFactory; 13 | import org.springframework.context.support.ClassPathXmlApplicationContext; 14 | import org.springframework.core.io.ClassPathResource; 15 | import org.springframework.core.io.support.EncodedResource; 16 | import org.springframework.core.io.support.PathMatchingResourcePatternResolver; 17 | import org.w3c.dom.Document; 18 | import org.w3c.dom.Element; 19 | import org.w3c.dom.Node; 20 | import org.w3c.dom.NodeList; 21 | import org.xml.sax.InputSource; 22 | import org.xml.sax.helpers.DefaultHandler; 23 | 24 | public class ApiTest { 25 | 26 | private Logger logger = LoggerFactory.getLogger(ApiTest.class); 27 | 28 | @Test 29 | public void test_XmlBeanFactory() { 30 | BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml")); 31 | UserService userService = beanFactory.getBean("userService", UserService.class); 32 | logger.info("测试结果:{}", userService.queryUserInfo(1000L)); 33 | } 34 | 35 | @Test 36 | public void test_ClassPathXmlApplicationContext() { 37 | BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring-config.xml"); 38 | UserService userService = beanFactory.getBean("userService", UserService.class); 39 | logger.info("测试结果:{}", userService.queryUserInfo(1000L)); 40 | } 41 | 42 | @Test 43 | public void test_DocumentLoader() throws Exception { 44 | 45 | // 设置资源 46 | EncodedResource encodedResource = new EncodedResource(new ClassPathResource("spring-config.xml")); 47 | 48 | // 加载解析 49 | InputSource inputSource = new InputSource(encodedResource.getResource().getInputStream()); 50 | DocumentLoader documentLoader = new DefaultDocumentLoader(); 51 | Document doc = documentLoader.loadDocument(inputSource, new ResourceEntityResolver(new PathMatchingResourcePatternResolver()), new DefaultHandler(), 3, false); 52 | 53 | // 输出结果 54 | Element root = doc.getDocumentElement(); 55 | NodeList nodeList = root.getChildNodes(); 56 | for (int i = 0; i < nodeList.getLength(); i++) { 57 | Node node = nodeList.item(i); 58 | if (!(node instanceof Element)) continue; 59 | Element ele = (Element) node; 60 | if (!"bean".equals(ele.getNodeName())) continue; 61 | String id = ele.getAttribute("id"); 62 | String clazz = ele.getAttribute("class"); 63 | String scope = ele.getAttribute("scope"); 64 | logger.info("测试结果 beanName:{} beanClass:{} scope:{}", id, clazz, scope); 65 | } 66 | 67 | } 68 | 69 | @Test 70 | public void test_IUserDao() { 71 | BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring-config.xml"); 72 | IUserDao userDao = beanFactory.getBean("userDao", IUserDao.class); 73 | String res = userDao.queryUserInfo(); 74 | logger.info("测试结果:{}", res); 75 | } 76 | 77 | } 78 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | org.itstack.demo 8 | itstack-demo-code 9 | pom 10 | 1.0-SNAPSHOT 11 | 12 | 13 | itstack-demo-code-mybatis 14 | itstack-demo-code-schedule 15 | itstack-demo-code-proxy 16 | itstack-demo-code-idea 17 | itstack-demo-code-spring 18 | 19 | 20 | 21 | 22 | 1.8 23 | UTF-8 24 | 25 | 3.8.1 26 | 1.2.60 27 | 4.12 28 | 1.0.9 29 | 5.1.20 30 | 2.2.1.GA 31 | 1.7.7 32 | 4.3.24.RELEASE 33 | 3.1.1.RELEASE 34 | 2.5 35 | 3.4.6 36 | 1.3.2 37 | 38 | 39 | 40 | 41 | org.quartz-scheduler 42 | quartz 43 | 2.3.2 44 | 45 | 46 | org.aspectj 47 | aspectjweaver 48 | 1.6.12 49 | 50 | 51 | org.aspectj 52 | aspectjrt 53 | 1.6.12 54 | 55 | 56 | 57 | org.apache.commons 58 | commons-dbcp2 59 | 2.5.0 60 | 61 | 62 | org.apache.commons 63 | commons-pool2 64 | 2.5.0 65 | 66 | 67 | 68 | org.mybatis 69 | mybatis-spring 70 | ${mybatis-spring.version} 71 | 72 | 73 | 74 | org.mybatis 75 | mybatis 76 | ${mybatis.version} 77 | 78 | 79 | 80 | org.apache.commons 81 | commons-lang3 82 | ${commons-lang3.version} 83 | 84 | 85 | 86 | com.alibaba 87 | fastjson 88 | ${fastjson.version} 89 | 90 | 91 | 92 | junit 93 | junit 94 | ${junit.version} 95 | test 96 | 97 | 98 | 99 | ch.qos.logback 100 | logback-classic 101 | ${logback.version} 102 | 103 | 104 | slf4j-api 105 | org.slf4j 106 | 107 | 108 | 109 | 110 | 111 | mysql 112 | mysql-connector-java 113 | ${mysql.version} 114 | 115 | 116 | 117 | org.jboss.resteasy 118 | resteasy-jaxrs 119 | ${resteasy.version} 120 | 121 | 122 | org.jboss.resteasy 123 | jaxrs-api 124 | ${resteasy.version} 125 | 126 | 127 | org.jboss.resteasy 128 | resteasy-jaxb-provider 129 | ${resteasy.version} 130 | 131 | 132 | org.jboss.resteasy 133 | resteasy-spring 134 | ${resteasy.version} 135 | 136 | 137 | 138 | org.slf4j 139 | slf4j-api 140 | ${slf4j.version} 141 | 142 | 143 | 144 | org.springframework 145 | spring-core 146 | ${spring.version} 147 | 148 | 149 | org.springframework 150 | spring-test 151 | ${spring.version} 152 | test 153 | 154 | 155 | org.springframework 156 | spring-context 157 | ${spring.version} 158 | 159 | 160 | org.springframework 161 | spring-context-support 162 | ${spring.version} 163 | 164 | 165 | org.springframework 166 | spring-beans 167 | ${spring.version} 168 | 169 | 170 | org.springframework 171 | spring-jdbc 172 | ${spring.version} 173 | 174 | 175 | org.springframework 176 | spring-aop 177 | ${spring.version} 178 | 179 | 180 | org.springframework 181 | spring-orm 182 | ${spring-orm.version} 183 | 184 | 185 | org.springframework 186 | spring-web 187 | ${spring.version} 188 | 189 | 190 | org.springframework 191 | spring-aspects 192 | ${spring.version} 193 | 194 | 195 | org.springframework 196 | spring-tx 197 | ${spring.version} 198 | 199 | 200 | javax.servlet 201 | servlet-api 202 | ${servlet-api.version} 203 | provided 204 | 205 | 206 | 207 | 208 | 209 | 210 | src/main/resources 211 | true 212 | 213 | 214 | src/assembly/resources 215 | false 216 | 217 | 218 | 219 | 220 | src/test/resources 221 | true 222 | 223 | 224 | src/main/resources 225 | true 226 | 227 | 228 | 229 | 230 | 231 | org.apache.maven.plugins 232 | maven-compiler-plugin 233 | 2.3.2 234 | 235 | ${jdk.version} 236 | ${jdk.version} 237 | ${sourceEncoding} 238 | true 239 | 240 | 241 | 242 | 243 | org.apache.maven.plugins 244 | maven-surefire-plugin 245 | 2.6 246 | 247 | true 248 | 249 | 250 | **/*Test.java 251 | 252 | 253 | 254 | 255 | 256 | org.apache.maven.plugins 257 | maven-war-plugin 258 | 2.1.1 259 | 260 | 261 | 262 | org.apache.maven.plugins 263 | maven-jar-plugin 264 | 2.3.1 265 | 266 | 267 | org.apache.maven.plugins 268 | maven-eclipse-plugin 269 | 2.8 270 | 271 | 272 | 273 | org.apache.maven.plugins 274 | maven-resources-plugin 275 | 2.4.3 276 | 277 | ${sourceEncoding} 278 | 279 | 280 | 281 | 282 | maven-source-plugin 283 | 2.0.4 284 | 285 | 286 | attach-sources 287 | 288 | jar 289 | 290 | 291 | 292 | 293 | 294 | org.zeroturnaround 295 | jrebel-maven-plugin 296 | 1.1.3 297 | 298 | 299 | 300 | 301 | --------------------------------------------------------------------------------