springboot基礎学習


spring-bootの勉強
spring-bootは長い間出てきました。ずっと勉強する時間がありません。ちょうどこの時間はプロジェクトがそんなに忙しくなくて、記録を勉強します。
github:https://github.com/liangyt/springbootbase
         ,              。
       spring-boot-starter-thymeleaf   ,                  .
learn.01
この分岐は比較的基本的な構成集積である。
一.mybatis-spring-boot-starterとdruid
関連する依存パケットを導入する

<dependency>
    <groupId>org.mybatis.spring.bootgroupId>
    <artifactId>mybatis-spring-boot-starterartifactId>
    <version>${mybatis.springboot.version}version>
dependency>
<dependency>
    <groupId>mysqlgroupId>
    <artifactId>mysql-connector-javaartifactId>
dependency>

<dependency>
    <groupId>com.alibabagroupId>
    <artifactId>druidartifactId>
    <version>${druid.version}version>
dependency>
spring-bootのデフォルトのプロファイルaplication.properties付属品mysqlとdruid関連のデータ
#          
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost/test?useUnicode=true&characterEncode=utf-8
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# druid       
#       、  、  
spring.druid.initial-size=5
spring.druid.min-idle=5
spring.druid.max-active=20
#           
spring.druid.max-wait=60000
#            ,           ,     
spring.druid.time-between-eviction-run-millis=60000
#               ,     
spring.druid.min-evictable-idle-time-millis=30000
spring.druid.validation-query=select 1 from dual
spring.druid.test-while-idle=true
spring.druid.test-on-borrow=false
spring.druid.test-on-return=false
spring.druid.pool-prepared-statement-per-connection-size=20
#        filters,       sql    ,'wall'     
spring.druid.filters=stat,wall,log4j
#   connectProperties     mergeSql  ; SQL  
spring.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
druidを使うにはJAVAの配置の仕事をしなければなりません。具体的にはこのタイプを見てください。
com.liangyt.config.db.DruidSource
中には二つの処理があります。dataSourceと事務を再処理します。もう一つの種類も注意してください。
com.liangyt.config.db.DruidConfig
このクラスはdruid自身のservletに対する処理で、druidのクライアントインターフェースにアクセスしないと処理が不要だと感じています。
mybatisの配置:この配置は簡単です。appication.propertiesファイルには2行の構成コードしかありません。
# mybatis
mybatis.type-aliases-package=com.liangyt.entity
mybatis.mapper-locations=classpath:mybatis/**/*.xml,classpath:mybatis/*.xml
mybatisは本体の経路とスキャンが必要なmapperファイルの位置を処理する必要があると教えてください。同様にspring-bootが起動する時はコメントを追加してください。
@MapperScan(basePackages = "com.liangyt.repository")
mapperScanスキャンを開始します。
二.mybatis-generatorは主にデータベーステーブルからEntity、mapperとrepositoryの生成を便利にするために。
一つの依存
<dependency>
    <groupId>org.mybatis.generatorgroupId>
    <artifactId>mybatis-generator-maven-pluginartifactId>
    <version>${mybatis.generator.version}version>
dependency>
プラグイン

<plugin>
    <groupId>org.mybatis.generatorgroupId>
    <artifactId>mybatis-generator-maven-pluginartifactId>
    <version>${mybatis.generator.version}version>
    <configuration>
        <configurationFile>src/main/resources/generator/generatorConfig.xmlconfigurationFile>
        <overwrite>trueoverwrite>
        <verbose>trueverbose>
    configuration>
plugin>
このうち、mybatis-generatorの配置はファイル(src/main/resource/generator/generator/generator Config.xml)に詳しく説明されていますので、そのまま見てください。
耐久層に関する処理は基本的にこれらです。
三.thymeleaf-layout-dialect
ビュー層はspring-bootが推奨するthymeleafを使用していますが、以前はsitemeshの使用に慣れていたので、ここではthymeleaf-layout-dialectの構成もsitemeshのような機能を使用しています。spring-boot-starter-thymeleaf依存性はすでにspring-layout-dialectを含んでいますので、繰り返し依存を追加しなくてもいいです。直接配置すればいいです。thymeleaf-layout-dialectという前に、まず一つの依存を追加してください。nekoです。この依存性を追加していない場合は、実行を説明してもいいですが、ラベルの解析はとても厳しいです。導入も簡単です。

<dependency>
    <groupId>nekohtmlgroupId>
    <artifactId>nekohtmlartifactId>
    <version>1.9.6.2version>
dependency>
同時にappication.propertiesに配置を追加します。
spring.thymeleaf.mode=LEGACYHTML5
thymeleaf-layout-dialectに戻ります。それを使う前に、まずLayout Dialectを配置してください。
@Configuration
public class ThymeleafLayout{

    @Bean
    public LayoutDialect layoutDialect() {
        return new LayoutDialect();
    }
}
Bean LayoutDialectをセットして、それを使ってもいいです。ここでは簡単に二つのページを配置しています。

<html lang="en" xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>  title>
    <link rel="stylesheet" th:href="@{css/element-ui.css}" />
    <script th:src="@{js/vue.js}">script>
    <script th:src="@{js/element-ui.js}">script>
    <script th:src="@{js/axios.js}">script>
head>
<body>
test
<div layout:fragment="content">div>
body>
html>
注目点は主に二つあります。
1.xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout"
2.

这个布局文件一般是留一个位置用于存放动态变化的内容,也就是layout:fragment="content"这个Div的位置.

再来看看动态内容的文件:hello.html


<html xmlns:th="http://www.thymeleaf.org"
    xmlns:layout="http://www.ultrag.net.nz/thymeleaf/layout"
    layout:decorator="layout/layout">
<head>
    <title>Hellotitle>
    <link rel="stylesheet" th:href="@{css/hello.css}">
    <script th:src="@{js/hello.js}">script>
head>
<body>
<div layout:fragment="content">
    <span th:text="${hello}">span>
div>
body>
html>
このファイルの内容はあまり注目されない点が三つあります。
1.html     
2.head     
3.layout:fragment="content"     
1.ラベルの定義は主にこのファイルが必要なのはどのレイアウトファイルですか?2.headタグの内容はレイアウトファイルのheadタグの内容の後に追加され、titleの内容はレイアウトファイルのtitleの内容を差し替えることができます。3.layout:fragment="content"タグの内容はレイアウトファイルの

, 。

. thymeleaf

controller , model, , Controller :

@Controller
@RequestMapping(value = "/")
public class TestController {

    @RequestMapping(value = "/hello")
    public String hello(Model model) {
        model.addAttribute("hello", "  ");
        return "hello";
    }
}

Controller, :
WebMvcConfigurerAdapter を り えることになります。カバー addViewControllers

/**
 *               ,   Controller
 * @param registry
 */
