add druid-spring-boot-starter support

This commit is contained in:
lihengming
2017-04-26 13:23:06 +08:00
parent e3a868ec4f
commit 4e8a7296f1
16 changed files with 839 additions and 0 deletions
+63
View File
@@ -0,0 +1,63 @@
# Druid Spring Boot Starter
### 简介
使用Spring Boot构建应用已成为Java开发者的首选,Spring 官方提供众多Starter供开发者使用,以便加快应用构建速度。
Druid作为最好的数据库连接池并未获得Spring 官方的默认支持(目前Spring Boot中默认支持的连接池有dbcp,dbcp2, tomcat, hikari三种连接池)导致Druid连接池配置并不能生效,故开发Druid Spring Boot Starter供使用,使在Spring Boot中使用Druid数据库连接池和监控更为简单。
### 如何使用
(1) ```git clone``` (2) ```mvn:install``` (3) 引入```Maven```依赖 (4) 按需配置```application.properties```,使用默认配置忽略此步
注:待上传中央仓库提供\<dependency/\>
### 配置项
Druid Spring Boot Starter 配置项参数名称是完全遵照Druid的,默认值也是Druid的官方默认值,如果你进行了配置那么默认值将被覆盖。
```
# 数据源基础配置,参考Spring Boot文档该部分
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=
spring.datasource.driver-class-name=
# Druid配置
spring.datasource.druid.StatViewServlet.enabled= #是否启用StatViewServlet默认值true
spring.datasource.druid.StatFilter.enabled= #是否启用StatFilter默认值true
spring.datasource.druid.filters= #默认值为stat,配置多个请以英文逗号分隔,如stat,wall,log4j
spring.datasource.druid.aop-patterns= #配置AOP切入点来启用Spring监控,配置多个以英文逗号分隔,如x.y.z.dao.*,x.y.z.service.*
#下面配置项说明请参考Druid Wiki,配置_DruidDataSource参考配置
spring.datasource.druid.initialSize=
spring.datasource.druid.minIdle=
spring.datasource.druid.maxActive=
spring.datasource.druid.maxWait=
spring.datasource.druid.timeBetweenEvictionRunsMillis=
spring.datasource.druid.minEvictableIdleTimeMillis=
spring.datasource.druid.validationQuery=
spring.datasource.druid.testWhileIdle=
spring.datasource.druid.testOnBorrow=
spring.datasource.druid.testOnReturn=
spring.datasource.druid.poolPreparedStatements=
spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=
#下面配置项说明请参考Druid Wiki,配置_配置WebStatFilter
spring.datasource.druid.StatFilter.urlPattern=
spring.datasource.druid.StatFilter.exclusions=
spring.datasource.druid.StatFilter.sessionStatMaxCount=
spring.datasource.druid.StatFilter.sessionStatEnable=
spring.datasource.druid.StatFilter.principalSessionName=
spring.datasource.druid.StatFilter.principalCookieName=
spring.datasource.druid.StatFilter.profileEnable=
#下面配置项说明请参考Druid Wiki,配置_StatViewServlet配置
spring.datasource.druid.StatViewServlet.urlPattern=
spring.datasource.druid.StatViewServlet.resetEnable=
spring.datasource.druid.StatViewServlet.loginUsername=
spring.datasource.druid.StatViewServlet.loginPassword=
spring.datasource.druid.StatViewServlet.allow=
spring.datasource.druid.StatViewServlet.deny=
#如果spring.datasource.druid.aop-patterns要代理的类没有定义interface请设置spring.aop.proxy-target-class=true
```
### 演示
克隆项目,运行```test```包内的```Application.java```
### 参考
[Druid Wiki](https://github.com/alibaba/druid/wiki/%E9%A6%96%E9%A1%B5)
[Spring Boot Reference](http://docs.spring.io/spring-boot/docs/1.5.1.RELEASE/reference/html/)
+113
View File
@@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<name>druid-spring-boot-starter</name>
<description>druid-spring-boot-starter</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.7</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.14</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<developers>
<developer>
<name>李恒名</name>
<url>https://github.com/lihengming/</url>
<email>89921218@qq.com</email>
</developer>
</developers>
</project>
@@ -0,0 +1,76 @@
package com.alibaba.druid.spring.boot.autoconfigure;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import javax.sql.DataSource;
import java.sql.SQLException;
/**
* @author lihengming<89921218@qq.com>
*/
@Configuration
@ConditionalOnClass(com.alibaba.druid.pool.DruidDataSource.class)
@EnableConfigurationProperties(DruidProperties.class)
@Import({DruidSpringAopConfiguration.class, DruidStatViewServletConfiguration.class, DruidStatFilterConfiguration.class})
public class DruidDataSourcePropertiesAutoConfigure {
@Bean
@ConfigurationProperties("spring.datasource")
public DataSource dataSource(DruidProperties properties) {
//base datasource config,use spring datasource autoconfig.
DruidDataSource datasource = (DruidDataSource) DataSourceBuilder
.create()
.type(DruidDataSource.class)
.build();
//druid config.
configDruid(datasource, properties);
return datasource;
}
private void configDruid(DruidDataSource datasource, DruidProperties properties) {
if (properties.getMaxActive() != null) {
datasource.setMaxActive(properties.getMaxActive());
}
if (properties.getInitialSize() != null) {
datasource.setInitialSize(properties.getInitialSize());
}
if (properties.getMaxWait() != null) {
datasource.setMaxWait(properties.getMaxWait());
}
if (properties.getMinIdle() != null) {
datasource.setMinIdle(properties.getMinIdle());
}
if (properties.getTimeBetweenEvictionRunsMillis() != null) {
datasource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis());
}
if (properties.getMinEvictableIdleTimeMillis() != null) {
datasource.setMinEvictableIdleTimeMillis(properties.getMinEvictableIdleTimeMillis());
}
if (properties.getTestWhileIdle() != null) {
datasource.setTestWhileIdle(properties.getTestWhileIdle());
}
if (properties.getTestOnBorrow() != null) {
datasource.setTestOnBorrow(properties.getTestOnBorrow());
}
if (properties.getTestOnReturn() != null) {
datasource.setTestOnReturn(properties.getTestOnReturn());
}
if (properties.getPoolPreparedStatements() != null) {
datasource.setPoolPreparedStatements(properties.getPoolPreparedStatements());
}
if (properties.getMaxPoolPreparedStatementPerConnectionSize() != null) {
datasource.setMaxPoolPreparedStatementPerConnectionSize(properties.getMaxPoolPreparedStatementPerConnectionSize());
}
try {
datasource.setFilters(properties.getFilters() != null ? properties.getFilters() : "stat");
} catch (SQLException e) {
throw new IllegalArgumentException("please check your spring.datasource.druid.filters property.", e);
}
}
}
@@ -0,0 +1,285 @@
package com.alibaba.druid.spring.boot.autoconfigure;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* @author lihengming<89921218@qq.com>
* @see <a href="https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_DruidDataSource%E5%8F%82%E8%80%83%E9%85%8D%E7%BD%AE">DruidDataSource参考配置</a>
*/
@ConfigurationProperties("spring.datasource.druid")
public class DruidProperties{
private Integer initialSize;
private Integer minIdle;
private Integer maxActive;
private Integer maxWait;
private Integer timeBetweenEvictionRunsMillis;
private Integer minEvictableIdleTimeMillis;
private String validationQuery;
private Boolean testOnBorrow;
private Boolean testOnReturn;
private Boolean testWhileIdle;
private String filters;
private Boolean poolPreparedStatements;
private Integer maxPoolPreparedStatementPerConnectionSize;
private String[] aopPatterns;
private StatViewServlet statViewServlet = new StatViewServlet();
private StatFilter statFilter = new StatFilter();
public Integer getInitialSize() {
return initialSize;
}
public void setInitialSize(Integer initialSize) {
this.initialSize = initialSize;
}
public Integer getMinIdle() {
return minIdle;
}
public void setMinIdle(Integer minIdle) {
this.minIdle = minIdle;
}
public Integer getMaxActive() {
return maxActive;
}
public void setMaxActive(Integer maxActive) {
this.maxActive = maxActive;
}
public Integer getMaxWait() {
return maxWait;
}
public void setMaxWait(Integer maxWait) {
this.maxWait = maxWait;
}
public String getValidationQuery() {
return validationQuery;
}
public void setValidationQuery(String validationQuery) {
this.validationQuery = validationQuery;
}
public Boolean getTestOnBorrow() {
return testOnBorrow;
}
public void setTestOnBorrow(Boolean testOnBorrow) {
this.testOnBorrow = testOnBorrow;
}
public Boolean getTestOnReturn() {
return testOnReturn;
}
public void setTestOnReturn(Boolean testOnReturn) {
this.testOnReturn = testOnReturn;
}
public Boolean getTestWhileIdle() {
return testWhileIdle;
}
public void setTestWhileIdle(Boolean testWhileIdle) {
this.testWhileIdle = testWhileIdle;
}
public Integer getTimeBetweenEvictionRunsMillis() {
return timeBetweenEvictionRunsMillis;
}
public void setTimeBetweenEvictionRunsMillis(Integer timeBetweenEvictionRunsMillis) {
this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
}
public Integer getMinEvictableIdleTimeMillis() {
return minEvictableIdleTimeMillis;
}
public void setMinEvictableIdleTimeMillis(Integer minEvictableIdleTimeMillis) {
this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
}
public String getFilters() {
return filters;
}
public void setFilters(String filters) {
this.filters = filters;
}
public Boolean getPoolPreparedStatements() {
return poolPreparedStatements;
}
public void setPoolPreparedStatements(Boolean poolPreparedStatements) {
this.poolPreparedStatements = poolPreparedStatements;
}
public Integer getMaxPoolPreparedStatementPerConnectionSize() {
return maxPoolPreparedStatementPerConnectionSize;
}
public void setMaxPoolPreparedStatementPerConnectionSize(Integer maxPoolPreparedStatementPerConnectionSize) {
this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
}
public String[] getAopPatterns() {
return aopPatterns;
}
public void setAopPatterns(String[] aopPatterns) {
this.aopPatterns = aopPatterns;
}
public StatViewServlet getStatViewServlet() {
return statViewServlet;
}
public void setStatViewServlet(StatViewServlet statViewServlet) {
this.statViewServlet = statViewServlet;
}
public StatFilter getStatFilter() {
return statFilter;
}
public void setStatFilter(StatFilter statFilter) {
this.statFilter = statFilter;
}
/**
* @see <a href="https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE">StatViewServlet配置</a>
*/
public static class StatViewServlet{
private String urlPattern;
private String allow;
private String deny;
private String loginUsername;
private String loginPassword;
private String resetEnable;
public String getUrlPattern() {
return urlPattern;
}
public void setUrlPattern(String urlPattern) {
this.urlPattern = urlPattern;
}
public String getAllow() {
return allow;
}
public void setAllow(String allow) {
this.allow = allow;
}
public String getDeny() {
return deny;
}
public void setDeny(String deny) {
this.deny = deny;
}
public String getLoginUsername() {
return loginUsername;
}
public void setLoginUsername(String loginUsername) {
this.loginUsername = loginUsername;
}
public String getLoginPassword() {
return loginPassword;
}
public void setLoginPassword(String loginPassword) {
this.loginPassword = loginPassword;
}
public String getResetEnable() {
return resetEnable;
}
public void setResetEnable(String resetEnable) {
this.resetEnable = resetEnable;
}
}
/**
* @see <a href="https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter">配置WebStatFilter</a>
*/
public static class StatFilter{
private String urlPattern;
private String exclusions;
private String sessionStatMaxCount;
private String sessionStatEnable;
private String principalSessionName;
private String principalCookieName;
private String profileEnable;
public String getUrlPattern() {
return urlPattern;
}
public void setUrlPattern(String urlPattern) {
this.urlPattern = urlPattern;
}
public String getExclusions() {
return exclusions;
}
public void setExclusions(String exclusions) {
this.exclusions = exclusions;
}
public String getSessionStatMaxCount() {
return sessionStatMaxCount;
}
public void setSessionStatMaxCount(String sessionStatMaxCount) {
this.sessionStatMaxCount = sessionStatMaxCount;
}
public String getSessionStatEnable() {
return sessionStatEnable;
}
public void setSessionStatEnable(String sessionStatEnable) {
this.sessionStatEnable = sessionStatEnable;
}
public String getPrincipalSessionName() {
return principalSessionName;
}
public void setPrincipalSessionName(String principalSessionName) {
this.principalSessionName = principalSessionName;
}
public String getPrincipalCookieName() {
return principalCookieName;
}
public void setPrincipalCookieName(String principalCookieName) {
this.principalCookieName = principalCookieName;
}
public String getProfileEnable() {
return profileEnable;
}
public void setProfileEnable(String profileEnable) {
this.profileEnable = profileEnable;
}
}
}
@@ -0,0 +1,39 @@
package com.alibaba.druid.spring.boot.autoconfigure;
import com.alibaba.druid.support.spring.stat.DruidStatInterceptor;
import org.aopalliance.aop.Advice;
import org.springframework.aop.Advisor;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.aop.support.RegexpMethodPointcutAdvisor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
/**
* The Druid spring aop configuration.
*
* @author lihengming< qq.com>
* @see <a href="https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_Druid%E5%92%8CSpring%E5%85%B3%E8%81%94%E7%9B%91%E6%8E%A7%E9%85%8D%E7%BD%AE">Druid和Spring关联监控配置</a>
*/
@ConditionalOnProperty("spring.datasource.druid.aop-patterns")
public class DruidSpringAopConfiguration {
@Value("${spring.aop.proxy-target-class:false}")
private boolean proxyTargetClass;
@Bean
public Advice advice() {
return new DruidStatInterceptor();
}
@Bean
public Advisor advisor(DruidProperties properties) {
return new RegexpMethodPointcutAdvisor(properties.getAopPatterns(), advice());
}
@Bean
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(proxyTargetClass);
return advisorAutoProxyCreator;
}
}
@@ -0,0 +1,41 @@
package com.alibaba.druid.spring.boot.autoconfigure;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
/**
* The Druid stat filter configuration.
*
* @author lihengming< qq.com>
* @see <a href="https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter">配置WebStatFilter</a>
*/
@ConditionalOnProperty(name = "spring.datasource.druid.StatFilter.enabled", havingValue = "true", matchIfMissing = true)
public class DruidStatFilterConfiguration {
@Bean
public FilterRegistrationBean filterRegistrationBean(DruidProperties properties) {
DruidProperties.StatFilter config = properties.getStatFilter();
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
WebStatFilter filter = new WebStatFilter();
registrationBean.setFilter(filter);
registrationBean.addUrlPatterns(config.getUrlPattern() != null ? config.getUrlPattern() : "/*");
registrationBean.addInitParameter("exclusions", config.getExclusions() != null ? config.getExclusions() : "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
if (config.getSessionStatEnable() != null) {
registrationBean.addInitParameter("sessionStatEnable", config.getSessionStatEnable());
}
if (config.getSessionStatMaxCount() != null) {
registrationBean.addInitParameter("sessionStatMaxCount", config.getSessionStatMaxCount());
}
if (config.getPrincipalSessionName() != null) {
registrationBean.addInitParameter("principalSessionName", config.getPrincipalSessionName());
}
if (config.getPrincipalCookieName() != null) {
registrationBean.addInitParameter("principalCookieName", config.getPrincipalCookieName());
}
if (config.getProfileEnable() != null) {
registrationBean.addInitParameter("profileEnable", config.getProfileEnable());
}
return registrationBean;
}
}
@@ -0,0 +1,39 @@
package com.alibaba.druid.spring.boot.autoconfigure;
import com.alibaba.druid.support.http.StatViewServlet;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
/**
* The Druid stat view servlet configuration.
*
* @author lihengming< qq.com>
* @see <a href="https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE">StatViewServlet配置</a>
*/
@ConditionalOnProperty(name = "spring.datasource.druid.StatViewServlet.enabled", havingValue = "true", matchIfMissing = true)
public class DruidStatViewServletConfiguration {
@Bean
public ServletRegistrationBean servletRegistrationBean(DruidProperties properties) {
DruidProperties.StatViewServlet config = properties.getStatViewServlet();
ServletRegistrationBean registration = new ServletRegistrationBean();
registration.setServlet(new StatViewServlet());
registration.addUrlMappings(config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*");
if (config.getAllow() != null) {
registration.addInitParameter("allow", config.getAllow());
}
if (config.getDeny() != null) {
registration.addInitParameter("deny", config.getDeny());
}
if (config.getLoginUsername() != null) {
registration.addInitParameter("loginUsername", config.getLoginUsername());
}
if (config.getLoginPassword() != null) {
registration.addInitParameter("loginPassword", config.getLoginPassword());
}
if (config.getResetEnable() != null) {
registration.addInitParameter("resetEnable", config.getResetEnable());
}
return registration;
}
}
@@ -0,0 +1,2 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourcePropertiesAutoConfigure
@@ -0,0 +1,21 @@
package com.alibaba.druid.spring.boot.autoconfigure.test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author lihengming<89921218@qq.com>
*
* <p>druid-spring-boot-starter 测试例子</p>
* <p>1.按需配置application.properties</p>
* <p>2.run Application</p>
* <p>3.访问http://127.0.0.1:8080/druid</p>
* <p>4.访问/user/{id}接口,查看监控效果,如:http://127.0.0.1:8080/user/1</p>
*
*/
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@@ -0,0 +1,7 @@
package com.alibaba.druid.spring.boot.autoconfigure.test.dao;
import com.alibaba.druid.spring.boot.autoconfigure.test.model.User;
import org.springframework.data.repository.CrudRepository;
public interface UserDao extends CrudRepository<User, Long> {}
@@ -0,0 +1,45 @@
package com.alibaba.druid.spring.boot.autoconfigure.test.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
@@ -0,0 +1,7 @@
package com.alibaba.druid.spring.boot.autoconfigure.test.service;
import com.alibaba.druid.spring.boot.autoconfigure.test.model.User;
public interface UserService {
User findById(Long id);
}
@@ -0,0 +1,25 @@
package com.alibaba.druid.spring.boot.autoconfigure.test.service;
import com.alibaba.druid.spring.boot.autoconfigure.test.dao.UserDao;
import com.alibaba.druid.spring.boot.autoconfigure.test.model.User;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService,InitializingBean {
@Autowired
private UserDao userDao;
@Override
public User findById(Long id) {
return userDao.findOne(id);
}
@Override
public void afterPropertiesSet() throws Exception {
for (int i = 1; i <= 100; i++) {
userDao.save(new User("TEST-NAME-" + i));
}
}
}
@@ -0,0 +1,19 @@
package com.alibaba.druid.spring.boot.autoconfigure.test.web;
import com.alibaba.druid.spring.boot.autoconfigure.test.service.UserService;
import com.alibaba.druid.spring.boot.autoconfigure.test.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/user/{id}")
public User list(@PathVariable Long id) {
return userService.findById(id);
}
}
@@ -0,0 +1,16 @@
# \u6570\u636E\u6E90\u57FA\u7840\u914D\u7F6E\uFF0C\u8BF7\u4FEE\u6539\u4E3A\u4F60\u7684JDBC\u914D\u7F6E
spring.datasource.url=jdbc:mysql://localhost:3306/your-db
spring.datasource.username=your-username
spring.datasource.password=your-password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# Druid\u914D\u7F6E\uFF0C\u81EA\u884C\u589E\u5220\u914D\u7F6E
#spring.datasource.druid.maxActive=20
spring.datasource.druid.filters=stat,wall,log4j
spring.datasource.druid.aop-patterns=com.alibaba.druid.spring.boot.autoconfigure.test.service.*
#spring.datasource.druid.StatViewServlet.loginUsername=admin
#spring.datasource.druid.StatViewServlet.loginPassword=123456
# JPA
spring.jpa.show-sql= true
spring.jpa.hibernate.ddl-auto=create-drop
# \u5982\u679Cspring.datasource.druid.aop-patterns\u8981\u4EE3\u7406\u7684\u7C7B\u6CA1\u6709\u5B9A\u4E49interface\u8BF7\u8BBE\u7F6Espring.aop.proxy-target-class=true
# spring.aop.proxy-target-class=true
@@ -0,0 +1,41 @@
# \u6570\u636E\u6E90\u57FA\u7840\u914D\u7F6E\uFF0C\u53C2\u8003Spring Boot\u6587\u6863\u8BE5\u90E8\u5206
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=
spring.datasource.driver-class-name=
# Druid\u914D\u7F6E
spring.datasource.druid.StatViewServlet.enabled= #\u662F\u5426\u542F\u7528StatViewServlet\u9ED8\u8BA4\u503Ctrue
spring.datasource.druid.StatFilter.enabled= #\u662F\u5426\u542F\u7528StatFilter\u9ED8\u8BA4\u503Ctrue
spring.datasource.druid.filters= #\u9ED8\u8BA4\u503Cstat\uFF0C\u914D\u7F6E\u591A\u4E2A\u82F1\u6587\u9017\u53F7\u5206\u9694
spring.datasource.druid.aop-patterns= #Spring\u76D1\u63A7AOP\u5207\u5165\u70B9\uFF0C\u5982x.y.z.service.*,\u914D\u7F6E\u591A\u4E2A\u82F1\u6587\u9017\u53F7\u5206\u9694
#\u4E0B\u9762\u914D\u7F6E\u8BF4\u660E\u8BF7\u53C2\u8003Druid Github Wiki\uFF0C\u914D\u7F6E_DruidDataSource\u53C2\u8003\u914D\u7F6E
spring.datasource.druid.initialSize=
spring.datasource.druid.minIdle=
spring.datasource.druid.maxActive=
spring.datasource.druid.maxWait=
spring.datasource.druid.timeBetweenEvictionRunsMillis=
spring.datasource.druid.minEvictableIdleTimeMillis=
spring.datasource.druid.validationQuery=
spring.datasource.druid.testWhileIdle=
spring.datasource.druid.testOnBorrow=
spring.datasource.druid.testOnReturn=
spring.datasource.druid.poolPreparedStatements=
spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=
#\u4E0B\u9762\u914D\u7F6E\u8BF4\u660E\u8BF7\u53C2\u8003Druid Github Wiki\uFF0C\u914D\u7F6E_\u914D\u7F6EWebStatFilter
spring.datasource.druid.StatFilter.urlPattern=
spring.datasource.druid.StatFilter.exclusions=
spring.datasource.druid.StatFilter.sessionStatMaxCount=
spring.datasource.druid.StatFilter.sessionStatEnable=
spring.datasource.druid.StatFilter.principalSessionName=
spring.datasource.druid.StatFilter.principalCookieName=
spring.datasource.druid.StatFilter.profileEnable=
#\u4E0B\u9762\u914D\u7F6E\u8BF4\u660E\u8BF7\u53C2\u8003Druid Github Wiki\uFF0C\u914D\u7F6E_StatViewServlet\u914D\u7F6E
spring.datasource.druid.StatViewServlet.urlPattern=
spring.datasource.druid.StatViewServlet.resetEnable=
spring.datasource.druid.StatViewServlet.loginUsername=
spring.datasource.druid.StatViewServlet.loginPassword=
spring.datasource.druid.StatViewServlet.allow=
spring.datasource.druid.StatViewServlet.deny=
#\u5982\u679Cspring.datasource.druid.aop-patterns\u8981\u4EE3\u7406\u7684\u7C7B\u6CA1\u6709\u5B9A\u4E49interface\u8BF7\u8BBE\u7F6Espring.aop.proxy-target-class=true