第三阶段(day16)springboot

1.springboot框架优势

回忆ssm框架:

添加各种环境的依赖,依赖非常的多,需要一个个jar包进行引入.

还需要划分父子容器,监听器创建父容器,中央控制器创建子容器.

当注册对象到容器时,还需要考虑对象注册父容器还是子容器.

当需要注册对象到容器时,还需要创建xml配置文件,在配置文件中需要bean标签,注册jar包对象到容器.

比如:druid整合spring,添加druid;创建dao.xml,通过bean标准注册DruidDataSource.

比如:mybatis整合spring,添加mybatis,mybatis-spring;创建dao.xml,通过bean标签sqlsessionFactoryBean

在ssm框架中,每一个中间件的整合,都需要做两个事情:添加jar包,创建xml注册组件核心的bean.创建以及维护很繁琐。在web开发领域相比于市面上其他开发语言Ruby,python.GO落伍.开箱即用.

(中间件就是那些组件,比如redis是缓存中间件,mybatis是持久层中间件) 

(Ruby,python,Go诞生是为了做数据分析,机器学习。开箱即用,比如python的jango框架,创建出来后,dao,service,缓存,controller等都有了。)

springboot是对ssm框架搭建的简化,使开发人员不再注重于各种中间件的整合,springboot提供了预配置(依赖包,配置文件);

ssm是springboot前置技术,springboot是springcloud前置技术,springcloud是alibabaspringCloud前置技术.

springboot版本2.6.6. 最稳定的版本2.3.3-2.3.5,与springCloud兼容性最优.

2.创建springboot项目

有两种方式

1.手工创建maven项目,在pom文件中引入springboot的相关依赖.定义成骨架信息.

(建议使用该方式,因为不需要连网,springboot官网常常连不上)

①.pom.xml

  

 pom文件具体如下:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.javasm</groupId>
    <artifactId>old0617boot</artifactId>
    <version>1.0</version>

    <!--打包方式为jar,packaging可以省略-->
    ​
       <!--标准的springboot框架的项目结构如下:-->
       <!--1.引入springboot父工程,统一管理依赖项的版本,使子工程不需要指定版本-->
       <parent>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-parent</artifactId>
           <version>2.3.5.RELEASE</version>   <!--使用springboot最稳定的版本-->
       </parent>
    ​
       <!--2.指定maven-resource-plugin与maven-compile-plugin-->
       <properties>
           <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
           <maven.compiler.source>1.8</maven.compiler.source>
           <maven.compiler.target>1.8</maven.compiler.target>
       </properties>
    ​
       <!--3.添加依赖-->
       <dependencies>
           <!--spring-boot-starter-web包含如下依赖:(预配置)
               spring,mvc,jackson,tomcat (有了4种环境)
            还引入了一个特别特别重要的依赖:spring-boot-starter,它又包含spring-boot-autoconfigure.
            spring-boot-autoconfigure包中,包含有各种开发中常用中间件的配置类(可理解成各种xml常规配置文件)
        -->
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-web</artifactId>
           </dependency>
       </dependencies>
    ​
       <!--4.配置spring-boot-maven-plugin插件.暂时可以不用配置,但是一个完整的springboot项目是需要的-->
       <build>
           <plugins>
               <plugin>
                   <groupId>org.springframework.boot</groupId>
                   <artifactId>spring-boot-maven-plugin</artifactId>
               </plugin>
           </plugins>
       </build>

</project>
②.创建主类(启动类)

 然后测试

(这里参数漏掉了@PathVariable)

 开始启动

 访问

 再测试文件上传

 访问

③.做成骨架前进行完善

   在resources包下新建templates目录,新建application.properties文件

   在pom.xml文件中加入两个依赖

<!--热部署依赖,在开发中如果改变了代码.之前需要重启服务器,对全部的资源都做重新加载.有了热部署依赖后,结合Ctrl+F9快捷键,只对改变的代码做重新编译加载-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

