SpringBoot构建项目-01

1. 整合

用SpringBoot搭建一个web应用

流程:

  1. 在pom.xml中配置
    <parent>
        <groupId>org.springframework.boot </groupId>
        <artifactId>spring-boot-starter-parent </artifactId>
        <version>2.0.5.RELEASE</version>
    </parent>

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

在此xml中需要说明:

<parent>标签:对子模块的一个收集,用于对集成的jar包管理,spring-boot-starter-parent管理springboot所需要的jar包及版本,在它以上还有一层父级项目,集成了springboot所有的依赖!

spring-boot-starter-web 整合了web层所需要的所有依赖!例如(spring-mvc、日志、tomcat、json等)

  1. 创建启动类
@RestController
@EnableAutoConfiguration
public class Example {
    @RequestMapping("/")
    String home() {
        return "Hello World!";
    }
    public static void main(String[] args) {
        SpringApplication.run(Example.class, args);
    }
}

@RestController:注解是一个组合标签包含@controller@responsbody

@EnableAutoConfiguration:注解启用自动配置

通过AutoConfigurationImportSelector导入选择器,在getCandidateConfigurations方法中加载META-INF/spring.factories下的配置类的全限定名来创建bean。

SpringApplication.run:加载当前配置类,启动springboot应用,先准备应用数据和环境,创建加载容器,加载容器,加载注册bean,解析配置类做自动配置,把项目打包到内嵌的tomcat,运行项目!

2. 分离

把控制层和启动配置类分开

@ComponentScan
@Configuration
@EnableAutoConfiguration
public class HelloConfig {
    public static void main(String[] args) {
        SpringApplication.run(HelloConfig.class,args);
    }
}
@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        return "hello spring-boot";
    }
}

需要使用@ComponentScan注解去扫描带有@RestController注解的控制类,加载该类

简化的写法:

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

@SpringBootApplication:该注解集成了

@ComponentScan
@Configuration
@EnableAutoConfiguration

这三个注解!

3. SpringBoot打包、热部署

3.1 打包

  1. 导入打包插件
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
  1. idea右侧点击Maven Projects选择LifeCycle中的maven-package或者install,会自动在target目录下生成jar

  2. 在jar包目录下cmd执行命令

java -jar jar包名

3.2 热部署

  1. 导入热部署插件
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
 </dependency>
  1. 每次修改后重写编译项目即可

4. 项目结构

在resource下可以自定义springboot配置

例如在application.properties中修改端口号:

server.port=8181

或者新建一个application.yml

server:
  port: 8181

在resource下

static文件夹:存放静态资源:例如js、css...

templates文件夹:存放模板文件,不能使用浏览器直接访问,必须经过controller访问!

5. SpringBoot配置

5.1 yml语法

yml使用key:value 的形式来表示属性和值,用:相连,值与:之间有空格

name: zs

同一层级下需要缩进

user:
  username: ls
  age: 23
  sex: true

可以使用json格式,值与:之间有空格

user: {username: ww,age: 18,sex: false}

数组的表示

annimals: [cat,dog,fish]

或者:

animals:
  -cat
  -dog
  -fish

5.2 使用注解的方式读取yml

@Value 注解springboot在启动时读取配置文件会将其中的配置项加载到spring的环境中

@RestController
public class HelloController {
    @Value(value = "${name}")
    private String name;
    @RequestMapping("/hello")
    public String hello(){
        System.out.println(name);
        return "hello spring-boot";
    }
}

@ConfigurationProperties(prefix = "")注解springboot在启动时读取配置文件会根据前缀prefix把所有配置项读到配置类或实体类中,将配置项与字段做同名匹配,然后赋值!

例如:

将配置文件中的user配置项的值封装到实体类中!该实体类必须交给spring管理

user:
  username: ls
  age: 23
  sex: true
@ConfigurationProperties(prefix = "user")
@Component
public class People {
    private String username;
    private String age;
    private Boolean sex;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public Boolean getSex() {
        return sex;
    }

    public void setSex(Boolean sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "People{" +
                "username='" + username + '\'' +
                ", age='" + age + '\'' +
                ", sex=" + sex +
                '}';
    }
}

5.3 profile多环境支持

