1. 程式人生 > >springBoot 工程搭建

springBoot 工程搭建

搭建springBooot工程

一 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>demo</name>
<description>Demo project for Spring Boot</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--redis-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.2</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.4</version>
    </dependency>


    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-joda</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-parameter-names</artifactId>
    </dependency>
    <!-- 分頁外掛 -->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.2.5</version>
    </dependency>
    <!-- alibaba的druid資料庫連線池 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.9</version>
    </dependency>

    <!--mybatis外掛 20180904-->
    <dependency>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-core</artifactId>
        <version>1.3.5</version>
    </dependency>

    <!--swagger-->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.7.0</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.7.0</version>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.0</version>
        <scope>provided</scope>
    </dependency>


</dependencies>

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


        <!--mybatis外掛-->
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.5</version>
            <configuration>
                <verbose>true</verbose>
                <overwrite>true</overwrite>
            </configuration>
        </plugin>
    </plugins>
</build>

</ project>  *上邊的modelVersion,project等前邊沒有空格

二 springBoot的配置檔案yml

server: port: 8080

spring: datasource: type: com.alibaba.druid.pool.DruidDataSource read: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver initialize: true #指定初始化資料來源,是否用data.sql來初始化,預設: true name: read jdbc_url: jdbc:mysql://99.6.xx.xx:3306/lc07_cust_r?useUnicode=true&characterEncoding=UTF-8 url: jdbc:mysql://99.6.xx.xx:3306/lc07_cust_r?useUnicode=true&characterEncoding=UTF-8 username: root password: xx initial-size: 1 min-idle: 1 max-active: 20 #獲取連線等待超時時間 max-wait: 60000 #間隔多久進行一次檢測,檢測需要關閉的空閒連線 time-between-eviction-runs-millis: 60000 #一個連線在池中最小生存的時間 min-evictable-idle-time-millis: 300000 validation-query: SELECT ‘x’ test-while-idle: true test-on-borrow: false test-on-return: false #開啟PSCache,並指定每個連線上PSCache的大小。oracle設為true,mysql設為false。分庫分表較多推薦設定為false pool-prepared-statements: false max-pool-prepared-statement-per-connection-size: 20 write: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver initialize: true #指定初始化資料來源,是否用data.sql來初始化,預設: true name: write jdbc_url: jdbc:mysql://99.6.xx.xx:3306/lc07_cust_rw?useUnicode=true&characterEncoding=UTF-8 url: jdbc:mysql://99.6.xx.xx:3306/lc07_cust_rw?useUnicode=true&characterEncoding=UTF-8 username: root password: xx initial-size: 1 min-idle: 1 max-active: 20 #獲取連線等待超時時間 max-wait: 60000 #間隔多久進行一次檢測,檢測需要關閉的空閒連線 time-between-eviction-runs-millis: 60000 #一個連線在池中最小生存的時間 min-evictable-idle-time-millis: 300000 validation-query: SELECT ‘x’ test-while-idle: true test-on-borrow: false test-on-return: false #開啟PSCache,並指定每個連線上PSCache的大小。oracle設為true,mysql設為false。分庫分表較多推薦設定為false pool-prepared-statements: false max-pool-prepared-statement-per-connection-size: 20

#pagehelper pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql returnPageInfo: check

springfox: documentation: swagger.v2.path : /

#列印sql logging: level: com.example.demo.dao : debug #與上邊的spring區分 可以用.連線 spring.redis: #database:9 #host: 99.12.117.176 #port: 6379

cluster.nodes : 99.12.117.176:6379,99.12.117.182:6379,99.12.117.183:6379
password:
expireSeconds: 120
commandTimeout: 10000
#database: 0
#timeout: 2000

三 其他配置檔案

1.多資料來源配置,不支援分散式事務

讀庫配置: package com.example.demo.dateSource;