@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("index").setViewName("/index");
    super.addViewControllers(registry);
}
コードが アクセスできる /indexというパス、すなわちアクセス/resource/templates/index.ページです。 のページがあれば、 に の で すればいいです。また、 も えます。
.webブロック
スクリーンショットの はスプリングmvcと じで、org.springframework.web.servlet.HandlerInterceptorを する があります。ここでは にコードを り けます。ご ください。
@Component
public class TestControllerInterceptor implements HandlerInterceptor {

    @Autowired
    private TestService testService;

    /**
     *   controller      
     * @param request
     * @param response
     * @param handler
     * @return    false    controller    true   controller
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println(request.getRequestURI());

//        if ("/api/test/all".equals(request.getRequestURI())) return false;
        return true;
    }

    /**
     *   controller     ,           ,        model  
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        List list = testService.selectAll();
        System.out.println(list);
    }

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

    }
}
にこのブロックを するところで、 のxmlからjavaコードの に されています。これはControllerを して ページにアクセスしないように されています。 じクラスです。 きだけで の が されました。
@Autowired
private TestControllerInterceptor testControllerInterceptor;

/**
 *      
 * @param registry
 */
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(testControllerInterceptor).addPathPatterns("/api/test/**");
    super.addInterceptors(registry);
}
TestControllerInterceptorの は@Autowiredによって されて される があり、newによって されないことに されたい。
.hibernate validator
この は で する もありません。spring-book-starter-webの ではすでにこの があります。これを するには であり、エンティティクラスに を する は に において の を するとともに、@Autowiredクラスに Controllerを いてエンティティが する があると する がある。
@RequestMapping(value = "/saveOrUpdate", method = RequestMethod.POST)
public Object saveOrUpdate(@RequestBody @Validated Test test) {
    if (test.getId() != null) {
        testService.update(test);
    }
    else {
        test.setId((int)(Math.random() * 100));
        testService.insert(test);
    }
    return MessageReturn.success("  ");
}
な い はネット の でも なくないです。ここに を り けます。
             
@Valid@Null             null
@NotNull               null
@AssertTrue           true
@AssertFalse              false
@Min(value)              ,              
@Max(value)              ,              
@DecimalMin(value)               ,              
@DecimalMax(value)               ,              
@Size(max, min)                   
@Digits (integer, fraction)              ,            
@Past                   
@Future                 
@Pattern(value)                   

