基於spring boot建立項目模板

spring boot

Spring這個巨無霸由於其優良的設計和功能的完備, 已是每一個Java程序員必備的技能. 不過因爲Spring的配置繁瑣, 相關模塊衆多, 增長了框架整合的複雜度, spring boot的出現很好的解決了這些問題, 其設計目的是用來簡化新的Spring應用的初始搭建以及開發過程.html

spring boot的特色java

  1. 能夠建立web和non-web類型的項目
  2. 嵌入式servlet容器, 直接使用fat Jar部署, 無需部署War包
  3. 自動化分散配置Spring
  4. 簡化Maven配置
  5. 提供production-ready特性, 好比健康指標, 度量數據等

spring boot經常使用組件
spring boot對經常使用模塊進行了組件化, 整合起來很是容易, 下面是幾個經常使用的spring boot組件git

  • 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
補充說明github

  • 過濾器
    添加過濾器的方法, 除了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高級配置web

@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包spring

整合Druid數據庫鏈接池以及配置相關監控

目前來看, Druid是Java語言中最好的數據庫鏈接池,而且可以提供強大的監控和擴展功能。 在repository模塊的pom.xml引入Druid的依賴sql

<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 這個項目只是用來拋磚引玉, 若是能給你們帶來一點想法是最好的, 但願你們多提寶貴意見, 謝謝.

相關文章
相關標籤/搜索