有时候在开发环境和测试环境使用的配置是不一样的,此时可以配置profile来满足多种环境的需求!

方式1:把多种配置写在一个配置文件内,通过spring: profiles: active: dev,active来激活当前主要配置!

spring:
  profiles:
    active: dev
---

server:
  port: 8888
spring:
  profiles: dev
---
server:
  port: 7777
spring:
  profiles: test
---
server:
  port: 6666
spring:
  profiles: prod

方式2:配置多个不同的配置文件例如application-dev.yml 、application-test.yml,然后再主要的配置文件application.yml指定当前环境使用哪一种配置!

**application-dev.yml **

server:
  port: 5555

application-test.yml

server:
  port: 4444

application.yml

spring:
  profiles:
    active: dev

会根据文件名字匹配!

6. SpringBoot的测试

  1. 导包
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test </artifactId>
        </dependency>
  1. 测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class MySpringBootTest {
    @Test
    public void test(){
        System.out.println("hello spring boot");
    }
}

@RunWith:与之前的Spring的测试不同,这里是使用SpringRunner的方式!

@ContextConfiguration:使用的配置类!

7. SpringBoot日志

1. 日志等级:

从小到大:error-warning-info-debug-trace

需要说明,日志等级配置的是什么,只会打印它及其它等级以下的信息,例如我配置了info,那么error、warning等级的信息也会打印出来,但是debug的就不会打印!

可以在yml中配置需要打印的日志等级

logging:
  level: 
    root: debug

2. SpringBoot日志框架logback

SpringBoot默认的logback配置文件:logback.xml、logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="false" scanPeriod="60 seconds" debug="false">
    <!-- 定义日志的根目录 -->
    <property name="LOG_HOME" value="/hrm/logs" />
    <!-- 定义日志文件名称 -->
    <property name="appName" value="itsource-springboot"></property>
    <!-- ch.qos.logback.core.ConsoleAppender 表示控制台输出 -->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!--
        日志输出格式:
            %d表示日期时间,
            %thread表示线程名,
            %-5level:级别从左显示5个字符宽度
            %logger{50} 表示logger名字最长50个字符,否则按照句点分割。 
            %msg:日志消息,
            %n是换行符
        -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </layout>
    </appender>

    <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->  
    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 指定日志文件的名称 -->
        <file>${LOG_HOME}/${appName}.log</file>
        <!--
        当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名
        TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。
        -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--
            滚动时产生的文件的存放位置及文件名称 %d{yyyy-MM-dd}:按天进行日志滚动 
            %i:当文件大小超过maxFileSize时,按照i进行文件滚动
            -->
            <fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!-- 
            可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每天滚动,
            且maxHistory是365,则只保存最近365天的文件,删除之前的旧文件。注意,删除旧文件是,
            那些为了归档而创建的目录也会被删除。
            -->
            <MaxHistory>365</MaxHistory>
            <!-- 
            当日志文件超过maxFileSize指定的大小是,根据上面提到的%i进行日志文件滚动 注意此处配置SizeBasedTriggeringPolicy是无法实现按文件大小进行滚动的,必须配置timeBasedFileNamingAndTriggeringPolicy
            -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 日志输出格式: -->     
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
        </layout>
    </appender>

    <!-- 
        logger主要用于存放日志对象,也可以定义日志类型、级别
        name:表示匹配的logger类型前缀,也就是包的前半部分
        level:要记录的日志级别,包括 TRACE < DEBUG < INFO < WARN < ERROR
        additivity:作用在于children-logger是否使用 rootLogger配置的appender进行输出,
        false:表示只用当前logger的appender-ref,true:
        表示当前logger的appender-ref和rootLogger的appender-ref都有效
    -->
    <!-- hibernate logger -->
    <logger name="cn.itsource" level="debug" />
    <!-- Spring framework logger -->
    <logger name="org.springframework" level="debug" additivity="false"></logger>



    <!-- 
    root与logger是父子关系,没有特别定义则默认为root,任何一个类只会和一个logger对应,
    要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的appender和level。 
    -->
    <root level="info">
        <appender-ref ref="stdout" />
        <appender-ref ref="appLogAppender" />
    </root>
</configuration> 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容