Commit 59a3fc51f270317704ecccf9c57c6021b71acf6e

Authored by wangbin
0 parents
Exists in master

1.较为完整的第一版

.gitignore 0 → 100644
  1 +++ a/.gitignore
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +# Ignore Gradle project-specific cache directory
  2 +.gradle
  3 +
  4 +# Ignore Gradle build output directory
  5 +build
  6 +.classpath
  7 +bin
  8 +.gradle
  9 +.project
  10 +.settings
build.gradle 0 → 100644
  1 +++ a/build.gradle
@@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
  1 +/*
  2 + * This file was generated by the Gradle 'init' task.
  3 + *
  4 + * This generated file contains a sample Java Library project to get you started.
  5 + * For more details take a look at the Java Libraries chapter in the Gradle
  6 + * User Manual available at https://docs.gradle.org/5.3-rc-3/userguide/java_library_plugin.html
  7 + */
  8 +
  9 +plugins {
  10 + // Apply the java-library plugin to add support for Java Library
  11 + id 'java'
  12 + id 'org.springframework.boot' version '2.1.3.RELEASE'
  13 +}
  14 +
  15 +apply plugin: 'java'
  16 +apply plugin: 'io.spring.dependency-management'
  17 +
  18 +repositories {
  19 + // Use jcenter for resolving your dependencies.
  20 + // You can declare any Maven/Ivy/file repository here.
  21 + jcenter()
  22 +}
  23 +
  24 +dependencies {
  25 + implementation('org.springframework.boot:spring-boot-starter')
  26 + implementation('org.springframework.boot:spring-boot-starter-web'){
  27 + exclude group:'org.springframework.boot',module:'spring-boot-starter-tomcat'
  28 + }
  29 + implementation('org.springframework.boot:spring-boot-starter-jetty')
  30 + implementation('org.springframework.boot:spring-boot-starter-data-jdbc')
  31 + implementation('mysql:mysql-connector-java')
  32 + implementation('org.springframework.boot:spring-boot-starter-data-jpa')
  33 + implementation('org.springframework.boot:spring-boot-starter-data-redis'){
  34 + exclude module:'lettuce'
  35 + }
  36 + implementation('redis.clients:jedis')
  37 + implementation('com.alibaba:druid-spring-boot-starter:1.1.10')
  38 +}
gradle/wrapper/gradle-wrapper.jar 0 → 100644
No preview for this file type
gradle/wrapper/gradle-wrapper.properties 0 → 100644
  1 +++ a/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +distributionBase=GRADLE_USER_HOME
  2 +distributionPath=wrapper/dists
  3 +distributionUrl=https\://services.gradle.org/distributions/gradle-5.3-rc-3-bin.zip
  4 +zipStoreBase=GRADLE_USER_HOME
  5 +zipStorePath=wrapper/dists
gradlew 0 → 100755
  1 +++ a/gradlew
