Spring Boot开发之流水无情(二)
http://my.oschina.net/u/1027043/blog/406558

上篇散仙写了一个很简单的入门级的Spring Boot的例子,没啥技术含量,不过,其实学任何东西只要找到第一个突破口,接下来的事情就好办了,人最怕什么? 我想莫过于干一件事情,没有下手的地方了,而当你一旦找到了这感觉,就可以很喜悦的顺藤摸瓜般的探索你强烈想探索求知的某种事物了,这种冥冥之中玄而又玄的感觉是什么?回想一下:
(1) 当你把第一个某种编程语言的Hello World的例子,成功的运行在一个IDE中
(2) 当你第一次从老家出发到达了某个你从未涉足过的地方
(3) 当你成功的完成了第一次网购
一切的不相关的事物之间的,其实都有类似的学习历程,正是所谓的触类旁通,万法归宗!
关于Spring Boot这块,其实里面涉及的内容非常多也非常灵活,散仙的项目中用到的模块也只是冰山一角,不可能完全覆盖所有有关的模块,完全是为了项目而用技术,不是为了技术而诞生了这个项目,所以这次记录的心得,完全是项目有关的,而不是Spring Boot一个学习教程,这一点,希望各位看官明白,如果想专攻学习Spring Boot,推荐点击官网更详细的教程
一个项目是由多种不同层面的技术组成的,所以散仙不会只写有关Spring Boot方面的,虽然Spring Boot是主线。大多数情况下,都会集成多种不同的技术,只有各自发挥自己擅长的优势,才能组合出最优的架构。
好了,多说了点废话,下面看下本篇记录Spring Boot的几个知识点:
(一)一个Maven+Spring Boot项目基本的包结构形式
(二)一个简单的在Spring Boot项目集成安全控制
(二)如何在Spring Boot中记录log日志
(四)Spring Boot中几个常用注解介绍
ok下面开始正题:
(一)先看下,官网给出的一个简单的包结构组成:

- com
- +- example
- +- myproject
- +- Application.java
- |
- +- domain
- | +- Customer.java
- | +- CustomerRepository.java
- |
- +- service
- | +- CustomerService.java
- |
- +- web
- +- CustomerController.java
然后,看下散仙实际工作中的项目结构:

需要注意的地方如下:
1,在src/main/java包下的第一层结构中,是必须放一个含有main方法的主启动的类,而且只能有一个main方法,如果再出现其他的main方法,在使用maven编译打包时,会报编译错误,当然在src/test/java包下,可以出现多个,但建议最好使用Junit进行单元测试.
这个main方法启动,就会启动内嵌的tomcat或jetty容器,然后加载所有需要加载的或扫描的类或资源文件。上篇博客中,散仙为了测试方便,是直接在当前的Conroller中,启动了一个测试服务,这样做适合单独调试,如果是生产环境下的启动方法,则是散仙前面所讲的,在java包的根目录下建立一个main方法类,负责启动所有的资源。
在本例中,散仙的main代码如下:

- package com.dhgate.rate;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
- import org.springframework.context.annotation.ComponentScan;
- import org.springframework.context.annotation.Configuration;
- @Configuration//配置控制
- @EnableAutoConfiguration//启用自动配置
- @ComponentScan//组件扫描
- public class ApplicationMain {
- public static void main(String[] args) throws Exception {
- //启动Spring Boot项目的唯一入口
- SpringApplication.run(ApplicationMain.class, args);
- }
- }
2,在src/main/resource目录下面,是放置一些配置文件,或模板支持的文件,如JSP,Velocity,Freemaker等,这里面比较常用或重要的一个文件,就是Spring Boot的集中式配置文件application.properties这个文件了,这里面给其他大部分的组件,提供了一个可集中管理和配置的中心,包括安全控制,redis,solr,mangodb的连接信息,以及数据库连接池,容器端口号,jmx,java mail,动态模板等。此外这个目录下默认是可以访问静态资源的,比如我们的css,js,或者第三方的一些引用文件等。
(二)关于在Spring Boot的配置简单的安全访问控制,这一点非常容器,我们只需要做如下二步,即可。
1,在pom文件中,引入spring-boot-starter-security的maven依赖。

- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-security</artifactId>
- </dependency>
2,在application.properties中,配置访问的用户名和密码

- #用户名 密码配置
- security.user.name=admin
- security.user.password=test
再次,访问链接时,会出现以下,拦截页面,就代表配置成功:

当然这只是,一个初级的配置,更复杂的配置,可以分不用角色,在控制范围上,能够拦截到方法级别的权限控制。
(三)日志的重要性,不言而喻,Spring Boot支持大部分的log配置,其中包括:
(1)java util logging
(2)log4j
(3)log4j2
(4)logbak
默认的情况下spring boot会选择logback作为日志记录的载体,当然要想它正常的工作,需要依赖 Commons Logging, Java Util Logging, Log4J 或 SLF4J,相信大部分同学都是选择使用log4j.properties作为我们的日志配置和管理,但是散仙在Spring Boot中一直没有测试集成成功,所以就放弃使用log4j.properties作为日志载体,而是选择了Spring Boot推荐的logbak作为日志的配置文件,用过之后感觉也不错。
使用步骤:
1,将logbak.xml拷贝至resource目录下的根目录,然后在logbak.xml中,配置相关的log生成规则,log级别,以及日志路径,log的字符编码集,这个非常重要,因为刚开始用这个log记录程序运行的信息时,发现它不支持中文log,后来经查名,需要配置相关的log编码才可以正确记录对应的信息。一个通用的配置如下:

- <!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->
- <configuration scan="true" scanPeriod="10 seconds">
- <!-- Simple file output -->
- <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <!-- encoder defaults to ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
- <encoder>
- <pattern>
- [ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n
- </pattern>
- <charset>UTF-8</charset> <!-- 此处设置字符集 -->
- </encoder>
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!-- rollover daily 配置日志所生成的目录以及生成文件名的规则 -->
- <fileNamePattern>logs/mylog-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy
- class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <!-- or whenever the file size reaches 64 MB -->
- <maxFileSize>64 MB</maxFileSize>
- </timeBasedFileNamingAndTriggeringPolicy>
- </rollingPolicy>
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>DEBUG</level>
- </filter>
- <!-- Safely log to the same file from multiple JVMs. Degrades performance! -->
- <prudent>true</prudent>
- </appender>
- <!-- Console output -->
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
- <!-- encoder defaults to ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
- <encoder>
- <pattern>
- [ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n
- </pattern>
- <charset>GBK</charset> <!-- 此处设置字符集 -->
- </encoder>
- <!-- Only log level WARN and above -->
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>WARN</level>
- </filter>
- </appender>
- <!-- Enable FILE and STDOUT appenders for all log messages.
- By default, only log at level INFO and above. -->
- <root level="INFO">
- <appender-ref ref="FILE" />
- <appender-ref ref="STDOUT" />
- </root>
- <!-- For loggers in the these namespaces, log at all levels. -->
- <logger name="pedestal" level="ALL" />
- <logger name="hammock-cafe" level="ALL" />
- <logger name="user" level="ALL" />
- </configuration>
2,在application.properties中,指定log文件的加载路径,已经配置通用的log日志级别:

- #指定log的配置文件,以及记录Spring Boot的log级别
- logging.config=logback.xml
- logging.level.org.springframework.web: INFO
(四)介绍下Spring Boot中几个常用的注解,其中大部分都是来自Spring MVC的注解,这些注解使用的频率一般都在90%之上。
(1)@RestController和@Controller指定一个类,作为控制器的注解
(2)@RequestMapping方法级别的映射注解,这一个用过Spring MVC的小伙伴相信都很熟悉
(3)@EnableAutoConfiguration和@SpringBootApplication是类级别的注解,根据maven依赖的jar来自动猜测完成正确的spring的对应配置,只要引入了spring-boot-starter-web的依赖,默认会自动配置Spring MVC和tomcat容器
(4)@Configuration类级别的注解,一般这个注解,我们用来标识main方法所在的类
(5)@ComponentScan类级别的注解,自动扫描加载所有的Spring组件包括Bean注入,一般用在main方法所在的类上
(6)@ImportResource类级别注解,当我们必须使用一个xml的配置时,使用@ImportResource和@Configuration来标识这个文件资源的类。
(7)@Autowired注解,一般结合@ComponentScan注解,来自动注入一个Service或Dao级别的Bean
(8)@Component类级别注解,用来标识一个组件,比如我自定了一个filter,则需要此注解标识之后,Spring Boot才会正确识别。
ok,本篇的讲解,就到此结束,这些都是项目工程的基础知识,了解这些,有助于我们快速的上手一个Spring Boot应用。
下篇博客的内容会写:
(1)如何在Spring Boot项目中集成Spring Loaded框架,来完成模块热加载和代码动态编译,有了这个东西,我们开发的效率会更加高效,大部分情况下我们改了一个类或方法的代码之后,都不需要重启应用,因为Spring Loaded会定时重新编译并加载代码。
(2)如何在Spring Boot项目中集成Velocity,Spring Boot支持多种模板引擎,包括
1,FreeMarker
2,Groovy
3,Thymeleaf
4,Velocity
5,JSP (Spring Boot官方不推荐)
我们可以根据熟悉程度来选择自己喜欢的引擎。
Spring Boot开发之流水无情(二)的更多相关文章
- 使用Spring Boot开发Web项目(二)之添加HTTPS支持
上篇博客使用Spring Boot开发Web项目我们简单介绍了使用如何使用Spring Boot创建一个使用了Thymeleaf模板引擎的Web项目,当然这还远远不够.今天我们再来看看如何给我们的We ...
- Spring Boot 2.X(十二):定时任务
简介 定时任务是后端开发中常见的需求,主要应用场景有定期数据报表.定时消息通知.异步的后台业务逻辑处理.日志分析处理.垃圾数据清理.定时更新缓存等等. Spring Boot 集成了一整套的定时任务工 ...
- Spring Boot入门系列(十五)Spring Boot 开发环境热部署
在实际的项目开发过中,当我们修改了某个java类文件时,需要手动重新编译.然后重新启动程序的,整个过程比较麻烦,特别是项目启动慢的时候,更是影响开发效率.其实Spring Boot的项目碰到这种情况, ...
- Spring Boot入门系列(二十)快速打造Restful API 接口
spring boot入门系列文章已经写到第二十篇,前面我们讲了spring boot的基础入门的内容,也介绍了spring boot 整合mybatis,整合redis.整合Thymeleaf 模板 ...
- Java Spring Boot VS .NetCore (二)实现一个过滤器Filter
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...
- 使用Spring boot开发RestFul 风格项目PUT/DELETE方法不起作用
在使用Spring boot 开发restful 风格的项目,put.delete方法不起作用,解决办法. 实体类Student @Data public class Student { privat ...
- Spring Boot 开发系列一 开发环境的一些九九
从今天开始写这个Spring Boot 开发系列,我是第二周学习JAVA的,公司号称springboot把JAVA的开发提升到填空的能力,本人是NET转JAVA的,想看看这个填空的东西到底有多强.废话 ...
- 《Spring Boot官方指南》(二)入门
如果您刚开始接触Spring Boot,或者简称’Spring’, 这个部分对您来说非常有用.这个部分提供了“是什么?”,“怎么做?”和 “为什么?”的解释.您除了会阅读一份附带Spring Boot ...
- Spring Boot开发HTTPS协议的REST接口
Spring Boot开发HTTP的REST接口流程在前文中已经描述过,见<SpringBoot开发REST接口>. 如需要支持HTTPS,只需要在如上基础上进行设置.修改/resourc ...
随机推荐
- Java学习--编译器javac
Java的源程序为.java文件, 编译后生成.class文件(字节码文件); javac(java compiler的简写)是java语言的编译器. Hello.java public class ...
- 为你的 Hadoop 集群选择合适的硬件
随着Apache Hadoop的起步,云客户的增多面临的首要问题就是如何为他们新的的Hadoop集群选择合适的硬件. 尽管Hadoop被设计为运行在行业标准的硬件上,提出一个理想的集群配置不想提供硬件 ...
- JVM指令详解(上)
指令码 助记符 说明 0x00 nop 什么都不做 0x01 ...
- .NetCore 下使用多个DbContext
一个项目中使用多个DbContext 或者种数据库的多个DbContext 业务需要 单个DbContext使用不需要给出说明 1.dotnet ef migrations add migration ...
- Spring Cloud与Docker微服务架构实战 PDF
电子版百度云下载 链接: https://pan.baidu.com/s/115u011CJ8MZzJx_NqutyTQ 提取码: 关注公众号[GitHubCN]回复2019获取 本书的代码 共计70 ...
- sklearn GMM模型介绍
参考 SKlearn 库 EM 算法混合高斯模型参数说明及代码实现 和 sklearn.mixture.GaussianMixture 以前的推导内容: GMM 与 EM 算法 记录下 ...
- web程序快速开发
关于web程序快速开发个人见解以及经历 由于在之前公司业务的发展,需要在基于核心业务的基础上开发其他较为独立的业务系统,所以就有了这个基于Dapper,DDD概念的基础框架,由于个人基于这个框架已经经 ...
- 【AtCoder】AGC029(A-E)
A - Irreversible operation 题解 把每个B后面的W个数累加起来即可 代码 #include <bits/stdc++.h> #define fi first #d ...
- 【LOJ】#2106. 「JLOI2015」有意义的字符串
题解 点一个技能点叫特征方程 就是 \(a_{n + 2} = c_1 a_{n + 1} + c_2 a_{n}\) \(x^2 = c_1 x + c_2\) 解出两根来是\(x_1,x_2\) ...
- 使用SOCKET获取网页的内容
使用fsockopen()函数来实现获取页面信息,完整代码如下 //设置字符集(由于要抓取的网易网站字符集编码是gbk编码) header("content-type:text/html;c ...