SpringBoot相关

SpringBoot

1. what

springboot也是spring公司开发的一款框架。为了简化spring项目的初始化搭建的。

spring项目搭建的缺点:

  1. 配置麻烦
  2. 依赖繁多
  3. tomcat启动慢

2 .springboot的特点(why)

  • 自动配置

springboot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是SpringBoot自动完成的

  • 起步依赖

起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能

简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。

  • 辅助功能

提供了一些大型项目中常见的非功能性特性,如嵌入式服务器tomcat、安全、指标,健康检测、外部配置等。

3. 搭建springboot的项目(how)

在这里插入图片描述

在这里插入图片描述

4. springboot常用的配置文件种类

springboot提供了两种配置文件。

  • 后缀为properties的文件
  • 后缀为yml的文件

不管是哪种,它们的前缀都是application

  1. yaml文件格式

    冒号后面有空格,空格后面才是自己要填写的值

    server:
      port: 8080
      servlet:
        context-path: /aaa
    
  2. properties文件格式

    spring.application.name=demo2
    
    spring.profiles.active=test
    student.name=lay
    student.age=18
    student.sex=man
    

如果上面两个文件同时存在,properties优先级高

5. springboot中java如何读取配置文件中的内容【重点】

我们习惯把一些自己的信息放入配置文件中,便于修改。比如OSS、支付等。我们还希望通过java代码能够读取到配置文件中自己的信息

springboot提供了两种方式用于读取springboot配置文件中信息的方式

  • 使用@ConfigurationProperties注解

使用在类上@ConfigurationProperties(prefix=“前缀”)

可以读取任意类型

在这里插入图片描述

  • Student类,将@ConfigurationProperties添加到实体类上
@ConfigurationProperties(prefix = "student")
@Component//为类创建spring,而且在创建时自动读取配置文件中前缀为student的属性
@Data
public class Student {
    //名称必须和配置文件中的名称一致
    private String name;
    private String age;
    private String sex;
}
  • Controller类
@RestController
public class StudentController {
    @Autowired
    private Student student;

    @GetMapping("/info")
    public Student info(){
        return student;
    }
}

结果返回student中各个属性中的具体值

在这里插入图片描述

  • 使用@Value注解

它只能读取基本类型和字符串类型

在这里插入图片描述

  • controller层,将@Value注解添加到具体属性上
@RestController
public class StudentController {

    @Value("${student.name}")
    private String xm;
    
    @GetMapping("/info")
    public String info(){
        return xm;
    }
}

结果仅返回student中的具体姓名

在这里插入图片描述

  • @Component注解

    标注一个类为Spring容器的Bean,把普通pojo实例化到Spring容器中,相当于配置文件中的<bean id=“” class=“”/>

  • @ConfigurationProperties注解

    允许开发者将外部的配置属性自动绑定到 JavaBean 对象上

6. profile多环境配置【重点】

我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都有修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的

  1. profile配置方式
    • 多profile文件方式
    • yml多文档方式
  2. profile激活方式
    • 配置文件
    • 命令行参数

我们需要针对不同的环境来创建不同的配置文件。使用profile来激活对应的配置文件

比如:

application-dev.properties  [开发环境的配置文件]
application-test.properties [测试环境的配置文件]
application-pro.properties [生产环境的配置文件]
------------------------------------------------
相同配置依然还是放在application.properties中
不同配置对应放置

在这里插入图片描述

如何激活对应的配置文件:两种方式

  • 在application配置文件中激活
#激活对应环境的配置文件
spring.profiles.active=pro
  • 部署时激活对应环境的配置
命令行参数:java –jar xxx.jar --spring.profiles.active=dev

7. springboot注册web组件

web组件表示的就是servlet,filter过滤器组件

回顾servlet组件步骤

  • 创建一个类并继承HttpServlet重写service方法
  • 注册到web.xml文件中
  • 创建一个类并继承HttpServlet重写service方法

    • 实例

      public class MyServlet extends HttpServlet {
      
          //重写父类中的方法.接受参数以及业务处理
          @Override
          public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
              System.out.println("代码~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
          }
      }
      

      在web.xml文件中注册该servlet,后续有简化方法,即在相应的类中添加注解

      @WebServlet注解

      参数:name:该servlet的name

      ​ urlPatterns:该servlet的路径

  • 在web.xml文件中注册servlet

    • 实例

      <!--注册servlet-->
          <servlet>
              <!--servlet的名称可以随便起-->
              <servlet-name>myServlet</servlet-name>
              <!--指定自定义的servlet路径-->
              <servlet-class>com.ykq.servlet.MyServlet</servlet-class>
          </servlet>
      
          <!--请求路径映射到该servlet-->
          <servlet-mapping>
              <!--保证该名称必须和上面注册的名称一致-->
              <servlet-name>myServlet</servlet-name>
              <!--路径,可以随意定义,但必须加/-->
              <url-pattern>/my</url-pattern>
          </servlet-mapping>
      