在test.java包下新建com.javasm.TestApplication

(注意这里@test不是junit4,因为pom引入的test依赖,它依赖的是junit5) 

这样就和官方下载的基本一致了。

④.将该项目做成骨架(略)

2. 基于springboot官方提供的项目引导器来创建(要求必须联网)https://start.spring.io/

进入官网https://start.spring.io/,一步步进行即可.


或者idea集成了引导器.

运行main方法,启动项目,默认tomcat端口8080,默认部署路径''(空).

3.认识springboot项目目录结构

它还是个maven工程

 src/main/java:java源代码,该包下有main启动类

src/main/resources/static:放静态资源(html,css,js,图片,视频等)

src/main/resources/templates:放动态视图资源(jsp模板,thymeleaf模板,freemarker模板).同步开发使用.

src/main/resources/applicaiton.properties:springboot的核心配置文件,一般该配置文件会改成yml后缀(如果配置文件的图标不是如图所示,一定有问题,比如文件名打错,导致没有被idea识别成springboot项目)

4.认识boot项目pom文件

这里改成用java.version指定jdk版本。(这里用的idea2018,对应用的jdk8) 

(因为父工程已经指定,见下图)

父工程:见代码注解

ctrl+点击spring-boot-starter-parent,看到父工程的父工程

spring-boot-dependencies: 此父工程指定了在服务端开发中各种常用的中间件的版本.这些版本之间兼容性之间进行过测试.

注意:springboot的父工程并不是必须的.一个springboot框架中最重要的依赖是:spring-boot-starter.只要有这个依赖,此项目就可以说是springboot项目.(若没有该父工程标签,下面的依赖就需要自己指定版本信息)(很多开源项目就不指定父工程)

这两个父工程合起来,给出了默认的配置:1.jdk的默认配置  2.默认的编码格式 3.默认的识别位置(src.java  src.resources ... ) 4.指定了各种常用依赖的版本信息(springboot的版本升级主要就是引入新的依赖,常用版本更换等)

starter启动器依赖:

starter是springboot框架中的一个新的概念,本质仍然是一个依赖jar包,是某个中间件整合spring环境需要引入的依赖包与配置类的整合.本质就是一个pom文件.(依赖包与配置类的整合就叫启动器)

spring-boot-maven-plugin插件:

是对maven-jar-plugin插件(打jar包用的)打的包做二次重打包,指定当前工程的main方法所在的类作为start-class.能够使jar包以java -jar的方式运行起来.

此时pom.xml文件:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.javasm</groupId>
    <artifactId>old0617boot</artifactId>
    <version>1.0</version>

    <!--打包方式为jar,packaging可以省略-->
    ​
       <!--标准的springboot框架的项目结构如下:-->
       <!--1.引入springboot父工程,统一管理依赖项的版本,使子工程不需要指定版本-->
       <!--指定的springboot版本是父工程版本-->
       <!--之前的maven父工程是一个pom工程,有pom文件,父工程中可以定义所有子工程自动继承的依赖,管理全部依赖项的版本信息.-->
        <!--此父工程中指定了maven-compile-plugin编译插件的默认jdk版本;
        指定了maven-resource-plugin资源插件的默认编码格式;
        指定了maven-resource-plugin资源插件的识别文件.-->
       <parent>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-parent</artifactId>
           <version>2.3.5.RELEASE</version>   <!--使用springboot最稳定的版本-->
       </parent>
    ​
       <!--2.指定maven-resource-plugin与maven-compile-plugin-->
       <properties>
           <java.version>1.8</java.version>
       </properties>
    ​
       <!--3.添加依赖-->
       <dependencies>
           <!--spring-boot-starter-web包含如下依赖:(预配置)
               spring,mvc,jackson,tomcat (有了4种环境)
            还引入了一个特别特别重要的依赖:spring-boot-starter,它又包含spring-boot-autoconfigure.
            spring-boot-autoconfigure包中,包含有各种开发中常用中间件的配置类(可理解成各种xml常规配置文件)
        -->
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-web</artifactId>
           </dependency>

    <!--热部署依赖,在开发中如果改变了代码.之前需要重启服务器,对全部的资源都做重新加载.有了热部署依赖后,结合Ctrl+F9快捷键,只对改变的代码做重新编译加载-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

       </dependencies>
    ​
       <!--4.配置spring-boot-maven-plugin插件.暂时可以不用配置,但是一个完整的springboot项目是需要的-->
       <build>
           <plugins>
               <plugin>
                   <groupId>org.springframework.boot</groupId>
                   <artifactId>spring-boot-maven-plugin</artifactId>
               </plugin>
           </plugins>
       </build>

