文档章节

基于spring boot创建项目模板

boomya
 boomya
发布于 2016/06/12 17:52
字数 1189
阅读 649
收藏 15

spring boot

Spring这个巨无霸因为其优良的设计和功能的完备, 已经是每个Java程序员必备的技能. 不过由于Spring的配置繁琐, 相关模块众多, 增加了框架整合的复杂度, spring boot的出现很好的解决了这些问题, 其设计目的是用来简化新的Spring应用的初始搭建以及开发过程.

spring boot的特点

  1. 可以创建web和non-web类型的项目
  2. 嵌入式servlet容器, 直接使用fat Jar部署, 无需部署War包
  3. 自动化分散配置Spring
  4. 简化Maven配置
  5. 提供production-ready特性, 比如健康指标, 度量数据等

spring boot常用组件
spring boot对常用模块进行了组件化, 整合起来非常容易, 下面是几个常用的spring boot组件

  • spring-boot-starter-web:支持全栈web开发,里面包括了Tomcat和Spring-webmvc。
  • spring-boot-starter-mail:提供对javax.mail的支持.
  • spring-boot-starter-ws: 提供对Spring Web Services的支持
  • spring-boot-starter-test:提供对常用测试框架的支持,包括JUnit,Hamcrest以及Mockito等。
  • spring-boot-starter-actuator:支持产品环境下的一些功能,比如指标度量及监控等。
  • spring-boot-starter-jetty:支持jetty容器。
  • spring-boot-starter-log4j:引入默认的log框架(logback)

项目模板的意义

公司内部的各个开发团队因为技术的偏好以及擅长的技术不同, 在开发项目时都有各自的考虑和选型, 这种情况导致了大部分的项目使用的框架是不同的, 增加了新人上手项目的难度, 而且各个开发团队在重复的造轮子, 技术的积累比较薄弱.
正确的做法是应该有一套合理高效的统一使用的项目模板, 规范开发流程和技术选型, 将主要的精力放在业务的开发上, 而不是重复造轮子.

demo项目介绍

spring-boot-base目录结构

image
补充说明

  • 过滤器
    添加过滤器的方法, 除了demo中提供的配置方式, 也可以在过滤器上直接添加@WebFilter注解实现
  • 内嵌jetty spring boot默认内嵌的是tomcat, 通过修改pom.xml文件, 替换tomcat
......
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
   <exclusions>
       <exclusion>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-tomcat</artifactId>
       </exclusion>
   </exclusions>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
......

jetty高级配置

@Configuration
public class JettyConfig {
    @Bean
    public EmbeddedServletContainerFactory servletContainerFactory(
            @Value("${jetty.threadPool.maxThreads:256}") final String maxThreads,
            @Value("${jetty.threadPool.minThreads:8}") final String minThreads,
            @Value("${jetty.threadPool.idleTimeout:60000}") final String idleTimeout) {
        JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory = new JettyEmbeddedServletContainerFactory();
        jettyEmbeddedServletContainerFactory.addServerCustomizers(new JettyServerCustomizer() {

            @Override
            public void customize(Server server) {
                final QueuedThreadPool threadPool = server.getBean(QueuedThreadPool.class);
                threadPool.setMaxThreads(Integer.valueOf(maxThreads));
                threadPool.setMinThreads(Integer.valueOf(minThreads));
                threadPool.setIdleTimeout(Integer.valueOf(idleTimeout));
            }
        });
        return jettyEmbeddedServletContainerFactory;
    }
}
  • 打包
    spring boot配合maven可以很容易构建可执行jar包, 如果要构建一个普通的jar包, 非可执行的, 需要在pom.xml中增加以下代码
......
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <classifier>exec</classifier>
    </configuration>
</plugin>
......

执行 mvn clean package 会生成两个jar包, xxxx-exec.jar是可执行jar包, xxxx.jar是普通的jar包

整合Druid数据库连接池以及配置相关监控

目前来看, Druid是Java语言中最好的数据库连接池,并且能够提供强大的监控和扩展功能。 在repository模块的pom.xml引入Druid的依赖

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.20</version>
        </dependency>

使用spring-boot的自动配置, 将默认数据库连接池替换为Druid

//MyBatisConfig.java
......
@Bean
public DataSource dataSource() {
    DruidDataSource druidDataSource = new DruidDataSource();
    try {
        druidDataSource.setUrl(jdbcUrl);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        druidDataSource.setMaxActive(maxActive);

        druidDataSource.setFilters("stat");
        druidDataSource.setInitialSize(1);
        druidDataSource.setMaxActive(60000);
        druidDataSource.setMinIdle(1);
        druidDataSource.setTimeBetweenEvictionRunsMillis(60000);
        druidDataSource.setMinEvictableIdleTimeMillis(300000);
        druidDataSource.setTestWhileIdle(true);
        druidDataSource.setTestOnBorrow(false);
        druidDataSource.setTestOnReturn(false);
        druidDataSource.setValidationQuery("select 'x'");
        druidDataSource.setPoolPreparedStatements(true);
        druidDataSource.setMaxOpenPreparedStatements(20);

    } catch (SQLException e) {
        e.printStackTrace();
    }

    return druidDataSource;
}
......