@@ -0,0 +1,188 @@ @@ -0,0 +1,188 @@
  1 +#!/usr/bin/env sh
  2 +
  3 +#
  4 +# Copyright 2015 the original author or authors.
  5 +#
  6 +# Licensed under the Apache License, Version 2.0 (the "License");
  7 +# you may not use this file except in compliance with the License.
  8 +# You may obtain a copy of the License at
  9 +#
  10 +# http://www.apache.org/licenses/LICENSE-2.0
  11 +#
  12 +# Unless required by applicable law or agreed to in writing, software
  13 +# distributed under the License is distributed on an "AS IS" BASIS,
  14 +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15 +# See the License for the specific language governing permissions and
  16 +# limitations under the License.
  17 +#
  18 +
  19 +##############################################################################
  20 +##
  21 +## Gradle start up script for UN*X
  22 +##
  23 +##############################################################################
  24 +
  25 +# Attempt to set APP_HOME
  26 +# Resolve links: $0 may be a link
  27 +PRG="$0"
  28 +# Need this for relative symlinks.
  29 +while [ -h "$PRG" ] ; do
  30 + ls=`ls -ld "$PRG"`
  31 + link=`expr "$ls" : '.*-> \(.*\)$'`
  32 + if expr "$link" : '/.*' > /dev/null; then
  33 + PRG="$link"
  34 + else
  35 + PRG=`dirname "$PRG"`"/$link"
  36 + fi
  37 +done
  38 +SAVED="`pwd`"
  39 +cd "`dirname \"$PRG\"`/" >/dev/null
  40 +APP_HOME="`pwd -P`"
  41 +cd "$SAVED" >/dev/null
  42 +
  43 +APP_NAME="Gradle"
  44 +APP_BASE_NAME=`basename "$0"`
  45 +
  46 +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
  47 +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
  48 +
  49 +# Use the maximum available, or set MAX_FD != -1 to use that value.
  50 +MAX_FD="maximum"
  51 +
  52 +warn () {
  53 + echo "$*"
  54 +}
  55 +
  56 +die () {
  57 + echo
  58 + echo "$*"
  59 + echo
  60 + exit 1
  61 +}
  62 +
  63 +# OS specific support (must be 'true' or 'false').
  64 +cygwin=false
  65 +msys=false
  66 +darwin=false
  67 +nonstop=false
  68 +case "`uname`" in
  69 + CYGWIN* )
  70 + cygwin=true
  71 + ;;
  72 + Darwin* )
  73 + darwin=true
  74 + ;;
  75 + MINGW* )
  76 + msys=true
  77 + ;;
  78 + NONSTOP* )
  79 + nonstop=true
  80 + ;;
  81 +esac
  82 +
  83 +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
  84 +
  85 +# Determine the Java command to use to start the JVM.
  86 +if [ -n "$JAVA_HOME" ] ; then
  87 + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
  88 + # IBM's JDK on AIX uses strange locations for the executables
  89 + JAVACMD="$JAVA_HOME/jre/sh/java"
  90 + else
  91 + JAVACMD="$JAVA_HOME/bin/java"
  92 + fi
  93 + if [ ! -x "$JAVACMD" ] ; then
  94 + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
  95 +
  96 +Please set the JAVA_HOME variable in your environment to match the
  97 +location of your Java installation."
  98 + fi
  99 +else
  100 + JAVACMD="java"
  101 + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
  102 +
  103 +Please set the JAVA_HOME variable in your environment to match the
  104 +location of your Java installation."
  105 +fi
  106 +
  107 +# Increase the maximum file descriptors if we can.
  108 +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
  109 + MAX_FD_LIMIT=`ulimit -H -n`
  110 + if [ $? -eq 0 ] ; then
  111 + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
  112 + MAX_FD="$MAX_FD_LIMIT"
  113 + fi
  114 + ulimit -n $MAX_FD
  115 + if [ $? -ne 0 ] ; then
  116 + warn "Could not set maximum file descriptor limit: $MAX_FD"
  117 + fi
  118 + else
  119 + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
  120 + fi
  121 +fi
  122 +
  123 +# For Darwin, add options to specify how the application appears in the dock
  124 +if $darwin; then
  125 + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
  126 +fi
  127 +
  128 +# For Cygwin, switch paths to Windows format before running java
  129 +if $cygwin ; then
  130 + APP_HOME=`cygpath --path --mixed "$APP_HOME"`
  131 + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
  132 + JAVACMD=`cygpath --unix "$JAVACMD"`
  133 +
  134 + # We build the pattern for arguments to be converted via cygpath
  135 + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
  136 + SEP=""
  137 + for dir in $ROOTDIRSRAW ; do
  138 + ROOTDIRS="$ROOTDIRS$SEP$dir"
  139 + SEP="|"
  140 + done
  141 + OURCYGPATTERN="(^($ROOTDIRS))"
  142 + # Add a user-defined pattern to the cygpath arguments
  143 + if [ "$GRADLE_CYGPATTERN" != "" ] ; then
  144 + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
  145 + fi
  146 + # Now convert the arguments - kludge to limit ourselves to /bin/sh
  147 + i=0
  148 + for arg in "$@" ; do
  149 + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
  150 + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
  151 +
  152 + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
  153 + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
  154 + else
  155 + eval `echo args$i`="\"$arg\""
  156 + fi
  157 + i=$((i+1))
  158 + done
  159 + case $i in
  160 + (0) set -- ;;
  161 + (1) set -- "$args0" ;;
  162 + (2) set -- "$args0" "$args1" ;;
  163 + (3) set -- "$args0" "$args1" "$args2" ;;
  164 + (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
  165 + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
  166 + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
  167 + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
  168 + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
  169 + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
  170 + esac
  171 +fi
  172 +
  173 +# Escape application args
  174 +save () {
  175 + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
  176 + echo " "
  177 +}
  178 +APP_ARGS=$(save "$@")
  179 +
  180 +# Collect all arguments for the java command, following the shell quoting and substitution rules
  181 +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
  182 +
  183 +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
  184 +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
  185 + cd "$(dirname "$0")"
  186 +fi
  187 +
  188 +exec "$JAVACMD" "$@"
gradlew.bat 0 → 100644
  1 +++ a/gradlew.bat
@@ -0,0 +1,100 @@ @@ -0,0 +1,100 @@
  1 +@rem
  2 +@rem Copyright 2015 the original author or authors.
  3 +@rem
  4 +@rem Licensed under the Apache License, Version 2.0 (the "License");
  5 +@rem you may not use this file except in compliance with the License.
  6 +@rem You may obtain a copy of the License at
  7 +@rem
  8 +@rem http://www.apache.org/licenses/LICENSE-2.0
  9 +@rem
  10 +@rem Unless required by applicable law or agreed to in writing, software
  11 +@rem distributed under the License is distributed on an "AS IS" BASIS,
  12 +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 +@rem See the License for the specific language governing permissions and
  14 +@rem limitations under the License.
  15 +@rem
  16 +
  17 +@if "%DEBUG%" == "" @echo off
  18 +@rem ##########################################################################
  19 +@rem
  20 +@rem Gradle startup script for Windows
  21 +@rem
  22 +@rem ##########################################################################
  23 +
  24 +@rem Set local scope for the variables with windows NT shell
  25 +if "%OS%"=="Windows_NT" setlocal
  26 +
  27 +set DIRNAME=%~dp0
  28 +if "%DIRNAME%" == "" set DIRNAME=.
  29 +set APP_BASE_NAME=%~n0
  30 +set APP_HOME=%DIRNAME%
  31 +
  32 +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
  33 +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
  34 +
  35 +@rem Find java.exe
  36 +if defined JAVA_HOME goto findJavaFromJavaHome
  37 +
  38 +set JAVA_EXE=java.exe
  39 +%JAVA_EXE% -version >NUL 2>&1
  40 +if "%ERRORLEVEL%" == "0" goto init
  41 +
  42 +echo.
  43 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
  44 +echo.
  45 +echo Please set the JAVA_HOME variable in your environment to match the
  46 +echo location of your Java installation.
  47 +
  48 +goto fail
  49 +
  50 +:findJavaFromJavaHome
  51 +set JAVA_HOME=%JAVA_HOME:"=%
  52 +set JAVA_EXE=%JAVA_HOME%/bin/java.exe
  53 +
  54 +if exist "%JAVA_EXE%" goto init
  55 +
  56 +echo.
  57 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
  58 +echo.
  59 +echo Please set the JAVA_HOME variable in your environment to match the
  60 +echo location of your Java installation.
  61 +
  62 +goto fail
  63 +
  64 +:init
  65 +@rem Get command-line arguments, handling Windows variants
  66 +
  67 +if not "%OS%" == "Windows_NT" goto win9xME_args
  68 +
  69 +:win9xME_args
  70 +@rem Slurp the command line arguments.
  71 +set CMD_LINE_ARGS=
  72 +set _SKIP=2
  73 +
  74 +:win9xME_args_slurp
  75 +if "x%~1" == "x" goto execute
  76 +
  77 +set CMD_LINE_ARGS=%*
  78 +
  79 +:execute
  80 +@rem Setup the command line
  81 +
  82 +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
  83 +
  84 +@rem Execute Gradle
  85 +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
  86 +
  87 +:end
  88 +@rem End local scope for the variables with windows NT shell
  89 +if "%ERRORLEVEL%"=="0" goto mainEnd
  90 +
  91 +:fail
  92 +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
  93 +rem the _cmd.exe /c_ return code!
  94 +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
  95 +exit /b 1
  96 +
  97 +:mainEnd
  98 +if "%OS%"=="Windows_NT" endlocal
  99 +
  100 +:omega
settings.gradle 0 → 100644
  1 +++ a/settings.gradle
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +/*
  2 + * This file was generated by the Gradle 'init' task.
  3 + *
  4 + * The settings file is used to specify which projects to include in your build.
  5 + *
  6 + * Detailed information about configuring a multi-project build in Gradle can be found
  7 + * in the user manual at https://docs.gradle.org/5.3-rc-3/userguide/multi_project_builds.html
  8 + */
  9 +
  10 +rootProject.name = 'spring-boot-template'
src/main/java/com/springboot/template/Bootstrap.java 0 → 100644
  1 +++ a/src/main/java/com/springboot/template/Bootstrap.java
@@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
  1 +package com.springboot.template;
  2 +
  3 +import org.springframework.boot.SpringApplication;
  4 +import org.springframework.boot.autoconfigure.SpringBootApplication;
  5 +
  6 +/**
  7 + * 启动类
  8 + * @author wangbin
  9 + *
  10 + */
  11 +
  12 +@SpringBootApplication
  13 +public class Bootstrap {
  14 +
  15 + public static void main(String[] args) {
  16 + SpringApplication.run(Bootstrap.class, args);
  17 + }
  18 +
  19 +}
src/main/java/com/springboot/template/BootstrapContextListener.java 0 → 100644
  1 +++ a/src/main/java/com/springboot/template/BootstrapContextListener.java
@@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
  1 +package com.springboot.template;
  2 +
  3 +import javax.servlet.ServletContextEvent;
  4 +
  5 +import org.springframework.stereotype.Component;
  6 +
  7 +/**
  8 + * 上下文监听说明:
  9 + * 1.必须放在启动类平级目录
  10 + * @author wangbin
  11 + *
  12 + */
  13 +@Component
  14 +public class BootstrapContextListener implements javax.servlet.ServletContextListener{
  15 + @Override
  16 + public void contextInitialized(ServletContextEvent sce) {
  17 + System.out.println("ServletContextListener:contextInitialized()");
  18 + }
  19 +
  20 + @Override
  21 + public void contextDestroyed(ServletContextEvent sce) {
  22 + System.out.println("ServletContextListener:contextDestroyed()");
  23 + }
  24 +}
src/main/java/com/springboot/template/beanconfig/RedisConfig.java 0 → 100644
  1 +++ a/src/main/java/com/springboot/template/beanconfig/RedisConfig.java
@@ -0,0 +1,85 @@ @@ -0,0 +1,85 @@
  1 +package com.springboot.template.beanconfig;
  2 +
  3 +import org.springframework.beans.factory.annotation.Value;
  4 +import org.springframework.context.annotation.Bean;
  5 +import org.springframework.data.redis.connection.RedisConnectionFactory;
  6 +import org.springframework.data.redis.core.RedisTemplate;
  7 +import org.springframework.data.redis.serializer.StringRedisSerializer;
  8 +import org.springframework.stereotype.Component;
  9 +
  10 +@Component
  11 +public class RedisConfig{
  12 + @Value("${spring.redis.host}")
  13 + private String redisHost;
  14 + @Value("${spring.redis.port}")
  15 + private int redisPort;
  16 + @Value("${spring.redis.timeout}")
  17 + private int redisTimeout;
  18 + @Value("${spring.redis.password}")
  19 + private String redisAuth;
  20 + @Value("${spring.redis.database}")
  21 + private int redisDb;
  22 + @Value("${spring.redis.jedis.pool.max-active}")
  23 + private int maxActive;
  24 + @Value("${spring.redis.jedis.pool.max-wait}")
  25 + private int maxWait;
  26 + @Value("${spring.redis.jedis.pool.max-idle}")
  27 + private int maxIdle;
  28 + @Value("${spring.redis.jedis.pool.min-idle}")
  29 + private int minIdle;
  30 +
  31 + /**
  32 + * 1.注解bean标注的方法参数,会被扫描是否存在已经自动注入的bean
  33 + * 2.注解bean的返回对象会被自动注入到容器中
  34 + * @param redisConnectionFactory
  35 + * @return
  36 + */
  37 + @Bean
  38 + public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
  39 + /*//连接池配置
  40 + JedisPoolConfig poolConfig = new JedisPoolConfig();
  41 + poolConfig.setMaxTotal(maxActive);
  42 + poolConfig.setMaxIdle(maxIdle);
  43 + poolConfig.setMaxWaitMillis(maxWait);
  44 + poolConfig.setMinIdle(minIdle);
  45 + poolConfig.setTestOnBorrow(true);
  46 + poolConfig.setTestOnReturn(false);
  47 + poolConfig.setTestWhileIdle(true);
  48 + JedisClientConfiguration clientConfig = JedisClientConfiguration.builder()
  49 + .usePooling().poolConfig(poolConfig).and().readTimeout(Duration.ofMillis(redisTimeout)).build();
  50 +
  51 + // 单点redis
  52 + RedisStandaloneConfiguration redisConfig = new RedisStandaloneConfiguration();
  53 + // 哨兵redis
  54 + // RedisSentinelConfiguration redisConfig = new RedisSentinelConfiguration();
  55 + // 集群redis
  56 + // RedisClusterConfiguration redisConfig = new RedisClusterConfiguration();
  57 + redisConfig.setHostName(redisHost);
  58 + redisConfig.setPassword(RedisPassword.of(redisAuth));
  59 + redisConfig.setPort(redisPort);
  60 + redisConfig.setDatabase(redisDb);
  61 +
  62 + RedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory(redisConfig,clientConfig);
  63 + */
  64 +
  65 + /*
  66 + * JSON数据序列化处理
  67 + //ObjectMapper
  68 + ObjectMapper objectMapper = new ObjectMapper();
  69 + objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  70 + objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  71 +
  72 + //jackjson
  73 + Jackson2JsonRedisSerializer jackson = new Jackson2JsonRedisSerializer(Object.class);
  74 + jackson.setObjectMapper(objectMapper);
  75 + */
  76 +
  77 + //RESTTemplate
  78 + RedisTemplate<String, String> restTemplate = new RedisTemplate<String, String>();
  79 + restTemplate.setValueSerializer(new StringRedisSerializer());
  80 + restTemplate.setKeySerializer(new StringRedisSerializer());
  81 + restTemplate.setConnectionFactory(redisConnectionFactory);
  82 + restTemplate.afterPropertiesSet();
  83 + return restTemplate;
  84 + }
  85 +}