</project>

5.springboot项目运行方式

  • 开发时,运行main方法即可;

  • 服务器部署,以jar包方式部署,前提是工程下引入spring-boot-maven-plugin插件,指定启动类位置.

  • 服务器部署,以war包方式部署:当服务器有优化性更好的应用服务器的话,我们需要把工程打war包放在tomcat的webapps目录下运行

1.修改项目打包方式为war
 <packaging>war</packaging>

2.指定打包名(有默认名字,但会带版本号)
 <finalName>0418boot</finalName>



3.把内嵌的tomcat服务器设置为provided作用域.
 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
</dependency> 



4.从SpringBootServletInitializer派生子类,重写configure方法,指定主启动类.
​
//等价于web.xml角色,是项目的入口类
public class InitBootApplication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(BootApplication.class);
    }
}

之后就可以打war包了,若没有该入口类, 就相当于jar包没有main方法,tomcat会不知道启动哪个项目。

5.打包

先清理

 打包

 

6.将该包放到tomcat下,启动tomcat时运行

 启动tomcat

会加载该war包(解压该war包,并启动)。

有该标志,说明识别到了springboot项目。

 启动成功后,可看到war包结构,放jar包的地方也没有tomcat包

7.访问该项目

部署路径

 

访问手机号

以war包形式运行,是为了用到第三方的应用服务器,这套服务器性能比内嵌服务器性能优秀。

注意:开发时main方法启动项目,需要内嵌tomcat设置的provided去掉.

服务器部署,还可以以容器的方式部署,第四阶段学。

6.starter启动器

有两类启动器:

官方启动器:spring-boot-starter-XXX: springboot开发组主动对某个中间件编写的启动器,比如:spring-boot-starter-web;-redis;-jdbc...

所有的官方启动器依赖中都没有配置类,配置类全部放在spring-boot-autoconfiguration包下.

第三方启动器:XXX-spring-boot-starter:比如mybatis-spring-boot-starter,是mybatis开发组主动打包的启动器,向springboot框架中集成.

此启动器中,含有mybaits.mybatis-spring,spring-jdbc;spring-tx;HikariCP依赖,还含有mybatis-spring-boot-autofiguration包,此包下有MybatisAutoConfiguratin配置类.此配置类下通过@Bean注解注册了SqlSessionFactory对象与MapperScannerConfigurer对象到spring容器.

总结:什么是启动器?

是某个组件整合spring环境,用到的全部依赖包与配置类的整合.为了简化ssm框架繁琐的xml配置与依赖引入.启动器分为官方与第三方.一般官方启动器中的配置类都在spring-boot-autoconfiguratin包下.第三方的启动类,会自己引入.

后续在学习其他组件,在向springboot框架整合时,如果有启动器,则优先引入启动器,如果没有启动器,则说明非常小众,需要手工引入jar依赖包,手工注册bean对象到容器.有启动器的话,一定一定要找到该组件内的配置类,阅读配置类,查看配置类中注册了哪些bean到容器.

我们在项目中引入mybaits-spring-boot-starter依赖,相当于之前:

<!--1个druid连接池包-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!--1个mybatis核心包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
​
        <!--1个mybaits-spring整合包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>${mybatis.spring.version}</version>
        </dependency>
          <!--2个spring-jdbc事务管理包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
​
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        
    <!--凡是Resource类型的参数,都是路径,以classpath:开头-->
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="mapperLocations" value="classpath:mapper/*/*.xml"></property>
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <value>reasonable=true</value>
                    </property>
                </bean>
            </array>
        </property>
​
        <property name="typeAliasesPackage" value="com.javasm"></property>
        <property name="configLocation" value="classpath:mybatis.xml"></property>
    </bean>
​
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.javasm.*.dao"></property>
    </bean>
​

7.spring-dev-tools启动器

  <!--热部署,在开发中如果改变了代码.之前需要重启服务器,对全部的资源都做重新加载.有了热部署依赖后,结合Ctrl+F9快捷键,只对改变的代码做重新编译加载-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>  ----不可以打包,只在运行时有效
        </dependency>

除了工具类的是runtime,很少有插件的scope是runtime。不参与编译,不参与打包。

是springboot开发必加的依赖,可以提高开发效率。

示例,改变代码,不重启tomcat,不会产生效果:(改后的内容未编译,内存里加载的字节码文件还是以前的)

 之前会点debug或者run进行重新部署,但在springboot,点击这俩按钮,会重开一个窗口,此时上图的窗口还在运行,就会报8080端口被占用了。

这是新启一个窗口,想重启

 但这很耗时,不想重启,ctrl+F9即可。

8.spring-boot-starter-test

junit5整合启动器.junit5中的@Test注解包名:import org.junit.jupiter.api.Test;

控制层要启动tomcat,主要是测服务层。

示例:

想测该服务层

 可以在服务层注入,再启动tomcat测

另外也可在test包下,使用@SpringBootTest注解。在测试类中使用@SpringBootTest注解即可,该注解自动查找带有@SpringbootApplication注解的类,启动spring容器(完成初始化容器,之后就可注入对象,进行方法测试)。需要测试哪个对象,注入对象即可进行方法测试。 

9.springboot配置文件

springboot中配置文件支持.properties与.yml(牙某)或.yaml. 一般我们都是用yml风格的配置文件.

properties文件的优先级较高.

当配置量多得时候,yml文件的可读性更加好.建议使用yml文件作为主配置

(在配置文件中我们配置redis连接信息,mysql连接信息等自定义的配置数据)

示例:将8080端口改为8081,切换到主启动类,启动

部署路径由空改为/boot

 tomcat最大允许的链接数,默认100,这里改为200

用yml配置部署路径

 再加个端口(会自动对齐,同样前缀的内容在同一层级)

 这个文件和properties文件都生效,但properties优先级更高

springboot如何读取自定义配置信息?

①.可以使用@Value注解获取单个配置数据.

(麻烦,不建议使用)

 ②.建议使用@ConfigurationProperties注解指定配置的前缀,统一数据自定义数据.

​其实不用记,随便点一个配置信息


prefix指定一个前缀。ignoreUnKnownFields,忽略一些不可识别的字段

按照它这个配置来自定义配置 


 获取配置信息时,建好一个类,剩下的复制


测试:



看一下ServerProperties,它有个静态内部类


仿照这个,在CrmProperties类:
private BackPwdToken backToken;
private LoginToken loginToken;


public static class BackPwdToken{   //找回密码封装成一个静态内部类
        private String tokenKey;
        private Long expMills;

        public String getTokenKey() {
            return tokenKey;
        }

        public void setTokenKey(String tokenKey) {
            this.tokenKey = tokenKey;
        }

        public Long getExpMills() {
            return expMills;
        }

