├── 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 |
--------------------------------------------------------------------------------