SpringBoot创建和使用

Posted 啵啵虎的抽抽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot创建和使用相关的知识,希望对你有一定的参考价值。

目录

什么是SpringBoot

SpringBoot的优点

SpringBoot项目的创建

1、使用idea创建

2、项目目录介绍和运行 

Spring Boot配置文件

 1、配置文件

2、配置文件的格式

3、properties

3.1、properties基本语法

 3.2、读取配置文件

 3.3、缺点

4、yml

4.1、优点

4.2、yml基本语法

4.3、yml配置数据类型

4.4、yml配置对象

5、properties和yml

6、设置不同环境的配置文件

SpringBoot日志文件

1、日志的功能

2、SpringBoot使用日志

2.1、先得到日志对象

2.2、使用日志对象来打印日志(使用日志对象提供的内置方法打印)

3、日志级别

3.1、作用

3.2、日志级别

3.3、日志级别的设置

4、日志持久化

5、更简单的日志输出-lombok

5.1、添加lombok依赖

 5.2、使用@slf4j注解输出日志

5.3、lombok原理

5.4、lombok的注解说明


什么是SpringBoot

Spring Boot是一种全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

SpringBoot的优点

1、快速集成框架,Spring Boot提供了启动添加依赖的功能,用于秒级集成各种框架;

2、内置运行容器,无需配置Tomcat等 Web容器,直接运行和部署程序;

3、快速部署项目,无需外部容器即可启动并运行项目;

4、可以完全抛弃繁琐的XML,使用注解和配置的方式进行开发;

5、支持更多的监控的指标,可以更好的了解项目的运行情况。

SpringBoot项目的创建

1、使用idea创建

如果使用的是idea社区版,则需要安装Spring Boot Helper插件

 

2、项目目录介绍和运行 

Spring Boot目录介绍

一个简单的Spring Boot代码实现:

@Controller  //控制器
@ResponseBody  //返回的是数据,而非页面
public class TestController 
    @RequestMapping("/hi")  //url路由注册
    public String sayHi(String name)
        //为空为null,默认值处理
        if (!StringUtils.hasLength(name))
            name="baekhyun";
        
        return "你好:"+name;
    
@SpringBootApplication
public class DemoApplication 

	public static void main(String[] args) 
		SpringApplication.run(DemoApplication.class, args);
	

 运行时,先找到Spring Boot启动类(@SpringBootApplication),运行启动类中的main方法

然后在网页上访问localhost:8080/hihttp://localhost:8080/hi

Spring Boot配置文件

 1、配置文件

1.1、系统使用的配置文件(系统配置文件),如端口号的设置、连接数据库的配置

1.2、用户自定义配置文件

2、配置文件的格式

2.1、properies

server.port=8888

2.2、yml

server:
  port: 8888

说明:

1、当一个项目中存在两种格式的配置文件,并且两个配置文件中设置了相同的配置项,但值不同时,那么properties的优先级更高

2、通常情况下一个项目中只会存在一种格式的配置文件 

3、properties

3.1、properties基本语法

是以键值的形式配置的,key=value

#端口号设置
server.port=8888  #系统设置
myname=baekhyun  #自定义

 3.2、读取配置文件

使用@Value读 

    @Value("$myname")
    private String myname;

    @RequestMapping("/getconfig")
    public String getConfig()
        return myname;
#端口号设置
server.port=8888  #系统设置
myname=边伯贤  #自定义

 3.3、缺点

配置文件中会有很多冗余的信息

#连接数据库配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root

4、yml

4.1、优点

yml是一个可读性高,写法简单、易于理解,它的语法和JSON语言类似;yml支持更多的数据类型,它可以简单表达清单(数组)、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等;yml支持更多的编程语言,它不止是Java中可以使用在Golang、php、Python、Ruby、javascript、Perl中。

4.2、yml基本语法

key: value(value前面有一个空格)

server:
  port: 6666

#自定义配置项
myname2: baekhyun

配置数据库连接

#配置数据库连接
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8
    username: root
    password: root

4.3、yml配置数据类型

转义字符

#字符串
myString: 你好,\\n伯贤
myString1: '你好,\\n伯贤'
myString2: "你好,\\n伯贤"
    @Value("$myString")
    private String myString;

    @Value("$myString1")
    private String myString1;

    @Value("$myString2")
    private String myString2;

    @PostConstruct
    public void postConstruct()
        System.out.println("myString"+myString);
        System.out.println("myString1"+myString1);
        System.out.println("myString2"+myString2);
    

4.4、yml配置对象

使用@ConfigurationProperties读取对象

#自定义对象
star:
  id: 04
  name: d.o.
  age: 29
