spring boot

一  Spring Boot的一些概念

      1.  Spring Boot是什么?

                    它是一种以更简单的方式来使用Spring生态下所有技术的框架,用于简化Spring项目的

                 构建、开发、配置、部署与jar报引用。简而言之,我们可以说Spring Boot只是Spring本身

                 的扩展,使开发,测试和部署更加方便。这样也就明白了SpringBoot和Spring Cloud的区别。

                 也有的地方是这样讲的:Spring boot 是 Spring 的一套快速配置脚手架(Spring Boot,看名

                 字就知道是Spring的引导)

         2.  Spring Boot与Spring、Spring Boot与Spring Cloud的区别?

                 (1)Spriing Boot和Spring   

                                 SpringBoot是Spring的扩展,它解决了Spring的三大痛点问题。  

                                 Spring的三大痛点问题(以启动一个带Hibernate的Spring MVC为例):

                                 --  依赖太多了,而且要注意版本兼容。这个应用,要添加10-20个依赖,Spring相

                                     关的包10多个,然后是Hibernate包,Spring与Hibernate整合包,日志包,json

                                     包一堆,而且要注意版本兼容性。

                                 --  配置太多了,要配置注解驱动,要配置数据库连接池,要配置Hibernate,要配

                                     置事务管理器,要配置Spring MVC的资源映射,要在web.xml中配置启动Spring

                                     和pring MVC等

                                 --  部署和运行麻烦。要部署到tomcat里面。不能直接用java命令运行。太多重复和

                                     大家都一样的配置了。

                                 Spring Boot正好解决了上述问题,其哲学思想是约定大于配置。既然很多东西都是

                                 一样的,为什么还要去配置。

                                 --  通过starter(starter是启动依赖机制,start是指在pom中导入少量依赖缺可以在

                                      工程中自动引入大量依赖)和依赖管理解决依赖问题。

                                 --  通过自动配置,解决配置复杂问题。

                                 --  通过内嵌web容器,由应用启动tomcat,而不是tomcat启动应用,来解决部署运

                                     行问题

                                 Spring Boot和Spring的之间的详细关系可以查看文章:

                                  https://www.jianshu.com/p/ffe5ebe17c3a                 

 

                                 Spring Boot和Spring Cloud的区别:

                                 --  Spring Cloud是微服务框架,微服务体系开发中的架构问题,提供了一整套的解

                                     决方案;

                                 --  Spring Boot是Spring框架的扩展可以基于spring boot 快速开发单个微服务。它是

                                      为了解决Spring中的一些痛点而产生的

         3.  Spring Boot工程目录介绍

                   

 

                    别的不说,都会,这里只介绍static和templates

                    static:存放静态资源文件

                    templates:存放动态资源文件

                           

          2.Spring Boot的四大核心机制

            (1)起步依赖机制

                      通过起步依赖机制(starter),简化jar包的引用,解决jar版本冲突问

                             SpringBoot起步依赖机制主要用来简化jar包的依赖,并通过大量的测试,解决了不同

                      jar之间的版本冲突问题。使得开发人员只需要关注代码的实现,而不必在jar包依赖上花费

                      过多心思。

                             Spring Boot通过启动依赖机制为我们引入了大量的依赖,如果我们不需要某个jar包,

                      我们可以通过<exclusion></exclusion>进行屏蔽

在Maven中,可以使用<exclusions>:
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <exclusions>
    <exclusion>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>*</artifactId>
    </exclusion>
  </exclusions>