src/main/java/com/springboot/template/controller/DemoController.java 0 → 100644
  1 +++ a/src/main/java/com/springboot/template/controller/DemoController.java
@@ -0,0 +1,53 @@ @@ -0,0 +1,53 @@
  1 +package com.springboot.template.controller;
  2 +
  3 +import org.slf4j.Logger;
  4 +import org.slf4j.LoggerFactory;
  5 +import org.springframework.beans.factory.annotation.Autowired;
  6 +import org.springframework.stereotype.Controller;
  7 +import org.springframework.web.bind.annotation.GetMapping;
  8 +import org.springframework.web.bind.annotation.RequestMapping;
  9 +import org.springframework.web.bind.annotation.ResponseBody;
  10 +
  11 +import com.springboot.template.redis.HelloRedis;
  12 +import com.springboot.template.service.JdbcService;
  13 +
  14 +@Controller
  15 +@RequestMapping("/demo")
  16 +public class DemoController {
  17 + @Autowired
  18 + private JdbcService jdbcService;
  19 + @Autowired
  20 + private HelloRedis helloRedis;
  21 +
  22 + @RequestMapping("/sayHello")
  23 + @ResponseBody
  24 + public String sayHello() {
  25 + return "hello";
  26 + }
  27 +
  28 + @GetMapping("sayFromJdbc")
  29 + @ResponseBody
  30 + public String sayFromJdbc() {
  31 + return this.jdbcService.queryHello();
  32 + }
  33 +
  34 + @GetMapping("sayFromJpa")
  35 + @ResponseBody
  36 + public String sayFromJpa() {
  37 + return this.jdbcService.queryHelloFromJpa();
  38 + }
  39 +
  40 + @GetMapping("sayFromRedis")
  41 + @ResponseBody
  42 + public String sayFromRedis() {
  43 + return this.helloRedis.getName();
  44 + }
  45 +
  46 + @GetMapping("sayFromLogback")
  47 + @ResponseBody
  48 + public String sayFromLogback() {
  49 + Logger log = LoggerFactory.getLogger(this.getClass());
  50 + log.debug("HERE WE ARE!");
  51 + return "wang bin logback";
  52 + }
  53 +}
