项目结构如下:
启动入口:
package com.zm.blog; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.context.annotation.EnableMBeanExport; import org.springframework.context.annotation.Import; import org.springframework.jmx.support.RegistrationPolicy; import org.springframework.transaction.annotation.EnableTransactionManagement; import com.github.tobato.fastdfs.FdfsClientConfig; //解决jmx重复注册bean的问题 @EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING) //整合fastdsf @Import(FdfsClientConfig.class) //启动入口 @SpringBootApplication //配置servlet @ServletComponentScan //事务 @EnableTransactionManagement public class BlogStart { public static void main(String[] args) { SpringApplication.run(BlogStart.class, args); } }
application.properties
##############servlet容器##################################################### server.port=80 server.context-path=/blog ##############应用编码##################################################### spring.http.encoding.force=true spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true server.tomcat.uri-encoding=UTF-8 ################################################################### spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp #spring.thymeleaf.prefix=/WEB-INF/jsp/ #spring.thymeleaf.suffix=.html #spring.thymeleaf.mode=LEGACYHTML5 #######################################驱动配置信息 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.url=jdbc:mysql://101.200.49.60:3306/gytlv?useUnicode=true&characterEncoding=UTF8 spring.datasource.username=root spring.datasource.password= #############################################日志#### logging.level.com.zm.blog.mapper=debug #################################mq################ spring.activemq.broker-url=tcp://www.gytlv.com:61616 ###druid不支持的补充配置 ### spring.datasource.driverClassName=com.mysql.jdbc.Driver # 初始化大小,最小,最大 spring.datasource.initialSize=1 spring.datasource.minIdle=1 spring.datasource.maxActive=20 # 配置获取连接等待超时的时间 spring.datasource.maxWait=60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 spring.datasource.validationQuery=SELECT 1 FROM DUAL spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false spring.datasource.testWhileIdle=true spring.datasource.minEvictableIdleTimeMillis=25200000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 spring.datasource.timeBetweenEvictionRunsMillis=60000 spring.datasource.removeAbandoned=true spring.datasource.removeAbandonedTimeout=1800 # 打开PSCache,并且指定每个连接上PSCache的大小 spring.datasource.poolPreparedStatements=true spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 spring.datasource.logAbandoned=true # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 spring.datasource.filters=stat,wall,log4j #配置spring关联 #设置使用Cglib进行代理,因为部分需要代理的不是接口不适用于JDK动态代理,会报错 spring.aop.proxy-target-class=true #配置Druid监控Spring包方法的调用 spring.datasource.druid.aop-patterns=packages # REDIS (RedisProperties) # Redis数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redis.host=101.200.49.60 # Redis服务器连接端口 spring.redis.port=6379 # Redis服务器连接密码(默认为空) spring.redis.password= # 连接池最大连接数(使用负值表示没有限制) spring.redis.pool.max-active=8 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.pool.max-wait=-1 # 连接池中的最大空闲连接 spring.redis.pool.max-idle=8 # 连接池中的最小空闲连接 spring.redis.pool.min-idle=0 # 连接超时时间(毫秒) #spring.redis.timeout= #fastdsf ################################################################### IMAGE_SERVER_URL=http://101.200.49.60:8888/ tracker_server= ################################################################### fdfs.soTimeout=1500 fdfs.connectTimeout=600 fdfs.thumbImage.width=150 fdfs.thumbImage.height=150 fdfs.trackerList[0]=101.200.49.60:22122 #################################################################### ##############servlet容器##################################################### server.port=80 server.context-path=/blog ##############应用编码##################################################### spring.http.encoding.force=true spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true server.tomcat.uri-encoding=UTF-8 ################################################################### spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp #spring.thymeleaf.prefix=/WEB-INF/jsp/ #spring.thymeleaf.suffix=.html #spring.thymeleaf.mode=LEGACYHTML5 #######################################驱动配置信息 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.url=jdbc:mysql://101.200.49.60:3306/gytlv?useUnicode=true&characterEncoding=UTF8 spring.datasource.username=root spring.datasource.password= #############################################日志#### logging.level.com.zm.blog.mapper=debug #################################mq################ spring.activemq.broker-url=tcp://www.gytlv.com:61616 ###druid不支持的补充配置 ### spring.datasource.driverClassName=com.mysql.jdbc.Driver # 初始化大小,最小,最大 spring.datasource.initialSize=1 spring.datasource.minIdle=1 spring.datasource.maxActive=20 # 配置获取连接等待超时的时间 spring.datasource.maxWait=60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 spring.datasource.validationQuery=SELECT 1 FROM DUAL spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false spring.datasource.testWhileIdle=true spring.datasource.minEvictableIdleTimeMillis=25200000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 spring.datasource.timeBetweenEvictionRunsMillis=60000 spring.datasource.removeAbandoned=true spring.datasource.removeAbandonedTimeout=1800 # 打开PSCache,并且指定每个连接上PSCache的大小 spring.datasource.poolPreparedStatements=true spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 spring.datasource.logAbandoned=true # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 spring.datasource.filters=stat,wall,log4j #配置spring关联 #设置使用Cglib进行代理,因为部分需要代理的不是接口不适用于JDK动态代理,会报错 spring.aop.proxy-target-class=true #配置Druid监控Spring包方法的调用 spring.datasource.druid.aop-patterns=packages # REDIS (RedisProperties) # Redis数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redis.host=101.200.49.60 # Redis服务器连接端口 spring.redis.port=6379 # Redis服务器连接密码(默认为空) spring.redis.password= # 连接池最大连接数(使用负值表示没有限制) spring.redis.pool.max-active=8 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.pool.max-wait=-1 # 连接池中的最大空闲连接 spring.redis.pool.max-idle=8 # 连接池中的最小空闲连接 spring.redis.pool.min-idle=0 # 连接超时时间(毫秒) #spring.redis.timeout= #fastdsf ################################################################### IMAGE_SERVER_URL=http://101.200.49.60:8888/ tracker_server= ################################################################### fdfs.soTimeout=1500 fdfs.connectTimeout=600 fdfs.thumbImage.width=150 fdfs.thumbImage.height=150 fdfs.trackerList[0]=101.200.49.60:22122 ####################################################################
1.使用druid进行数据库访问
1.1基于resource.properties配置初始化数据源属性
package com.zm.blog.config.druid; import java.sql.SQLException; import javax.sql.DataSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.aop.Advisor; import org.springframework.aop.support.DefaultPointcutAdvisor; import org.springframework.aop.support.JdkRegexpMethodPointcut; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.spring.stat.DruidStatInterceptor; @Configuration public class DruidConfig { private static final Logger LOGGER = LoggerFactory.getLogger(DruidConfig.class); @Value("${spring.datasource.driverClassName}") private String driverClassName; @Value("${spring.datasource.url}") private String url; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.initialSize}") private int initialSize; @Value("${spring.datasource.minIdle}") private int minIdle; @Value("${spring.datasource.maxActive}") private int maxActive; @Value("${spring.datasource.maxWait}") private int maxWait; @Value("${spring.datasource.validationQuery}") private String validationQuery; @Value("${spring.datasource.testOnBorrow}") private boolean testOnBorrow; @Value("${spring.datasource.testOnReturn}") private boolean testOnReturn; @Value("${spring.datasource.testWhileIdle}") private boolean testWhileIdle; @Value("${spring.datasource.timeBetweenEvictionRunsMillis}") private int timeBetweenEvictionRunsMillis; @Value("${spring.datasource.minEvictableIdleTimeMillis}") private int minEvictableIdleTimeMillis; @Value("${spring.datasource.removeAbandoned}") private boolean removeAbandoned; @Value("${spring.datasource.removeAbandonedTimeout}") private int removeAbandonedTimeout; @Value("${spring.datasource.logAbandoned}") private boolean logAbandoned; @Value("${spring.datasource.filters}") private String filters; @Value("${spring.datasource.poolPreparedStatements}") private boolean poolPreparedStatements; @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}") private int maxPoolPreparedStatementPerConnectionSize; // 添加aop的advice @Bean public DruidStatInterceptor druidStatInterceptor() { DruidStatInterceptor druidStatInterceptor = new DruidStatInterceptor(); return druidStatInterceptor; } // 添加aop的pointcut @Bean public JdkRegexpMethodPointcut jdkRegexpMethodPointcut() { JdkRegexpMethodPointcut jdkRegexpMethodPointcut = new JdkRegexpMethodPointcut(); jdkRegexpMethodPointcut.setPatterns(new String[] {"com.zm.blog.uib.service.*","com.zm.blog.uib.controller.*"}); return jdkRegexpMethodPointcut; } // 设置默认的aop配置对应的是原来的<aop:advisor> @Bean public Advisor druidAdvisor() { DefaultPointcutAdvisor defaultPointcutAdvisor = new DefaultPointcutAdvisor(); defaultPointcutAdvisor.setPointcut(jdkRegexpMethodPointcut()); defaultPointcutAdvisor.setAdvice(druidStatInterceptor()); return defaultPointcutAdvisor; } @Bean @Primary public DataSource dataSource() { DruidDataSource datasource = new DruidDataSource(); datasource.setDriverClassName(driverClassName); datasource.setUrl(url); datasource.setUsername(username); datasource.setPassword(password); // 其它配置 datasource.setInitialSize(initialSize); datasource.setMinIdle(minIdle); datasource.setMaxActive(maxActive); datasource.setMaxWait(maxWait); datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); datasource.setValidationQuery(validationQuery); datasource.setTestWhileIdle(testWhileIdle); datasource.setTestOnBorrow(testOnBorrow); datasource.setTestOnReturn(testOnReturn); datasource.setPoolPreparedStatements(poolPreparedStatements); datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); try { datasource.setFilters(filters); } catch (SQLException e) { LOGGER.error("druid configuration initialization filter", e); } return datasource; } }
1.2配置使用druid使用的过滤器
package com.zm.blog.config.druid; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; import com.alibaba.druid.support.http.WebStatFilter; @WebFilter(filterName="druidWebStatFilter",urlPatterns="/*", initParams={ @WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")// 忽略资源 }) public class DruidStatFilter extends WebStatFilter{ }
1.3 servlet配置
package com.zm.blog.config.druid; import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; import com.alibaba.druid.support.http.StatViewServlet; @WebServlet(urlPatterns = "/druid/*", initParams={ //@WebInitParam(name="allow",value="127.0.0.1"),// IP白名单 (没有配置或者为空,则允许所有访问) //@WebInitParam(name="deny",value="192.168.16.111"),// IP黑名单 (存在共同时,deny优先于allow) @WebInitParam(name="loginUsername",value="admin"),// 用户名 @WebInitParam(name="loginPassword",value="isadmin"),// 密码 @WebInitParam(name="resetEnable",value="false")// 禁用HTML页面上的“Reset All”功能 }) public class DruidStatViewServlet extends StatViewServlet { private static final long serialVersionUID = 1L; }备注:下文的举出配置都是基于resource.properties文件