@Component
@ConfigurationProperties("star")
@Data
public class Star 
    private int id;
    private String name;
    private int age;
    @Autowired
    private Star star;

    @PostConstruct
    public void postConstruct()
        System.out.println(star);
    

5、properties和yml

5.1、properties是以key=value 的形式配置的键值类型的配置文件,而yml使用的是类似json格式的树形配置方式进行配置的,yml层级之间使用换行缩进的方式配置,key和value 之间使用“:”英文冒号加空格的方式设置,并且空格不可省略;

5.2、properties为早期并且默认的配置文件格式,但其配置存在一定的冗余数据,使用yml可以很好的解决数据冗余的问题;

5.3、yml通用性更好,支持更多语言;

5.4、yml支持更多的数据类型。

6、设置不同环境的配置文件

SpringBoot日志文件

1、日志的功能

1.1、发现和定位问题;

1.2、记录用户登录日志,方便分析用户是正常登录还是恶意破解用户;

1.3、记录系统的操作日志,方便数据恢复和定位操作;

1.4、记录程序的运行时间,方便为以后优化程序提供数据支持

2、SpringBoot使用日志

2.1、先得到日志对象

private static final Logger logger= LoggerFactory.getLogger(UserController.class);

2.2、使用日志对象来打印日志(使用日志对象提供的内置方法打印)

@RequestMapping("/user")
@Controller
@ResponseBody  //用来设置当前类中所有的方法返回的是数据而非页面
public class UserController 
    //1、得到日志对象
    private static final Logger logger= LoggerFactory.getLogger(UserController.class);

    @RequestMapping("/hi")
    public String sayHi()
        //写日志
        logger.trace("我是trace");
        logger.debug("我是debug");
        logger.info("我是info");
        logger.warn("我是warn");
        logger.error("我是error");
        return "hi,Spring Boot";
    

常见的日志框架说明

3、日志级别

3.1、作用

1、快速筛选重要的日志;

2、不同环境实现不同的日志级别的设置

3.2、日志级别

trace:微量,少许的意思,级别最低;

debug:需要调试时候的关键信息打印;

info:普通的打印信息(默认日志级别);

warn:警告,不影响使用,但需要注意的问题;

error:错误信息,级别较高的错误日志信息;

fatal:致命的,因为代码异常导致程序退出执行的事件。

日志级别规则:

当程序中设置了日志级别之后,那么程序只会打印和设置级别相同和大于当前日志级别的日志,小于当前级别的日志不会输出

3.3、日志级别的设置

#设置日志级别
logging:
  level:
    root: debug

 根据不同的目录设置不同的日志级别:

#设置日志级别
logging:
  level:
    root: error
    com:
      example:
        demo:
          controller: trace
          service: info

System.out.println相对于日志框架的缺点:

1、打印的信息不全(没有打印日志的时间、没有打印日志的来源);

2、不能实现日志打印的隐藏和显示;

3、System.out.println打印的日志不能被持久化

4、日志持久化

4.1、设置日志的保存目录

logging:
  file:
    path: d:\\\\loggings

4.2、设置日志保存文件名

logging:
  file:
    name: springlog.log

5、更简单的日志输出-lombok

由于LoggerFactory.getLogger(xxx.class)太繁琐,使用lombok来进行更简单的输出:

1、添加lombok框架支持;

2、使用@slf4j注解输出日志

5.1、添加lombok依赖

@Controller
@ResponseBody
@RequestMapping("/art")
@Slf4j
public class ArticleController 

    //private static final Logger logger= LoggerFactory.getLogger(ArticleController.class);

    @RequestMapping("/hi")
    public String sayHi()
        log.trace("我是slf4j的trace");
        log.debug("我是slf4j的debug");
        log.info("我是slf4j的info");
        return "hi,art";
    

旧项目添加新依赖框架

 

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>

 5.2、使用@slf4j注解输出日志

@Controller
@ResponseBody
@RequestMapping("/art")
@Slf4j
public class ArticleController 

    //private static final Logger logger= LoggerFactory.getLogger(ArticleController.class);

    @RequestMapping("/hi")
    public String sayHi()
        log.trace("我是slf4j的trace");
        log.debug("我是slf4j的debug");
        log.info("我是slf4j的info");
        return "hi,art";
    

5.3、lombok原理

Lombok 的原理是通过AspectJ (一种对Java的面向切面(AOP)的编程方案)将注解转换为代码。Lombok根据注解的类型在源代码中添加或替换方法,以便在编译时将注解嵌入源代码中。

java程序的运行原理:

lombok的作用

 

5.4、lombok的注解说明

注解说明

@NoArgsConstructor/@AllArgsConstructor