2. Hibernate Validator     constraint

               
@Email                 
@Length(min=, max=)                    
@NotEmpty               
@Range(min=, max=)                 
@NotBlank               
@URL(protocol=, host=,    port=,  regexp=, flags=)                 url
@CreditCardNumber            Luhn    ,    ,          Luhn      
@ScriptAssert(lang=, script=, alias=)     Java Scripting API  JSR 223 ("Scripting for the JavaTM Platform")   
@SafeHtml(whitelistType=, additionalTags=)  classpath   jsoup 

hibernate      ,  3    ,   。
     @NotNull  @NotEmpty  @NotBlank 3@NotNull                value   null
@NotEmpty                0,      ,          null
@NotBlank                 null,     trim()  length   0
@Validated クラスでは、 のためのグローバルブロッキング を い、 りの を する。
/**
     *     hibernate validator         (BindException)
     *
     * @param ex   
     * @return       
     * {
     *     code: 0,
     *     message: "  ",
     *     data: {
     *         name: "      ",
     *         ...
     *     }
     * }
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Object validatorException(MethodArgumentNotValidException ex) {

        List errors = ex.getBindingResult().getFieldErrors();

        MessageReturn mr = MessageReturn.fail();
        for (FieldError fe : errors) {
            mr.add(fe.getField(), fe.getDefaultMessage());
        }

        return mr;
    }
  • の はここまで しました。 わりました。
    learn.02
    ここからはブランチcom.liangyt.common.view.BaseControllerに づいて される。
    、ロゴバック
    spring-bootのデフォルトのログプラグインはlogbackで、spring-book-starterの でデフォルトで しました。
    logback-classic
    logback-core
    slf4-api
    jcl-over-slf4j
    jul-to-slf4j
    log4j-over-slf4j
    spring-bootはログを するためのパラメータも していますが、 ファイルに して し が し です。この は のように されています。
    #     
    #      ,spring boot               ERROR,WARN,INFO;      DEBUG       debug=true;
    debug=true
    #     
    logging.pattern.console=%-4relative [%thread] %-5level %logger{35} - %msg %n
    logging.pattern.file=%-4relative [%thread] %-5level %logger{35} - %msg %n
    #                ;root    
    logging.level.root=DEBUG
    logging.level.com.liangyt=DEBUG
    #logging.level.org.springframework.web=DEBUG
    #       
    logging.path=logs
    logging.file=log.log
    が に くないなら、この もほぼ です。もちろんここでもログプロファイルを するパラメータを していますが、 したことがありません。
    logging.config=logconfig.xml
    
    appication.propertiesを って する に、それはlogback.xmlファイルを します。logback.xmlのプロファイルの で しく しましたが、ここではもう り しません。ファイルを れば、 ラベルの が かります。 してみましたが、ログをmongodbに してみました。いい じです。 も です。 を :
    
    <dependency>
        <groupId>org.mongodbgroupId>
        <artifactId>mongo-java-driverartifactId>
        <version>3.4.2version>
    dependency>
    1つのクラスと のログの :mongodbの を し、ログをデータベースに するクラスは、class を して されます。
    
    <appender name="MONGODB" class="com.liangyt.config.db.LogMongoDBAppender">
        <DbHost>localhostDbHost>
        <DbPort>27017DbPort>
        <DbName>exappDbName>
        <DbCollectionName>loggingDbCollectionName>
    appender>
    
    
    
    <logger name="com.liangyt" level="DEBUG">
        <appender-ref ref="MONGODB" />
    logger>
    このようにすればlearn.01が したログはこのクラスcom.liangytに み、 き com.liangyt.config.db.LogMongoDBAppenderがデータベースに される。
    するログ をデータベースに したい は、このように できます。
    protected Logger mongodbLogger = LoggerFactory.getLogger("MONGODB");
    mongodbLogger.info("       ");
    、AOPを するappendの にはすでにspring-boot-starter-thymeleafがありますが、spring-aopに する つのパケットが りないだけですので、 の つの を する があります。
    
    <dependency>
        <groupId>org.aspectjgroupId>
        <artifactId>aspectjrtartifactId>
        <version>${aspectj.version}version>
    dependency>
    <dependency>
        <groupId>org.aspectjgroupId>
        <artifactId>aspectjweaverartifactId>
        <version>${aspectj.version}version>
    dependency>
    いいですただaopをやりたいなら、 つのプロジェクトを って、org.aspectjを して、spring-book-starterを みます。spring-boot-starter-aop