        public void setExpMills(Long expMills) {
            this.expMills = expMills;
        }
    }

    public static class LoginToken{         //系统相关信息封装成一个静态内部类
        private String loginTokenKey;
        private Long expMills;

        public String getLoginTokenKey() {
            return loginTokenKey;
        }

        public void setLoginTokenKey(String loginTokenKey) {
            this.loginTokenKey = loginTokenKey;
        }

        public Long getExpMills() {
            return expMills;
        }

        public void setExpMills(Long expMills) {
            this.expMills = expMills;
        }
    }
对应的在配置文件里:
  
      

注意点:yml文件中的语法:

  • 缩进要统一,使用空格进行缩进。

  • 冒号后必须空格,再打数据。

  • 大小写敏感

  • 集合注入:可以使用[] ,可以使用-

  • 字符串数据可以使用引号,也可以不使用

  • 日期格式必须是/分割的年月日

server:
  servlet:
    context-path: /boot2
  port: 8082

#自定义配置
crm:
  root: D:/upload
  version: 1.1
  lastUpdate: 2022/11/11 12:12:12
  teams: [张三,李四,王五,admin]
  teams2:
    - aaa
    - bbb
    - ccc
  mapInfo: {a: 1,b: 2,c: 3}
  backToken:
    tokenKey: abc123
    expMills: 50000
  loginToken:
    loginTokenKey: zxc123
    expMills: 100000

 
 teams2;     //也可是数组,Set
    private Map<String,Integer> mapInfo;
    private BackPwdToken backToken;    //对象型成员变量
    private LoginToken loginToken;     //对象型成员变量

    public static class BackPwdToken{   //找回密码封装成一个静态内部类
        private String tokenKey;
        private Long expMills;

        public String getTokenKey() {
            return tokenKey;
        }

        public void setTokenKey(String tokenKey) {
            this.tokenKey = tokenKey;
        }

        public Long getExpMills() {
            return expMills;
        }

        public void setExpMills(Long expMills) {
            this.expMills = expMills;
        }
    }

    public static class LoginToken{         //系统相关信息封装成一个静态内部类
        private String loginTokenKey;
        private Long expMills;

        public String getLoginTokenKey() {
            return loginTokenKey;
        }

        public void setLoginTokenKey(String loginTokenKey) {
            this.loginTokenKey = loginTokenKey;
        }

        public Long getExpMills() {
            return expMills;
        }

        public void setExpMills(Long expMills) {
            this.expMills = expMills;
        }
    }


    public Map<String, Integer> getMapInfo() {
        return mapInfo;
    }

    public void setMapInfo(Map<String, Integer> mapInfo) {
        this.mapInfo = mapInfo;
    }

    public List<String> getTeams2() {
        return teams2;
    }

    public void setTeams2(List<String> teams2) {
        this.teams2 = teams2;
    }

    public List<String> getTeams() {
        return teams;
    }

    public void setTeams(List<String> teams) {
        this.teams = teams;
    }

    public Date getLastUpdate() {
        return lastUpdate;
    }

    public void setLastUpdate(Date lastUpdate) {
        this.lastUpdate = lastUpdate;
    }

    public double getVersion() {
        return version;
    }

    public void setVersion(double version) {
        this.version = version;
    }

    public BackPwdToken getBackToken() {
        return backToken;
    }

    public void setBackToken(BackPwdToken backToken) {
        this.backToken = backToken;
    }

    public LoginToken getLoginToken() {
        return loginToken;
    }

    public void setLoginToken(LoginToken loginToken) {
        this.loginToken = loginToken;
    }


    public String getRoot() {
        return root;
    }

    public void setRoot(String root) {
        this.root = root;
    }



}

总结:

pom文件中细节内容:父工程,启动器,热部署,测试,插件.

启动器概念必须明确表达出来.

yml配置文件语法,自定义数据的读取.

10.复习spring类配置的相关注解

11.springboot的主类(主启动类,主配置类)

SpringApplication.run(BootApplication.class,args);
@SpringBootApplication

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值