该类产生无参的构造方法和包含所有参数的构造方法
@RequiredArgsConstructor将类中所有带有@NonNull注解 / org.jetbrains.annotations.NotNull注解的或者带有final修饰的成员变量生成对应的构造方法

@Getter/@Setter

用在成员变量上面或者类上面,相当于为成员变量生成对应的get和set方法,同时还可以为生成的方法指定访问修饰符,默认为public

 
@Data效果等同于 @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor 
@Builder标注@Builder的类, 会在类内部生成一个内部类,用于生成值对象
@Accessors要搭配@Getter与@Setter使用,用来修改默认的setter与getter方法的形式
@NonNull属性不能为null
@ToString自动添加toString方法
@EqualsAndHashCode自动添加equals和hashCode方法
@RequiredArgsConstructor自动添加必须属性的构造方法,包括含@NotNull注解的字段;final修饰且未初始化的字

 

SpringMVC 项目中 创建SpringBoot,使用Hibernate和JPA

起因:

老项目是SpringMVC,为了之后能使用更方便的SpringBoot。

所以在其中添加了SpringBoot项目,

但是老项目SpringMVC使用的Hibernate,SpringBoot希望使用JPA

解决方案:

一 POM

说明:

1 spring boot标签中,是需要添加的架包

由于我的发布方式是tomcat,所以需要打包时过滤springboot中的tomcat

2 build标签中,是打包方式。这里可以不看

3 这里有一个jpa版本的问题。

由于之前使用的jpa版本很低。这导致和springboot2.7.2版本的jpa版本不匹配。

其中,jpa2.7.2版本的findOne方法没有了,改为了findById。

这导致调用基础dao的方法会报错:NoSuchMethod。

所以下面也提供了JPA的架包导入方式。如果JPA版本是匹配的,那直接使用下面注释的

spring-boot-starter-data-jpa

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.14.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.kintech</groupId>
    <packaging>war</packaging>
    <artifactId>kintech.webInvoice</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>kintech.webInvoice</name>
    <description>kintech.webInvoice</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring-boot.version>2.1.1.RELEASE</spring-boot.version>
        <fastjson.version>2.0.10</fastjson.version>
        <spring-cloud.version>2021.0.3</spring-cloud.version>
    </properties>
    <dependencies>
        <!--        srping boot begin-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <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>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>

        <!--        srping boot end-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        -->

        <!--  JPA  -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.12.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.4.12.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-ehcache</artifactId>
            <version>5.4.12.Final</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-commons</artifactId>
            <version>1.13.13.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.11.13.RELEASE</version>
        </dependency>
        <!--  JPA  -->

        <!--        kintech begin-->
        <dependency>
            <groupId>com.kintech</groupId>
            <artifactId>kintech.web</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.kintech</groupId>
            <artifactId>kintech.common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>redis.clients</groupId>
                    <artifactId>jedis</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-data-redis</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework.session</groupId>
                    <artifactId>spring-session</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-pool2</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.kintech</groupId>
            <artifactId>kintech.service</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <!--        kintech end-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>$fastjson.version</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.9</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>$spring-cloud.version</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <finalName>$project.name</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <descriptors>
                        <descriptor>src/main/assembly/assembly.xml</descriptor>
                        <!--对应在src/main/resource包下创建buildzip.xml配置文件-->
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <testFailureIgnore>true</testFailureIgnore>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.18.1</version>
                <configuration>
                    <skip>true</skip>
                    <!-- <skipTests>true</skipTests> -->
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

二 引入springMVC中的applicationContext.xml

1 先看一下springmvc中的xml

将其拷贝到springboot中的resources下

2 application.yml (springboot)

添加如下:

spring:
  main:
    allow-bean-definition-overriding: true

三 启动类


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

//过滤hibernate jpa的自动加载
@SpringBootApplication(exclude = HibernateJpaAutoConfiguration.class)
//扫描包
@ComponentScan(basePackages="com.kintech",lazyInit=true)
//扫描jpa的dao
@EnableJpaRepositories(basePackages = "com.kintech.dao.jpa")
//扫描jpa 用到的entity
@EntityScan("com.kintech.model.domain")
//导入springmvc的applicationContext.xml
@ImportResource("classpath:spring/applicationContext.xml")
public class WebInvoiceApplication 

    public static void main(String[] args) 
        SpringApplication.run(WebInvoiceApplication.class, args);
    

以上是关于SpringBoot创建和使用的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot学习

SpringBoot运行原理

SpringBoot的起步依赖

spring-boo hello world程序

Spring Boot 2.0 常见问题总结

Spring boot 学习笔记 - 整合MyBatis