src/main/java/com/springboot/template/entity/HelloEntity.java 0 → 100644
  1 +++ a/src/main/java/com/springboot/template/entity/HelloEntity.java
@@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
  1 +package com.springboot.template.entity;
  2 +
  3 +import javax.persistence.Entity;
  4 +import javax.persistence.Id;
  5 +import javax.persistence.Table;
  6 +
  7 +
  8 +@Entity
  9 +@Table(name="hello")
  10 +public class HelloEntity {
  11 + @Id
  12 + private Long id;
  13 + private String name;
  14 + public Long getId() {
  15 + return id;
  16 + }
  17 + public void setId(Long id) {
  18 + this.id = id;
  19 + }
  20 + public String getName() {
  21 + return name;
  22 + }
  23 + public void setName(String name) {
  24 + this.name = name;
  25 + }
  26 +
  27 +
  28 +}
src/main/java/com/springboot/template/redis/HelloRedis.java 0 → 100644
  1 +++ a/src/main/java/com/springboot/template/redis/HelloRedis.java
@@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
  1 +package com.springboot.template.redis;
  2 +
  3 +import org.springframework.beans.factory.annotation.Autowired;
  4 +import org.springframework.data.redis.core.RedisTemplate;
  5 +import org.springframework.stereotype.Component;
  6 +
  7 +@Component
  8 +public class HelloRedis {
  9 + @Autowired
  10 + private RedisTemplate redisTemplate;
  11 +
  12 + public String getName() {
  13 + Object name = this.redisTemplate.opsForValue().get("name");
  14 + if(name == null) {
  15 + return "没有在Redis中找到name";
  16 + }else {
  17 + return name.toString();
  18 + }
  19 + }
  20 +}
