此僅僅為web最基本框架, 統一異常管理、接口統一日志管理。
項目結構:
注:
修改為如下圖,作用是sql打印輸出。
源碼下載:https://files.cnblogs.com/files/007sx/jarfk_v3.zip
以上為jar方式使用ieda內嵌tomcat啟動,如果想打包成war包,使用外部tomcat啟動需要進行如下修改:
1. 將項目的啟動類JarfkApplication.java繼承SpringBootServletInitializer並重寫configure方法:
package com.jarfk; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; @SpringBootApplication @MapperScan("com.jarfk.mapper*") public class JarfkApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(JarfkApplication.class); } public static void main(String[] args) { SpringApplication.run(JarfkApplication.class, args); } }
2. pom.xml中:
<groupId>com.jarfk</groupId> <artifactId>fack</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging>
改為:
<groupId>com.jarfk</groupId> <artifactId>fack</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging>
新增:
<!-- 打war包時加入此項, 告訴spring-boot tomcat相關jar包用外部的,不要打進去 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
<plugins>里面注釋:
<!-- 如果要打成jar包並使用 java -jar **.jar運行,請不要注釋spring-boot-maven-plugin --> <!--<plugin>--> <!--<groupId>org.springframework.boot</groupId>--> <!--<artifactId>spring-boot-maven-plugin</artifactId>--> <!--</plugin>-->
完成即可。
如果想使用自定義log4j日志輸出,可以如下配置:
1. pom.xml中添加:
<!-- log4j日志 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.21</version> </dependency>
2. 在resources目錄下新建log4j.properties,內容如下:
log4j.rootLogger=DEBUG, stdout
######################### logger ##############################
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.conversionPattern = %d [%t] %-5p %c - %m%n
#日志級別是INFO,標簽是extProfile
log4j.logger.extProfile=DEBUG, extProfile
#輸出到指定文件extProfile.log中
log4j.additivity.extProfile=false;
log4j.appender.extProfile=org.apache.log4j.RollingFileAppender
#輸出到resin根目錄的logs文件夾,log4j會自動生成目錄和文件
log4j.appender.extProfile.File=logs/extProfile.log
#超過20M就重新創建一個文件
log4j.appender.extProfile.MaxFileSize=20480KB
log4j.appender.extProfile.MaxBackupIndex=10
log4j.appender.extProfile.layout=org.apache.log4j.PatternLayout
log4j.appender.extProfile.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
完成以上兩步即可,以上是 org.apache.log4j.Logger 類型的日志配置。
如果想同時設置 org.slf4j.LoggerFactory 類型日志,可進行如下操作:
application.yml中日志的設置注釋掉:
然后再資源目錄resources下新建 logback.xml 即可,如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑--> <property name="LOG_HOME" value="/spring-boot-log" /> <!-- 控制台輸出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>GBK</charset> </encoder> </appender> <!-- 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件輸出的文件名--> <FileNamePattern>${LOG_HOME}/web.log.%d{yyyy-MM-dd}.log</FileNamePattern> <!--日志文件保留天數--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <!-- show parameters for hibernate sql 專為 Hibernate 定制 --> <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" /> <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" /> <logger name="org.hibernate.SQL" level="DEBUG" /> <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" /> <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" /> <!--myibatis log configure--> <logger name="com.apache.ibatis" level="TRACE"/> <logger name="java.sql.Connection" level="DEBUG"/> <logger name="java.sql.Statement" level="DEBUG"/> <logger name="java.sql.PreparedStatement" level="DEBUG"/> <!-- 日志輸出級別 --> <root level="DEBUG"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </root> <!--日志異步到數據庫 --> <!--<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">--> <!--<!–日志異步到數據庫 –>--> <!--<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">--> <!--<!–連接池 –>--> <!--<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">--> <!--<driverClass>com.mysql.jdbc.Driver</driverClass>--> <!--<url>jdbc:mysql://127.0.0.1:3306/databaseName</url>--> <!--<user>root</user>--> <!--<password>root</password>--> <!--</dataSource>--> <!--</connectionSource>--> <!--</appender>--> </configuration>
如果此框架中需要在普通類里面注入bean,那么可以在Spring Boot可以掃描的包下新建SpringAutoWriteUtil:
package com.jarfk.util; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** * 注入bean工具類 * 注:此類需要在Spring Boot可以掃描的包下 * Created by Administrator on 2017/9/7. */ @Component public class SpringAutoWriteUtil implements ApplicationContextAware { private static ApplicationContext applicationContext = null; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if(SpringAutoWriteUtil.applicationContext == null){ SpringAutoWriteUtil.applicationContext = applicationContext; } } //獲取applicationContext private static ApplicationContext getApplicationContext() { return applicationContext; } //通過name獲取 Bean. public static Object getBean(String name){ return getApplicationContext().getBean(name); } //通過class獲取Bean. public static <T> T getBean(Class<T> clazz){ return getApplicationContext().getBean(clazz); } //通過name,以及Clazz返回指定的Bean public static <T> T getBean(String name,Class<T> clazz){ return getApplicationContext().getBean(name, clazz); } }
調用方式:
附加:整合redis
1.pom.xml引入兩個jar包
<!-- redis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.8.1.RELEASE</version> </dependency>
2.application.yml中配置redis服務
3.新建JedisClusterConfig配置類
package com.jarfk.config; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.JedisCluster; import java.util.HashSet; import java.util.Set; /** * Created by Administrator on 2017/9/25 0025. */ @Configuration @ConditionalOnClass({ JedisCluster.class }) public class JedisClusterConfig { @Value("${spring.redis.cache.clusterNodes}") private String clusterNodes; @Value("${spring.redis.cache.password}") private String password; @Value("${spring.redis.cache.commandTimeout}") private Integer commandTimeout; @Bean public JedisCluster getJedisCluster() { String[] serverArray = clusterNodes.split(","); Set<HostAndPort> nodes = new HashSet<>(); for (String ipPort : serverArray) { String[] ipPortPair = ipPort.split(":"); nodes.add(new HostAndPort(ipPortPair[0].trim(), Integer.valueOf(ipPortPair[1].trim()))); } return new JedisCluster(nodes, commandTimeout, commandTimeout, 2, password, new GenericObjectPoolConfig()); } }
4.新建redis服務類RedisClusterCache(后面代碼中只需注入該類即可對redis數據庫操作)
package com.jarfk.util.redis; import com.jarfk.util.SerializerUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import redis.clients.jedis.JedisCluster; /** * Created by Administrator on 2017/9/25 0025. */ @Component public class RedisClusterCache { @Autowired private JedisCluster jedisCluster; /** * 添加緩存數據 * @param key * @param obj * @param <T> * @return * @throws Exception */ public <T> String putCache(String key, T obj) throws Exception { final byte[] bkey = key.getBytes(); final byte[] bvalue = SerializerUtil.serializeObj(obj); return jedisCluster.set(bkey,bvalue); } /** * 添加緩存數據,設定緩存失效時間 * @param key * @param obj * @param expireTime 秒 * @param <T> * @throws Exception */ public <T> String putCacheWithExpireTime(String key, T obj, final int expireTime) throws Exception { final byte[] bkey = key.getBytes(); final byte[] bvalue = SerializerUtil.serializeObj(obj); String result = jedisCluster.setex(bkey, expireTime,bvalue); return result; } /** * 根據key取緩存數據 * @param key * @param <T> * @return * @throws Exception */ public <T> T getCache(final String key) throws Exception { byte[] result = jedisCluster.get(key.getBytes()); return (T) SerializerUtil.deserializeObj(result); } /** * 根據key刪除緩存數據 * @return * @throws Exception */ public void delCache(final String key) throws Exception { jedisCluster.del(key.getBytes()); } }
5. 附加:關於redis集群實現的分布式鎖:
http://www.cnblogs.com/007sx/p/7655057.html
數據庫表:
CREATE TABLE `sys_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`nickname` varchar(20) DEFAULT NULL COMMENT '用戶昵稱',
`email` varchar(128) DEFAULT NULL COMMENT '郵箱|登錄帳號',
`pswd` varchar(32) DEFAULT NULL COMMENT '密碼',
`salt` varchar(255) DEFAULT NULL COMMENT '鹽',
`create_time` datetime DEFAULT NULL COMMENT '創建時間',
`last_login_time` datetime DEFAULT NULL COMMENT '最后登錄時間',
`status` bigint(1) DEFAULT '1' COMMENT '1:有效,0:禁止登錄',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8
自行創建,此采用id自增方式,可自行配置。