</dependency>

                      自定义要使用jar包的版本,而不使用启动依赖机制中的jar包

 

 

            (2)自动配置

                            自动配置是指可以实现简单配置,甚至是零配置(比如我搭建一个Spring Boot项目,

                     什么都不配,就可以启动,这就是零配置),就能搭建整套框架,它尽量减少开发人员对

                     配置的编写。

                            注:并不代表Spring Boot可以零配置哈。

                    这里补充一些知识:

                  (a)Spring 获取bean的几种方式

                           --  读取xml文件的方式,这种在初学入门的时候比较适用

             ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:tt.xml");

          ApplicationContext applicationContext = new FileSystemXmlApplicationContext("classpath:tt.xml");

                           --  继承spring的Aware类,覆盖方法实现获取上下文,从上下文中获取。

                          *  继承自抽象类ApplicationObjectSupport

                                  抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获

                                  取到ApplicationContext。Spring初始化时,会通过该抽象类的

                                  setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象

                                  注入。

                               *  继承自抽象类WebApplicationObjectSupport

                                   类似上面方法,调用getWebApplicationContext()获取WebApplicationContext

                               *  实现接口ApplicationContextAware

                     当一个类实现了这个接口之后,这个类就可以方便地获得 ApplicationContext 中的

                                  所有bean。换句话说,就是这个类可以直接获取Spring配置文件中,所有有引用到

                                  的bean对象。

                                  使用例子:

                                         第一步,定义一个工具类,实现 ApplicationContextAware,实现

                                                       setApplicationContext方法


                   public class SpringContextUtils implements ApplicationContextAware {


                   private static ApplicationContext context;



                   @Override


                   public void setApplicationContext(ApplicationContext context)


                   throws BeansException {


                          SpringContextUtils.context = context;


                   }


                   public static ApplicationContext getContext(){


                          return context;


                  }
              }


 

                                         

                                                       如此一来,我们就可以通过该工具类,来获得 ApplicationContext,进

                                                       而使用其getBean方法来获取我们需要的bean。

                                         第二步,在Spring配置文件中注册该工具类

                                                        之所以我们能如此方便地使用该工具类来获取,正是因为Spring能够

                                                        为我们自动地执行 setApplicationContext 方法,显然,这也是因为

                                                        IOC的缘故,所以必然这个工具类也是需要在Spring的配置文件中进行

                                                        配置的。

                         <!--Spring中bean获取的工具类-->                         <bean id="springContextUtils" class="com.zker.common.util.SpringContextUtils" />

 

                                         第三步,编写方法进行使用

                                                       一切就绪,我们就可以在需要使用的地方调用该方法来获取bean了。

   /**

     * 利用Ajax实现注册的用户名重复性校验

     * @return

     */

    public String ajaxRegister() throws IOException {

        UserDao userDao = (UserDao)SpringContextUtils.getContext().getBean("userDao");

        if (userDao.findAdminByLoginName(loginName) != null

                || userDao.findUserByLoginName(loginName) != null) {

            message.setMsg("用户名已存在");

            message.setStatus(false);

        } else {

            message.setMsg("用户名可以注册");

            message.setStatus(true);

        }


        return "register";

    }

 

                           --  借助于spring提供的工具类   

                               这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取

                               ApplicationContext对象,然后在通过它获取需要的类实例。 下面两个工具方式的区别

                               是,前者在获取失败时抛出异常,后者返回null。

import org.springframework.web.context.support.WebApplicationContextUtils; 
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc) 
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc) 
ac1.getBean("beanId"); 
ac2.getBean("beanId"); 

 

                  (b)一些注解                    

                           --  @Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个

                               或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或

                               AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化

                               Spring容器。@Configuration可理解为用spring的时候xml里面的<beans>标签;

                               @Bean可理解为用spring的时候xml里面的<bean>标签

                               AnnotationConfigWebApplicationContext:使用AnnotationConfigApplicationContext

                              可以实现基于Java的配置类加载Spring的应用上下文。避免使用application.xml进行配

                              置。位于spring-context.jar;AnnotationConfigEmbeddedWebApplicationContext是

                              spring boot中的WebApplicationContext。

                              WebApplicationContext

                                            WebApplicationContext是专门为web应用准备的,他允许从相对于web根目录

                                     的路劲中装载配置文件完成初始化工作,从WebApplicationContext中可以获得

                                     ServletContext的引用,整个Web应用上下文对象将作为属性放置在ServletContext

                                     中,以便web应用可以访问spring上下文,spring中提供WebApplicationContextUtils

                                     的。

                                            在以前的spring项目中,会有两个WebApplicationContext,一个是parent,从

                                     applicationContext.xml里加载的,一个是child,从servlet-context.xml里加载的。两

                                     者是继承关系,child WebApplicationContext 可以通过getParent()函数获取到

                                     root WebApplicationContext。也就是说,我们常常通过listener初始化parent,并

                                     component-scan扫描非controller类。而通过servlet初始化child,只扫描controller类。

                                     这样便于在child可注入parent中的bean,反之就不行(自己感觉这就是父子容器)。

                           --  @ConfigurationProperties("xxx") 注解

                                      加上该注解后,就会注入在application.properties中xxx开头的属性。

                                      示例:

                                       Person.java