src/main/java/com/springboot/template/reposity/HelloRepository.java 0 → 100644
  1 +++ a/src/main/java/com/springboot/template/reposity/HelloRepository.java
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +package com.springboot.template.reposity;
  2 +
  3 +import org.springframework.data.repository.CrudRepository;
  4 +
  5 +import com.springboot.template.entity.HelloEntity;
  6 +
  7 +public interface HelloRepository extends CrudRepository<HelloEntity, Long> {
  8 +
  9 +}
src/main/java/com/springboot/template/service/JdbcService.java 0 → 100644
  1 +++ a/src/main/java/com/springboot/template/service/JdbcService.java
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +package com.springboot.template.service;
  2 +
  3 +import org.springframework.stereotype.Component;
  4 +
  5 +public interface JdbcService {
  6 + public String queryHello();
  7 +
  8 + public String queryHelloFromJpa();
  9 +}
src/main/java/com/springboot/template/service/impl/JdbcServerImpl.java 0 → 100644
  1 +++ a/src/main/java/com/springboot/template/service/impl/JdbcServerImpl.java
@@ -0,0 +1,46 @@ @@ -0,0 +1,46 @@
  1 +package com.springboot.template.service.impl;
  2 +
  3 +import java.util.Map;
  4 +import java.util.Optional;
  5 +
  6 +import org.springframework.beans.factory.annotation.Autowired;
  7 +import org.springframework.jdbc.core.JdbcTemplate;
  8 +import org.springframework.stereotype.Component;
  9 +
  10 +import com.springboot.template.entity.HelloEntity;
  11 +import com.springboot.template.reposity.HelloRepository;
  12 +import com.springboot.template.service.JdbcService;
  13 +
  14 +@Component
  15 +public class JdbcServerImpl implements JdbcService{
  16 + @Autowired
  17 + private JdbcTemplate JdbcTemplte;
  18 + @Autowired
  19 + private HelloRepository helloRepository;
  20 +
  21 + @Override
  22 + public String queryHello() {
  23 + try {
  24 + Map<String, Object> data = this.JdbcTemplte.queryForMap("select * from demo.hello limit 1");
  25 + if(data.isEmpty()) {
  26 + return "没有发现任何数据";
  27 + }else {
  28 + return data.get("name").toString();
  29 + }
  30 + }catch(Exception e) {
  31 + e.printStackTrace();
  32 + return "数据库不存在记录";
  33 + }
  34 + }
  35 +
  36 + @Override
  37 + public String queryHelloFromJpa() {
  38 + Optional<HelloEntity> entity = this.helloRepository.findById(1L);
  39 + if(entity == null) {
  40 + return "没有找到ID=1对象";
  41 + }else {
  42 + return entity.get().getName();
  43 + }
  44 + }
  45 +
  46 +}