import com.alibaba.druid.pool.DruidDataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration @MapperScan(basePackages = “com.example.demo.dao.read”, sqlSessionTemplateRef = “readSqlSessionTemplate”) public class ReadDataSourceConfig { @Bean(name = “readDataSource”) @ConfigurationProperties(prefix = “spring.datasource.read”) @Primary public DataSource setDataSource() { return DataSourceBuilder.create().build(); }

@Bean(name = "readTransactionManager")
@Primary
public DataSourceTransactionManager setTransactionManager(@Qualifier("readDataSource") DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
}

@Bean(name = "readSqlSessionFactory")
@Primary
public SqlSessionFactory setSqlSessionFactory(@Qualifier("readDataSource") DataSource dataSource) throws Exception {
    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    bean.setDataSource(dataSource);
    bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/read/*.xml"));
    return bean.getObject();
}

@Bean(name = "readSqlSessionTemplate")
@Primary
public SqlSessionTemplate setSqlSessionTemplate(@Qualifier("readSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
    return new SqlSessionTemplate(sqlSessionFactory);
}

}

寫庫配置:

package com.example.demo.dateSource;

import com.alibaba.druid.pool.DruidDataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration @MapperScan(basePackages = “com.example.demo.dao.write”, sqlSessionTemplateRef = “writeSqlSessionTemplate”) public class WriteDataSourceConfig { @Bean(name = “writeDataSource”) @ConfigurationProperties(prefix = “spring.datasource.write”) public DataSource setDataSource() { return new DruidDataSource(); }

@Bean(name = "writeTransactionManager")
public DataSourceTransactionManager setTransactionManager(@Qualifier("writeDataSource") DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
}

@Bean(name = "writeSqlSessionFactory")
public SqlSessionFactory setSqlSessionFactory(@Qualifier("writeDataSource") DataSource dataSource) throws Exception {
    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    bean.setDataSource(dataSource);
    bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/write/*.xml"));
    return bean.getObject();
}

@Bean(name = "writeSqlSessionTemplate")
public SqlSessionTemplate setSqlSessionTemplate(@Qualifier("writeSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
    return new SqlSessionTemplate(sqlSessionFactory);
}

}

2.redis 配置

package com.example.demo.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; @Configuration public class RedisConfig extends CachingConfigurerSupport { @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; }

}

3.整合swagger

package com.example.demo.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket;

@Configuration public class SwaggerConfig {

@Bean
public Docket createRestApi() {// 建立API基本資訊
    return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.example.demo"))// 掃描該包下的所有需要在Swagger中展示的API,@ApiIgnore註解標註的除外
            .paths(PathSelectors.any())
            .build();
}

private ApiInfo apiInfo() {// 建立API的基本資訊,這些資訊會在Swagger UI中進行顯示
    return new ApiInfoBuilder()
            .title("swagger APIs")// API 標題
            .description("樣例 api")// API描述
            .contact("lxl")// 聯絡人
            .version("1.0")// 版本號
            .build();
}

}

4.定時任務

package com.example.demo.timer; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; @Configuration @EnableScheduling public class TimerJob {

@Scheduled(cron="0/10 * * * * *")
public void testTimer(){
    System.out.println("每十秒鐘執行一次");
}

}

5.配置攔截器

package com.example.demo.config; import com.example.demo.interceptor.MyInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; @Configuration public class MyInterceptorConfig extends WebMvcConfigurationSupport {

@Bean
public MyInterceptor myInterceptor(){
    return  new MyInterceptor();
}
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    //靜態資源從這裡放過
    registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    super.addResourceHandlers(registry);

}
//新增自定義攔截器
@Override
protected void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(myInterceptor())
            //不攔截的路徑
            .excludePathPatterns("/tt")
            //攔截的路徑
            .addPathPatterns("/testRedis");
    super.addInterceptors(registry);
}

}

自定義攔截器

package com.example.demo.interceptor;

import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(“攔截器開始攔截”); return true; }

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

}

}

6.啟動類

package com.example.demo;

import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import springfox.documentation.swagger2.annotations.EnableSwagger2;

@SpringBootApplication @MapperScan(“com.example.demo.dao”) @EnableSwagger2 public class DemoApplication {

public static void main(String[] args) {
	SpringApplication.run(DemoApplication.class, args);
}

}