思考:在springboot中没有web.xml文件,如何注册servlet?

提供了一个配置类

创建一个Servlet

public class MyServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("~~~~~~~~~~~~~~~~");
    }
}

创建一个配置类

@Configuration
public class MyConfig {
    //注册servlet
    @Bean
    public ServletRegistrationBean myServlet(){
        ServletRegistrationBean bean=new ServletRegistrationBean<>();
        bean.setName("mys");
        bean.setServlet(new MyServlet());
        bean.addUrlMappings("/myServlet");
        return bean;
    }
}

回顾filter过滤器步骤

  1. 创建一个类并实现Filter接口,重写doFilter方法
  2. 注册到web.xml文件中
  • 创建一个类并实现Filter接口,重写方法
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //初始化过滤器-只有一次
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //过滤规则
        System.out.println("====过滤器====");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("===过滤器放行了===");
    }

    @Override
    public void destroy() {
        //销毁过滤器-浏览器或服务器关闭时
    }
}
  • 在web.xml文件中注册
<!--注册过滤器-->
    <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>com.ykq.filter.MyFilter</filter-class>
    </filter>
    <!--过滤规则-->
    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <!--
           /*:表示拦截所有的请求
           /views/*: 只拦截包含views/资源
           /*.do: 拦截请求后缀未.do资源
        -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

spring如何注册filter,同注册servlet同理

创建一个filter

public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("经过了过滤器");
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

创建一个配置类

@Configuration
public class MyConfig {
    //注册过滤器
    @Bean
    public FilterRegistrationBean myFilter(){
        FilterRegistrationBean filter=new FilterRegistrationBean();
        filter.setName("my");
        filter.setFilter(new MyFilter());
        filter.addUrlPatterns("/bn");
        return filter;
    }
}

@Configuration注解

是Spring的注解。

作用:声明一个类为配置类,用于取代bean.xml配置文件注册bean对象

用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

8. springboot包扫描的原理

ssm项目必须加包扫描,而现在springboot没有写包扫描了

自动扫描主类所在的包

因为自带了包扫描的功能,核心在主类的注解@SpringBootApplication上,它是一个复合注解

里面包含@EnableAutoConfiguration开启自动配置

上述注解里面包含注解@AutoConfigurationPackage

上述注解里面包含注解@Import({AutoConfigurationPackages.Registrar.class}),需要导入一个自动配置包的类。加载主类所在的包,并按照该包进行扫描

如果我们不想让它扫描主类所在的包,我们可以使用@ComponentScan(basePackages={“”}来指定自己的包

在这里插入图片描述

通过@ComponentScan注解指定扫描自己的包,默认的包扫描消失

9. springboot的自动装配原理

我们原来的ssm项目,都需要加载前端控制器DispatcherServlet,而现在的springboot并没有加载DispatcherServlet。springboot具备自动装配的功能

springboot启动时,加载了使用@SpringBootApplication注解的类

该注解是一个复合注解,包含了@EnableAutoConfiguration注解,该注解开启了自动装配功能,该注解也是一个复合注解。

里面包含@Import({EnableAutoConfigurationImportSelector.class}),导入EnableAutoConfigurationImportSelector,该类自动装配选择器类,该类会自动加载很多自动装配。每个自动装配都会完成对应的自动装配功能。

在这里插入图片描述

相关推荐

  1. SpringBoot-WEB相关

    2024-07-18 00:50:04       36 阅读
  2. SpringBoot 基础介绍以及相关可实现的功能思路

    2024-07-18 00:50:04       45 阅读
  3. SpringBoot连接mysql数据库相关配置(druid连接池)

    2024-07-18 00:50:04       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 00:50:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 00:50:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 00:50:04       58 阅读
  4. Python语言-面向对象

    2024-07-18 00:50:04       69 阅读

热门阅读

  1. Apache Flume

    2024-07-18 00:50:04       24 阅读
  2. 编程参考 - 在C++移动构造函数声明中使用noexcept

    2024-07-18 00:50:04       23 阅读
  3. SQL概述及其规则与规范

    2024-07-18 00:50:04       24 阅读
  4. 详解Redis源码中的设计模式及设计思想

    2024-07-18 00:50:04       20 阅读
  5. HTSJDK库Cigar类介绍

    2024-07-18 00:50:04       23 阅读
  6. Html_Css问答集(9)

    2024-07-18 00:50:04       18 阅读
  7. 2024.7.17

    2024-07-18 00:50:04       26 阅读