src/main/resources/application.properties 0 → 100644
  1 +++ a/src/main/resources/application.properties
@@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
  1 +server.port=8080
  2 +
  3 +spring.datasource.url=jdbc:mysql://localhost:3306/demo
  4 +spring.datasource.username=wangbin
  5 +spring.datasource.password=wangbin
  6 +spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  7 +spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
  8 +
  9 +spring.h2.console.enabled=true
  10 +spring.jpa.open-in-view=true
  11 +spring.data.jpa.repositories.bootstrap-mode=default
  12 +logging.level.org.hibernate.SQL=debug
  13 +
  14 +#允许覆盖bean注入
  15 +spring.main.allow-bean-definition-overriding=true
  16 +
  17 +#redis配置
  18 +spring.redis.host=localhost
  19 +spring.redis.port=6379
  20 +spring.redis.timeout=30
  21 +spring.redis.password=
  22 +spring.redis.database=0
  23 +spring.redis.jedis.pool.max-idle=8
  24 +spring.redis.jedis.pool.min-idle=0
  25 +spring.redis.jedis.pool.max-active=8
  26 +spring.redis.jedis.pool.max-wait=-1
  27 +
  28 +logging.config=classpath:logback-spring.xml
  29 +logging.path=/home/wangbin/logs/
