();
+
+ public static DruidDataSourceBuilder create() {
+ return new DruidDataSourceBuilder();
+ }
+
+ public DruidDataSource build() {
+ DruidDataSource dataSource = new DruidDataSource();
+ maybeGetDriverClassName();
+ bind(dataSource);
+ return dataSource;
+ }
+
+ //use spring boot relaxed binding by reflection config druid . detail see Spring Boot Reference Relaxed binding section.
+ private void bind(DruidDataSource result) {
+ MutablePropertyValues properties = new MutablePropertyValues(this.properties);
+ new RelaxedDataBinder(result)
+ .withAlias("url", "jdbcUrl")
+ .withAlias("username", "user")
+ .bind(properties);
+ }
+
+ private void maybeGetDriverClassName() {
+ if (!this.properties.containsKey("driverClassName")
+ && this.properties.containsKey("url")) {
+ String url = this.properties.get("url");
+ String driverClass = DatabaseDriver.fromJdbcUrl(url).getDriverClassName();
+ this.properties.put("driverClassName", driverClass);
+ }
+ }
+}
diff --git a/druid-spring-boot-starter/src/main/java/com/alibaba/druid/spring/boot/autoconfigure/DruidSpringAopConfiguration.java b/druid-spring-boot-starter/src/main/java/com/alibaba/druid/spring/boot/autoconfigure/DruidSpringAopConfiguration.java
new file mode 100644
index 0000000000..4f3849e641
--- /dev/null
+++ b/druid-spring-boot-starter/src/main/java/com/alibaba/druid/spring/boot/autoconfigure/DruidSpringAopConfiguration.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 1999-2017 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+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;
+
+/**
+ * @author lihengming<89921218@qq.com>
+ */
+@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(DruidStatProperties properties) {
+ return new RegexpMethodPointcutAdvisor(properties.getAopPatterns(), advice());
+ }
+
+ @Bean
+ public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
+ DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
+ advisorAutoProxyCreator.setProxyTargetClass(proxyTargetClass);
+ return advisorAutoProxyCreator;
+ }
+}
diff --git a/druid-spring-boot-starter/src/main/java/com/alibaba/druid/spring/boot/autoconfigure/DruidStatProperties.java b/druid-spring-boot-starter/src/main/java/com/alibaba/druid/spring/boot/autoconfigure/DruidStatProperties.java
new file mode 100644
index 0000000000..520a1ea22d
--- /dev/null
+++ b/druid-spring-boot-starter/src/main/java/com/alibaba/druid/spring/boot/autoconfigure/DruidStatProperties.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright 1999-2017 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alibaba.druid.spring.boot.autoconfigure;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * @author lihengming<89921218@qq.com>
+ */
+@ConfigurationProperties("spring.datasource.druid")
+public class DruidStatProperties {
+ private String[] aopPatterns;
+ private StatViewServlet statViewServlet = new StatViewServlet();
+ private StatFilter statFilter = new StatFilter();
+
+
+ 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;
+ }
+
+ 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;
+ }
+ }
+
+ 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;
+ }
+ }
+}
diff --git a/druid-spring-boot-starter/src/main/java/com/alibaba/druid/spring/boot/autoconfigure/DruidStatViewServletConfiguration.java b/druid-spring-boot-starter/src/main/java/com/alibaba/druid/spring/boot/autoconfigure/DruidStatViewServletConfiguration.java
new file mode 100644
index 0000000000..89ad8e59d8
--- /dev/null
+++ b/druid-spring-boot-starter/src/main/java/com/alibaba/druid/spring/boot/autoconfigure/DruidStatViewServletConfiguration.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 1999-2017 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+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;
+
+/**
+ * @author lihengming<89921218@qq.com>
+ */
+@ConditionalOnProperty(name = "spring.datasource.druid.StatViewServlet.enabled", havingValue = "true", matchIfMissing = true)
+public class DruidStatViewServletConfiguration {
+ @Bean
+ public ServletRegistrationBean servletRegistrationBean(DruidStatProperties properties) {
+ DruidStatProperties.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;
+ }
+}
diff --git a/druid-spring-boot-starter/src/main/java/com/alibaba/druid/spring/boot/autoconfigure/DruidWebStatFilterConfiguration.java b/druid-spring-boot-starter/src/main/java/com/alibaba/druid/spring/boot/autoconfigure/DruidWebStatFilterConfiguration.java
new file mode 100644
index 0000000000..3ca1b85763
--- /dev/null
+++ b/druid-spring-boot-starter/src/main/java/com/alibaba/druid/spring/boot/autoconfigure/DruidWebStatFilterConfiguration.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 1999-2017 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+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;
+
+/**
+ * @author lihengming<89921218@qq.com>
+ */
+@ConditionalOnProperty(name = "spring.datasource.druid.WebStatFilter.enabled", havingValue = "true", matchIfMissing = true)
+public class DruidWebStatFilterConfiguration {
+ @Bean
+ public FilterRegistrationBean filterRegistrationBean(DruidStatProperties properties) {
+ DruidStatProperties.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;
+ }
+}
diff --git a/druid-spring-boot-starter/src/main/java/org/springframework/boot/autoconfigure/jdbc/DruidAutoConfiguration.java b/druid-spring-boot-starter/src/main/java/org/springframework/boot/autoconfigure/jdbc/DruidAutoConfiguration.java
deleted file mode 100644
index 8853530a4f..0000000000
--- a/druid-spring-boot-starter/src/main/java/org/springframework/boot/autoconfigure/jdbc/DruidAutoConfiguration.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.springframework.boot.autoconfigure.jdbc;
-
-import com.alibaba.druid.pool.DruidDataSource;
-import com.alibaba.druid.support.http.StatViewServlet;
-import org.springframework.boot.autoconfigure.AutoConfigureBefore;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.boot.web.servlet.ServletRegistrationBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import javax.servlet.http.HttpServlet;
-import javax.sql.DataSource;
-import javax.sql.XADataSource;
-
-/**
- * druid auto configuration
- *
- * @author leijuan
- */
-@SuppressWarnings("SpringJavaAutowiringInspection")
-@Configuration
-@ConditionalOnClass(DruidDataSource.class)
-@AutoConfigureBefore(DataSourceAutoConfiguration.class)
-@EnableConfigurationProperties(DataSourceProperties.class)
-public class DruidAutoConfiguration {
-
- @Bean
- @ConfigurationProperties(prefix = "spring.datasource.druid")
- @ConditionalOnMissingBean({DataSource.class, XADataSource.class})
- public DataSource dataSource(DataSourceProperties properties) {
- return properties.initializeDataSourceBuilder().type(DruidDataSource.class).build();
- }
-
- @Bean
- @ConditionalOnClass(HttpServlet.class)
- public ServletRegistrationBean druidStatViewServlet() {
- return new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
- }
-
-}
diff --git a/druid-spring-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/druid-spring-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json
deleted file mode 100644
index f3579b2411..0000000000
--- a/druid-spring-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "groups": [
- {
- "name": "spring.datasource.druid",
- "type": "com.alibaba.druid.pool.DruidDataSource",
- "sourceType": "org.springframework.boot.autoconfigure.jdbc.DruidAutoConfiguration",
- "sourceMethod": "dataSource(org.springframework.boot.autoconfigure.jdbc.DataSourceProperties)"
- }
- ]
-}
\ No newline at end of file
diff --git a/druid-spring-boot-starter/src/main/resources/META-INF/spring.factories b/druid-spring-boot-starter/src/main/resources/META-INF/spring.factories
index 722d06388c..a2c21bc315 100644
--- a/druid-spring-boot-starter/src/main/resources/META-INF/spring.factories
+++ b/druid-spring-boot-starter/src/main/resources/META-INF/spring.factories
@@ -1 +1,2 @@
-org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.springframework.boot.autoconfigure.jdbc.DruidAutoConfiguration
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
\ No newline at end of file
diff --git a/druid-spring-boot-starter/src/main/resources/META-INF/spring.provides b/druid-spring-boot-starter/src/main/resources/META-INF/spring.provides
deleted file mode 100644
index aaa8cab665..0000000000
--- a/druid-spring-boot-starter/src/main/resources/META-INF/spring.provides
+++ /dev/null
@@ -1 +0,0 @@
-provides: druid-spring-boot-starter
\ No newline at end of file
diff --git a/druid-spring-boot-starter/src/test/java/com/alibaba/boot/druid/demo/DruidAutoConfigurationTest.java b/druid-spring-boot-starter/src/test/java/com/alibaba/boot/druid/demo/DruidAutoConfigurationTest.java
deleted file mode 100644
index 397b4d27a3..0000000000
--- a/druid-spring-boot-starter/src/test/java/com/alibaba/boot/druid/demo/DruidAutoConfigurationTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.alibaba.boot.druid.demo;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.test.context.ActiveProfiles;
-import org.springframework.test.context.TestPropertySource;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import javax.sql.DataSource;
-import java.util.List;
-import java.util.Map;
-
-/**
- * druid auto configuration test
- *
- * @author leijuan
- */
-@RunWith(SpringRunner.class)
-@ImportAutoConfiguration(DruidDemoApplication.class)
-@TestPropertySource("classpath:application.properties")
-public class DruidAutoConfigurationTest {
- @Autowired
- private DataSource dataSource;
- @Autowired
- private JdbcTemplate jdbcTemplate;
-
- @Test
- public void testDatabaseOperations() {
- Assert.assertNotNull(dataSource);
- }
-
-}
diff --git a/druid-spring-boot-starter/src/test/java/com/alibaba/boot/druid/demo/DruidDemoApplication.java b/druid-spring-boot-starter/src/test/java/com/alibaba/boot/druid/demo/DruidDemoApplication.java
deleted file mode 100644
index e1a12f3ee4..0000000000
--- a/druid-spring-boot-starter/src/test/java/com/alibaba/boot/druid/demo/DruidDemoApplication.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.alibaba.boot.druid.demo;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-/**
- * druid demo application
- *
- * @author leijuan
- */
-@SpringBootApplication
-public class DruidDemoApplication {
- public static void main(String[] args) throws InterruptedException {
- SpringApplication.run(DruidDemoApplication.class, args);
- }
-}
diff --git a/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/DemoApplication.java b/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/DemoApplication.java
new file mode 100644
index 0000000000..a8deab6a35
--- /dev/null
+++ b/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/DemoApplication.java
@@ -0,0 +1,21 @@
+package com.alibaba.druid.spring.boot.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * @author lihengming<89921218@qq.com>
+ *
+ * 一个简单的使用演示
+ * 1.按需配置application.properties,配置项请参考config-template.properties
+ * 2.run DemoApplication
+ * 3.访问http://127.0.0.1:8080/druid
+ * 4.访问/user/${id}接口,查看SQL、Web、AOP监控效果,如:http://127.0.0.1:8080/user/1
+ *
+ */
+@SpringBootApplication
+public class DemoApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class, args);
+ }
+}
diff --git a/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/dao/UserDao.java b/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/dao/UserDao.java
new file mode 100644
index 0000000000..6037cdbfae
--- /dev/null
+++ b/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/dao/UserDao.java
@@ -0,0 +1,8 @@
+package com.alibaba.druid.spring.boot.demo.dao;
+
+
+import com.alibaba.druid.spring.boot.demo.model.User;
+import org.springframework.data.repository.CrudRepository;
+
+public interface UserDao extends CrudRepository {}
+
diff --git a/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/model/User.java b/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/model/User.java
new file mode 100644
index 0000000000..32eadfa2be
--- /dev/null
+++ b/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/model/User.java
@@ -0,0 +1,45 @@
+package com.alibaba.druid.spring.boot.demo.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 + '\'' +
+ '}';
+ }
+}
diff --git a/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/service/UserService.java b/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/service/UserService.java
new file mode 100644
index 0000000000..b9e5075a9c
--- /dev/null
+++ b/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/service/UserService.java
@@ -0,0 +1,8 @@
+package com.alibaba.druid.spring.boot.demo.service;
+
+
+import com.alibaba.druid.spring.boot.demo.model.User;
+
+public interface UserService {
+ User findById(Long id);
+}
diff --git a/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/service/UserServiceImpl.java b/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/service/UserServiceImpl.java
new file mode 100644
index 0000000000..d6cac398cf
--- /dev/null
+++ b/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/service/UserServiceImpl.java
@@ -0,0 +1,26 @@
+package com.alibaba.druid.spring.boot.demo.service;
+
+
+import com.alibaba.druid.spring.boot.demo.dao.UserDao;
+import com.alibaba.druid.spring.boot.demo.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));
+ }
+ }
+}
diff --git a/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/web/UserController.java b/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/web/UserController.java
new file mode 100644
index 0000000000..7ad2b5d68b
--- /dev/null
+++ b/druid-spring-boot-starter/src/test/java/com/alibaba/druid/spring/boot/demo/web/UserController.java
@@ -0,0 +1,20 @@
+package com.alibaba.druid.spring.boot.demo.web;
+
+
+import com.alibaba.druid.spring.boot.demo.model.User;
+import com.alibaba.druid.spring.boot.demo.service.UserService;
+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);
+ }
+}
diff --git a/druid-spring-boot-starter/src/test/resources/application.properties b/druid-spring-boot-starter/src/test/resources/application.properties
index 8d0970e716..0ca9a476fb 100644
--- a/druid-spring-boot-starter/src/test/resources/application.properties
+++ b/druid-spring-boot-starter/src/test/resources/application.properties
@@ -1,5 +1,13 @@
-spring.datasource.driver-class-name=com.mysql.jdbc.Driver
-spring.datasource.url=jdbc:mysql://localhost:3306/druid
-spring.datasource.username=root
-spring.datasource.password=123456
-
\ No newline at end of file
+# JDBC
+spring.datasource.url=jdbc:h2:file:./demo-db
+spring.datasource.username=sa
+spring.datasource.password=sa
+spring.datasource.driver-class-name=org.h2.Driver
+#启用Spring关联监控配置
+spring.datasource.druid.aop-patterns=com.alibaba.druid.spring.boot.demo.service.*
+#其他配置,参考config-template.properties
+
+# JPA
+spring.jpa.show-sql= true
+spring.jpa.hibernate.ddl-auto=create-drop
+
diff --git a/druid-spring-boot-starter/src/test/resources/config-template.properties b/druid-spring-boot-starter/src/test/resources/config-template.properties
new file mode 100644
index 0000000000..3c4b2d3af7
--- /dev/null
+++ b/druid-spring-boot-starter/src/test/resources/config-template.properties
@@ -0,0 +1,42 @@
+######Druid数据源配置######
+# JDBC配置
+spring.datasource.url= #别名为spring.datasource.druid.url
+spring.datasource.username= #别名为spring.datasource.druid.username
+spring.datasource.password= #别名为spring.datasource.druid.password
+spring.datasource.driver-class-name= #别名为spring.datasource.druid.driver-class-name,非必填项可通过url解析
+# 连接池配置,下面配置说明请参考Druid Github 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=
+spring.datasource.druid.filters= #默认值stat,配置多个英文逗号分隔
+
+######Druid监控配置######
+#下面配置说明请参考Druid Github Wiki,配置_配置WebStatFilter
+spring.datasource.druid.WebStatFilter.enabled= #是否启用StatFilter默认值true
+spring.datasource.druid.WebStatFilter.urlPattern=
+spring.datasource.druid.WebStatFilter.exclusions=
+spring.datasource.druid.WebStatFilter.sessionStatMaxCount=
+spring.datasource.druid.WebStatFilter.sessionStatEnable=
+spring.datasource.druid.WebStatFilter.principalSessionName=
+spring.datasource.druid.WebStatFilter.principalCookieName=
+spring.datasource.druid.WebStatFilter.profileEnable=
+#下面配置说明请参考Druid Github Wiki,配置_StatViewServlet配置
+spring.datasource.druid.StatViewServlet.enabled= #是否启用StatViewServlet默认值true
+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=
+#下面配置说明请参考Druid Github Wiki,配置_配置WebStatFilter
+spring.datasource.druid.aop-patterns= #Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔
+#如果spring.datasource.druid.aop-patterns要代理的类没有定义interface请设置spring.aop.proxy-target-class=true