spring-boot使用教程(一):让程序跑起来

简介

spring-boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

参考项目:https://github.com/bigbeef/cppba-spring-boot
开源地址:https://github.com/bigbeef
个人博客:http://blog.cppba.com

文件结构

https://github.com/bigbeef/cppba-spring-boot](https://i.loli.net/2017/08/18/599689e433ac9.png)

maven的pom.xml配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.cppbba</groupId>
<artifactId>cppba-spring-boot</artifactId>
<packaging>war</packaging>
<version>1.0.0</version>

<name>cppba-spring-boot Maven Webapp</name>
<url>http://maven.apache.org</url>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.6.RELEASE</version>
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jdk.version>1.7</jdk.version>
<spring.version>4.3.0.RELEASE</spring.version>
<hibernate.version>4.3.11.Final</hibernate.version>
</properties>

<dependencies>
<!--spring-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- hibernate-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.20</version>
</dependency>
</dependencies>

<build>
<finalName>cppba-spring-boot</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

创建Application.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.cppba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.Environment;

import java.net.UnknownHostException;

// same as @Configuration @EnableAutoConfiguration @ComponentScan
@SpringBootApplication
public class Application {
public static void main(String[] args) throws UnknownHostException {
SpringApplication app = new SpringApplication(Application.class);
Environment environment = app.run(args).getEnvironment();
}
}

创建DatabaseConfiguration.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package com.cppba.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.context.ApplicationContextException;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.util.StringUtils;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Properties;

@Configuration
@EnableTransactionManagement
public class DatabaseConfiguration implements EnvironmentAware {

private Environment environment;
private RelaxedPropertyResolver datasourcePropertyResolver;

//从application.yml中读取资源
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
this.datasourcePropertyResolver = new RelaxedPropertyResolver(environment,
"spring.datasource.");
}

//datasource
@Bean(initMethod = "init", destroyMethod = "close")
public DataSource dataSource() throws SQLException {
if (StringUtils.isEmpty(datasourcePropertyResolver.getProperty("url"))) {
System.out.println("Your database connection pool configuration is incorrect!" +
" Please check your Spring profile, current profiles are:"+
Arrays.toString(environment.getActiveProfiles()));
throw new ApplicationContextException(
"Database connection pool is not configured correctly");
}
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setUrl(datasourcePropertyResolver.getProperty("url"));
druidDataSource.setUsername(datasourcePropertyResolver
.getProperty("username"));
druidDataSource.setPassword(datasourcePropertyResolver
.getProperty("password"));
druidDataSource.setInitialSize(1);
druidDataSource.setMinIdle(1);
druidDataSource.setMaxActive(20);
druidDataSource.setMaxWait(60000);
druidDataSource.setTimeBetweenEvictionRunsMillis(60000);
druidDataSource.setMinEvictableIdleTimeMillis(300000);
druidDataSource.setValidationQuery("SELECT 'x'");
druidDataSource.setTestWhileIdle(true);
druidDataSource.setTestOnBorrow(false);
druidDataSource.setTestOnReturn(false);
return druidDataSource;
}

//sessionFactory
@Bean
public LocalSessionFactoryBean sessionFactory() throws SQLException{
LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setDataSource(this.dataSource());
Properties properties1 = new Properties();
properties1.setProperty("hibernate.dialect","org.hibernate.dialect.MySQL5Dialect");
properties1.setProperty("hibernate.show_sql","false");
localSessionFactoryBean.setHibernateProperties(properties1);
localSessionFactoryBean.setPackagesToScan("*");
return localSessionFactoryBean;
}

//txManager事务开启
@Bean
public HibernateTransactionManager txManager() throws SQLException {
HibernateTransactionManager hibernateTransactionManager = new HibernateTransactionManager();
hibernateTransactionManager.setSessionFactory(sessionFactory().getObject());
return hibernateTransactionManager;
}
}

创建CommonAction.java(这是一个测试类)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.cppba.web;

import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@RestController
@Transactional
public class CommonAction {

@Resource
private SessionFactory sessionFactory;

@RequestMapping("test")
public void test(HttpServletResponse response){
Session session = sessionFactory.getCurrentSession();
SQLQuery sqlQuery = session.createSQLQuery("select * from user");
List list = sqlQuery.list();
System.out.printf(list.size()+"");
try {
response.setContentType("application/json");
response.setHeader("Cache-Control", "no-cache");
response.setCharacterEncoding("UTF-8");
response.getWriter().write("{\"msg\":\"调用成功\"}");
} catch (IOException e) {
e.printStackTrace();
}
}
}

创建application.yml

1
2
3
4
5
6
7
8
9
server:
port: 8080
address: localhost

spring:
datasource:
url: jdbc:mysql://localhost:3306/cppba
username: root
password: root

启动项目

我们点击启动按钮
https://github.com/bigbeef/cppba-spring-boot](https://i.loli.net/2017/08/18/599689e4717a0.png)

控制台会打印如下内容:

https://github.com/bigbeef/cppba-spring-boot](https://i.loli.net/2017/08/18/599689e4b0aa6.png)

https://github.com/bigbeef/cppba-spring-boot](https://i.loli.net/2017/08/18/599689e45a52c.png)

启动成功
接下来我们访问http://127.0.0.1:8080/test
(我的CommonAction中RequestMapping(“test”),所以访问路径是test)

https://github.com/bigbeef/cppba-spring-boot](https://i.loli.net/2017/08/18/599689e447877.png)

到此spring-boot配置成功!