src/main/resources/logback-spring.xml 0 → 100644
  1 +++ a/src/main/resources/logback-spring.xml
@@ -0,0 +1,140 @@ @@ -0,0 +1,140 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<configuration>
  3 + <!--
  4 + 说明:
  5 + 1、日志级别及文件
  6 + 日志记录采用分级记录,级别与日志文件名相对应,不同级别的日志信息记录到不同的日志文件中
  7 + 例如:error级别记录到log_error_xxx.log或log_error.log(该文件为当前记录的日志文件),而log_error_xxx.log为归档日志,
  8 + 日志文件按日期记录,同一天内,若日志文件大小等于或大于2M,则按0、1、2...顺序分别命名
  9 + 例如log-level-2013-12-21.0.log
  10 + 其它级别的日志也是如此。
  11 + 2、文件路径
  12 + 若开发、测试用,在Eclipse中运行项目,则到Eclipse的安装路径查找logs文件夹,以相对路径../logs。
  13 + 若部署到Tomcat下,则在Tomcat下的logs文件中
  14 + 3、Appender
  15 + FILEERROR对应error级别,文件名以log-error-xxx.log形式命名
  16 + FILEWARN对应warn级别,文件名以log-warn-xxx.log形式命名
  17 + FILEINFO对应info级别,文件名以log-info-xxx.log形式命名
  18 + FILEDEBUG对应debug级别,文件名以log-debug-xxx.log形式命名
  19 + stdout将日志信息输出到控制上,为方便开发测试使用
  20 + -->
  21 + <contextName>SpringBootDemo</contextName>
  22 + <property name="LOG_PATH" value="/home/wangbin/logs/" />
  23 + <!--设置系统日志目录-->
  24 + <property name="APPDIR" value="SpringBootDemo" />
  25 +
  26 + <!-- 日志记录器,日期滚动记录 -->
  27 + <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
  28 + <!-- 正在记录的日志文件的路径及文件名 -->
  29 + <file>${LOG_PATH}/${APPDIR}/log_error.log</file>
  30 + <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
  31 + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  32 + <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
  33 + 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
  34 + <fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  35 + <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
  36 + 命名日志文件,例如log-error-2013-12-21.0.log -->
  37 + <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  38 + <maxFileSize>2MB</maxFileSize>
  39 + </timeBasedFileNamingAndTriggeringPolicy>
  40 + </rollingPolicy>
  41 + <!-- 追加方式记录日志 -->
  42 + <append>true</append>
  43 + <!-- 日志文件的格式 -->
  44 + <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  45 + <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
  46 + <charset>utf-8</charset>
  47 + </encoder>
  48 + <!-- 此日志文件只记录info级别的 -->
  49 + <filter class="ch.qos.logback.classic.filter.LevelFilter">
  50 + <level>error</level>
  51 + <onMatch>ACCEPT</onMatch>
  52 + <onMismatch>DENY</onMismatch>
  53 + </filter>
  54 + </appender>
  55 +
  56 + <!-- 日志记录器,日期滚动记录 -->
  57 + <appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
  58 + <!-- 正在记录的日志文件的路径及文件名 -->
  59 + <file>${LOG_PATH}/${APPDIR}/log_warn.log</file>
  60 + <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
  61 + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  62 + <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
  63 + 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
  64 + <fileNamePattern>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  65 + <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
  66 + 命名日志文件,例如log-error-2013-12-21.0.log -->
  67 + <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  68 + <maxFileSize>2MB</maxFileSize>
  69 + </timeBasedFileNamingAndTriggeringPolicy>
  70 + </rollingPolicy>
  71 + <!-- 追加方式记录日志 -->
  72 + <append>true</append>
  73 + <!-- 日志文件的格式 -->
  74 + <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  75 + <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
  76 + <charset>utf-8</charset>
  77 + </encoder>
  78 + <!-- 此日志文件只记录info级别的 -->
  79 + <filter class="ch.qos.logback.classic.filter.LevelFilter">
  80 + <level>warn</level>
  81 + <onMatch>ACCEPT</onMatch>
  82 + <onMismatch>DENY</onMismatch>
  83 + </filter>
  84 + </appender>
  85 +
  86 + <!-- 日志记录器,日期滚动记录 -->
  87 + <appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
  88 + <!-- 正在记录的日志文件的路径及文件名 -->
  89 + <file>${LOG_PATH}/${APPDIR}/log_info.log</file>
  90 + <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
  91 + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  92 + <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
  93 + 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
  94 + <fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  95 + <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
  96 + 命名日志文件,例如log-error-2013-12-21.0.log -->
  97 + <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  98 + <maxFileSize>2MB</maxFileSize>
  99 + </timeBasedFileNamingAndTriggeringPolicy>
  100 + </rollingPolicy>
  101 + <!-- 追加方式记录日志 -->
  102 + <append>true</append>
  103 + <!-- 日志文件的格式 -->
  104 + <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  105 + <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
  106 + <charset>utf-8</charset>
  107 + </encoder>
  108 + <!-- 此日志文件只记录info级别的 -->
  109 + <filter class="ch.qos.logback.classic.filter.LevelFilter">
  110 + <level>info</level>
  111 + <onMatch>ACCEPT</onMatch>
  112 + <onMismatch>DENY</onMismatch>
  113 + </filter>
  114 + </appender>
  115 +
  116 + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  117 + <!--encoder 默认配置为PatternLayoutEncoder-->
  118 + <encoder>
  119 + <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
  120 + <charset>utf-8</charset>
  121 + </encoder>
  122 + <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
  123 + <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  124 + <level>debug</level>
  125 + </filter>
  126 + </appender>
  127 +
  128 + <logger name="org.springframework" level="WARN" />
  129 + <logger name="org.hibernate" level="WARN" />
  130 +
  131 + <!-- 生产环境下,将此级别配置为适合的级别,以免日志文件太多或影响程序性能 -->
  132 + <root level="INFO">
  133 + <appender-ref ref="FILEERROR" />
  134 + <appender-ref ref="FILEWARN" />
  135 + <appender-ref ref="FILEINFO" />
  136 +
  137 + <!-- 生产环境将请stdout,testfile去掉 -->
  138 + <appender-ref ref="STDOUT" />
  139 + </root>
  140 +</configuration>
0 \ No newline at end of file 141 \ No newline at end of file