@Component
@ConfigurationProperties(prefix="person")
public class Person {

    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
}

 

                                       application.properties

person.name=Five
person.age=20

 

 

                                       此时Person.java中的name和age的值分别被注入Five和age

                                       测试Controller     

package ai.yunxi.springBootDemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @Autowired
    private JdbcTemplate template;
    
    @Autowired
    private Person person;
    
    @RequestMapping("/sayHello")
    public String sayHello(){
        System.out.println("template:"+template);
        return "Hello "+person.getName()+"!";
    }
}

 


                           --  @ConditionalOnClass:据说后面会讲到

@ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean)
@ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean)
@ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean)
@ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean)
@ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean)
@ConditionalOnNotWebApplication(不是web应用)

@RestController 定义一个Controller为RestController,RestController响应的是字符串而不是视图

 

            (3)Spring Boot CLI

                     一种命令行工具。

                     --  可以构建SpringBoot项目,其实还是通过https://start.spring.io/去构建工程的

                         例:spring init --dependencies=web,mysql,jdbc bootProject

                     --  可以执行Groovy脚本(spring run命令)

                         例:spring run hello.groovy

                     --  例:spring jar bootProject.jar *.groovy

            (4)Actuator

                            Spring Boot Actuator的关键特性是在应用程序里提供众多Web端点,通过

                     它们了解应用程序运行时的内部状况。可以知道Bean在Spring应用程序上下文

                     里是如何组装在一起的,掌握应用程序可以获取的环境属性信息等。其实说白

                     了就是一些端点。

                  (a)开启Actuator需要的一些配置

                           依赖:

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

 

                           端点相关的配置

      #设置端点路径
      management.endpoints.web.base-path=/
       #暴露端点
      management.endpoints.web.exposure.include=*
      #隐藏端点
      management.endpoints.web.exposure.exclude=env,metrics

 

 

                  (b)要熟悉的一些端点(标红的)

                           GET /configprops 描述配置属性(包含默认值)如何注入Bean

                           GET /beans 描述应用程序上下文里全部的Bean,以及它们的关系

                           GET /env 获取全部环境属性

                           GET /env/{name} 根据名称获取特定的环境属性值

                           GET /health 报告应用程序的健康指标,这些值由HealthIndicator的实现类提供

                           GET /info 获取应用程序指定发布的信息,这些信息由info打头的属性提供

                           GET /mappings 描述全部的URI路径,以及它们和控制器(包含Actuator端点)的映射关系

                           GET /metrics 报告各种应用程序度量信息,比如内存用量和HTTP请求计数

                           GET /httptrace 提供基本的HTTP请求跟踪信息(时间戳、 HTTP头等)

                           GET /threaddump 获取线程活动的快照

                           GET /conditions 提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过

                           POST /shutdown 关闭应用程序,要求management.endpoint.shutdown.enabled设置为true

二  Spring Boot框架构建的四种方式

          1.  Spring Tool Suite

          2.  SpringBoot CLI

          3.  Spring Initializr

          4.  手动引用jar包

三  Spring Boot热部署

                 热部署就是我们对一些Java文件、Jsp文件、配置文件等进行了一些修改之后,项目来帮我们自动

          重启、重新加载的过程,不需要每次修改自己都需要手动进行重启。

          1.  实现热部署只需要添加如下依赖即可

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>  <!--取消传递依赖-->
</dependency>

 

          2.  其它一些重要配置       

       #热部署生效
    spring.devtools.restart.enabled: true
    #设置重启的目录,可以是任意位置的文件夹(工程内和工程外,其中的文件或文件内容发生改变则重启服务)
     spring.devtools.restart.additional-paths: src/main/java
    #修改默认不重启目录(/META-INF/maven、/META-INF/resources、/resources、/static、/templates、/public)
    spring.devtools.restart.exclude: WEB-INF/**
    #添加额外不重启目录
    spring.devtools.restart.additional-paths

四  Spring Boot与MyBatis集成

          不做笔记了看视频“第07节-MyBatis集成.vep”吧 总共才9分钟

五  Spring Boot与Security集成

          看视频

四  Spring Boot与MyBatis集成

          看视频

 

posted @ 2019-06-05 08:27  jialanshun  阅读(684)  评论(0编辑  收藏  举报