配置Druid的监控Controller, 在web模块下找到DruidStatViewController

@WebServlet(urlPatterns = "/druid/*",
        initParams={
                @WebInitParam(name="allow",value=""),// IP白名单 (没有配置或者为空,则允许所有访问)
                @WebInitParam(name="deny",value=""),// IP黑名单 (存在共同时,deny优先于allow)
                @WebInitParam(name="loginUsername",value="atlas"),// 用户名
                @WebInitParam(name="loginPassword",value="atlas"),// 密码
                @WebInitParam(name="resetEnable",value="false")// 禁用HTML页面上的“Reset All”功能
        })
public class DruidStatViewController extends StatViewServlet {

}

在浏览器打开http://localhost:9090/boom/druid/index.html image

整合mybatis

在repository模块下找到config包

//MyBatisConfig.java
......
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactoryBean() throws Exception {
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dataSource());
    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

    sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mybatis/*.xml"));

    return sqlSessionFactoryBean.getObject();
}
......

//MyBatisMapperScannerConfig.java
@Configuration
@MapperScan("com.boom.base.repository.mapper")
@AutoConfigureAfter({ MyBatisConfig.class, MyBatisConfigDevelopment.class })
public class MyBatisMapperScannerConfig {

    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
        mapperScannerConfigurer.setBasePackage("com.boom.base.repository.mapper");
        return mapperScannerConfigurer;
    }
}

最后

项目位置: spring-boot-base
这个项目只是用来抛砖引玉, 如果能给大家带来一点想法是最好的, 希望大家多提宝贵意见, 谢谢.

© 著作权归作者所有

上一篇: Git flow分支管理
下一篇: volatile详解
boomya
粉丝 20
博文 19
码字总数 25712
作品 0
杭州
程序员
私信 提问
SpringBoot-04:SpringBoot在idea中的俩种创建方式

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 创建SpringBoot工程有很多种方式,我只讲俩种最为常见的 一,依托springboot官网提供的模板。(好处:简单,最新版本) 二...

晨曦dawn
2018/06/24
0
0
恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年
2018/04/19
0
0
SpringBoot系列一:SpringBoot入门

原文出处:晴枫 1 SpringBoot HelloWorld 功能:浏览器发送 sayHello 请求,服务器接受请求并处理,响应 Hello。 1.1 创建一个maven工程 com.seagetechspringboot-helloworld1.0.0 1.2 下载官...

晴枫
2018/11/21
0
0
《Spring Boot 实战:从0到1》第2章 快速开始Hello World

第2章 快速开始Hello World 大约20年前,程序员们使用“企业级Java Bean”(EJB)开发企业应用,需要配置复杂的XML。在二十世纪初期,新兴Java技术——Spring,横空出世。使用极简XML和POJO(...

程序员诗人
2017/08/01
0
0
SpringBoot介绍及常用的搭建方式

SpringBoot简介 Spring Boot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目。它使用习惯优于配置的理念让你的项目快速运行起来,使用Spring Boot很容易创建一个独...

Hans的博客
01/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MongoDB系列-解决面试中可能遇到的MongoDB复制集(replica set)问题

关注我,可以获取最新知识、经典面试题以及微服务技术分享   MongoDB复制集(replica set):MongoDB复制集维护相同数据集的一组mongod进程,复制集是生产部署的基础,具有数据冗余以及高可用...

ccww_
26分钟前
2
0
SpringBoot系列:Spring Boot集成Spring Cache,使用RedisCache

前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache、RedisCache、ConcurrentMapCache等。 这一节我们来看看Spring Cache使用RedisCache。...

杨小格子
34分钟前
2
0
OpenJDK之CountDownLatch

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CountDownLatch是Doug Lea在JDK1.5中引入的,作用就不详细描述了, await()方法,如果还有线程在执行,那么当前线程...

克虏伯
41分钟前
3
0
简单编程

1.编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。 #include<stdio.h>int main(){char name[3];char family[3];printf("Please input your name and family:\n...

电子工程197沈志初
45分钟前
4
0
详解Mysql分布式事务XA(跨数据库事务)

在开发中,为了降低单点压力,通常会根据业务情况进行分表分库,将表分布在不同的库中(库可能分布在不同的机器上)。在这种场景下,事务的提交会变得相对复杂,因为多个节点(库)的存在,可...

slagga
50分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部