目录

一、什么是SpringBoot

    [二、SpringBoot的特点](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%E4%BA%8C%E3%80%81SpringBoot%E7%9A%84%E7%89%B9%E7%82%B9)

    [三、springboot快速入门](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%E4%B8%89%E3%80%81springboot%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8)

    [四、介绍配置文件的种类](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%E5%9B%9B%E3%80%81%E4%BB%8B%E7%BB%8D%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E7%9A%84%E7%A7%8D%E7%B1%BB)

    [五、开发环境配置文件的切换](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%E4%BA%94%E3%80%81%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E7%9A%84%E5%88%87%E6%8D%A2)

    [六、读取springboot配置文件中的内容](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%E5%85%AD%E3%80%81%E8%AF%BB%E5%8F%96springboot%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%86%85%E5%AE%B9)

    [七、Springboot注册web三大组件](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%E4%B8%83%E3%80%81Springboot%E6%B3%A8%E5%86%8Cweb%E4%B8%89%E5%A4%A7%E7%BB%84%E4%BB%B6)

    [八、SpringBoot的底层原理](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%E5%85%AB%E3%80%81SpringBoot%E7%9A%84%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86)

     [8.1 包扫描的原理](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%208.1%20%E5%8C%85%E6%89%AB%E6%8F%8F%E7%9A%84%E5%8E%9F%E7%90%86)

    [8.2  springboot自动装配原理](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%208.2%C2%A0%20springboot%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D%E5%8E%9F%E7%90%86)

    [九、自定义starter依赖](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%E4%B9%9D%E3%80%81%E8%87%AA%E5%AE%9A%E4%B9%89starter%E4%BE%9D%E8%B5%96)

    [9.1 创建一个springboot工程并引入相关得依赖](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%209.1%20%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AAspringboot%E5%B7%A5%E7%A8%8B%E5%B9%B6%E5%BC%95%E5%85%A5%E7%9B%B8%E5%85%B3%E5%BE%97%E4%BE%9D%E8%B5%96)

    [9.2 创建一个属性类](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%209.2%C2%A0%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%B1%9E%E6%80%A7%E7%B1%BB)

    [9.3 定义一个业务类](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%209.3%C2%A0%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AA%E4%B8%9A%E5%8A%A1%E7%B1%BB)

    [9.4 定义一个自动装配类](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%209.4%C2%A0%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D%E7%B1%BB)

    [9.5 在resource下创建一个目录MATE-INF 里面创建一个文件名spring.factories](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%209.5%C2%A0%E5%9C%A8resource%E4%B8%8B%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%9B%AE%E5%BD%95MATE-INF%20%E9%87%8C%E9%9D%A2%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%90%8Dspring.factories)

    [9.6 打包--maven 配置了本地仓库](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%209.6%C2%A0%E6%89%93%E5%8C%85--maven%20%E9%85%8D%E7%BD%AE%E4%BA%86%E6%9C%AC%E5%9C%B0%E4%BB%93%E5%BA%93)

    [十、springboot整合数据源](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%E5%8D%81%E3%80%81springboot%E6%95%B4%E5%90%88%E6%95%B0%E6%8D%AE%E6%BA%90)

    [10.1 引入数据源得启动依赖](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2010.1%C2%A0%E5%BC%95%E5%85%A5%E6%95%B0%E6%8D%AE%E6%BA%90%E5%BE%97%E5%90%AF%E5%8A%A8%E4%BE%9D%E8%B5%96)

    [10.2 指定数据源得信息](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2010.2%C2%A0%E6%8C%87%E5%AE%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E5%BE%97%E4%BF%A1%E6%81%AF)

    [10.3 测试](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2010.3%C2%A0%E6%B5%8B%E8%AF%95)

    [10.4 springboot整合第三方数据源](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2010.4%C2%A0springboot%E6%95%B4%E5%90%88%E7%AC%AC%E4%B8%89%E6%96%B9%E6%95%B0%E6%8D%AE%E6%BA%90)

    [10.5 测试](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2010.5%20%E6%B5%8B%E8%AF%95)

    [十一、springBoot整合Mybatis](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%E5%8D%81%E4%B8%80%E3%80%81springBoot%E6%95%B4%E5%90%88Mybatis)

    [11.1 引依赖](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2011.1%20%E5%BC%95%E4%BE%9D%E8%B5%96)

    [11.2 修改配置文件](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2011.2%20%E4%BF%AE%E6%94%B9%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6)

    [11.3 写一个实体类(省略)](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2011.3%20%E5%86%99%E4%B8%80%E4%B8%AA%E5%AE%9E%E4%BD%93%E7%B1%BB%28%E7%9C%81%E7%95%A5%29)

    [11.4 创建Dao接口](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2011.4%20%E5%88%9B%E5%BB%BADao%E6%8E%A5%E5%8F%A3)

    [11.5 映射文件](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2011.5%20%E6%98%A0%E5%B0%84%E6%96%87%E4%BB%B6)

    [11.6 在springboot启动类上加上--dao接口得扫描](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2011.6%C2%A0%E5%9C%A8springboot%E5%90%AF%E5%8A%A8%E7%B1%BB%E4%B8%8A%E5%8A%A0%E4%B8%8A--dao%E6%8E%A5%E5%8F%A3%E5%BE%97%E6%89%AB%E6%8F%8F)

    [11.7 测试---必须为springboot得单元测试【不能使用之前junit得测试】](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2011.7%C2%A0%E6%B5%8B%E8%AF%95---%E5%BF%85%E9%A1%BB%E4%B8%BAspringboot%E5%BE%97%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E3%80%90%E4%B8%8D%E8%83%BD%E4%BD%BF%E7%94%A8%E4%B9%8B%E5%89%8Djunit%E5%BE%97%E6%B5%8B%E8%AF%95%E3%80%91)

    [十二、springboot整合pageHelper](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%E5%8D%81%E4%BA%8C%E3%80%81springboot%E6%95%B4%E5%90%88pageHelper)

    [十三、springboot整合定时器](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%E5%8D%81%E4%B8%89%E3%80%81springboot%E6%95%B4%E5%90%88%E5%AE%9A%E6%97%B6%E5%99%A8)

    [13.1 引入定时器的依赖](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2013.1%C2%A0%E5%BC%95%E5%85%A5%E5%AE%9A%E6%97%B6%E5%99%A8%E7%9A%84%E4%BE%9D%E8%B5%96)

    [13.2 定义定时器的业务类](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2013.2%C2%A0%E5%AE%9A%E4%B9%89%E5%AE%9A%E6%97%B6%E5%99%A8%E7%9A%84%E4%B8%9A%E5%8A%A1%E7%B1%BB)

    [13.3 开启定时器的注解](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2013.3%C2%A0%E5%BC%80%E5%90%AF%E5%AE%9A%E6%97%B6%E5%99%A8%E7%9A%84%E6%B3%A8%E8%A7%A3)

    [十四、 springboot整合swagger2](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%E5%8D%81%E5%9B%9B%E3%80%81%20springboot%E6%95%B4%E5%90%88swagger2)

    [14.1 我们如何使用swagger2?   springboot的版本不能那么高。2.2~2.5之间](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2014.1%20%E6%88%91%E4%BB%AC%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8swagger2%3F%C2%A0%C2%A0%20springboot%E7%9A%84%E7%89%88%E6%9C%AC%E4%B8%8D%E8%83%BD%E9%82%A3%E4%B9%88%E9%AB%98%E3%80%822.2~2.5%E4%B9%8B%E9%97%B4)

    [14.2 创建一个swagger配置类---所有的功能都集成在Docket类](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2014.2%C2%A0%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AAswagger%E9%85%8D%E7%BD%AE%E7%B1%BB---%E6%89%80%E6%9C%89%E7%9A%84%E5%8A%9F%E8%83%BD%E9%83%BD%E9%9B%86%E6%88%90%E5%9C%A8Docket%E7%B1%BB)

    [14.3 开启swagger2注解](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2014.3%20%E5%BC%80%E5%90%AFswagger2%E6%B3%A8%E8%A7%A3)

    [14.4 定义相关的接口](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2014.4%C2%A0%E5%AE%9A%E4%B9%89%E7%9B%B8%E5%85%B3%E7%9A%84%E6%8E%A5%E5%8F%A3)

    [14.5 查看swagger2的界面](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2014.5%C2%A0%E6%9F%A5%E7%9C%8Bswagger2%E7%9A%84%E7%95%8C%E9%9D%A2)

    [14.6 最终的配置类完整格式](about:blank#%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%2014.6%C2%A0%E6%9C%80%E7%BB%88%E7%9A%84%E9%85%8D%E7%BD%AE%E7%B1%BB%E5%AE%8C%E6%95%B4%E6%A0%BC%E5%BC%8F)

     [十五、thymeleaf模板引擎](about:blank#%C2%A0%C2%A0%20%E5%8D%81%E4%BA%94%E3%80%81thymeleaf%E6%A8%A1%E6%9D%BF%E5%BC%95%E6%93%8E)

一、什么是SpringBoot

大家想一想,在我们搭建spring应用程序时,你认为什么最麻烦。

  1. 配置xml文件麻烦。—spring的配置文件。web.xml

  2. 很多依赖。

  3. tomcat启动速度很忙。

    **Spring Boot是由Pivotal团队提供的全新[框架](https://baike.baidu.com/item/%E6%A1%86%E6%9E%B6/1212667?fromModule=lemma_inlink "框架"),其设计目的是用来[简化](https://baike.baidu.com/item/%E7%AE%80%E5%8C%96/3374416?fromModule=lemma_inlink "简化")新[Spring](https://baike.baidu.com/item/Spring/85061?fromModule=lemma_inlink "Spring")应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置【自动装配类】,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。**
    
    二、SpringBoot的特点

(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;

(2)内嵌Tomcat或Jetty等Servlet容器;

(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;

(4)尽可能自动配置Spring容器;–xml配置文件麻烦

(5)提供准备好的特性,如指标、健康检查和外部化配置;

(6)绝对没有代码生成,不需要XML配置。

    三、springboot快速入门

    **具备条件:**

                    **JDK至少1.8以上。**

                    **maven至少3.2.5以上。**

                    **开发工具---idea \[eclipse\]**

    **要把pom文件中的版本号更改**

    **创建一个HelloController类,该类所在的包必须是主函数下的包或子包下。**  

    四、介绍配置文件的种类

    **springboot支持两种配置文件的类型:**

    **第一种: 属性文件\[.properties\] 格式: key=value**

    **第二种: yaml文件 \[.yml\] 格式: 层级关系 key: value**

    **不管是哪种,他们的前置必须都是application.**
    **属性文件properties:**
# 设置tomcat的端口号
server.port=8888

# 上下文访问路径
server.servlet.context-path=/aaa
    **yaml文件:**  
# 设置端口号
server:
port: 8887
# 设置上下文路径
servlet:
 context-path: /bbb
    **上面两种配置文件可以同时存在,里面的内容如果相同,则properties的优先级高于yaml文件。**  
    五、开发环境配置文件的切换

    **我们在真实开发过程中:会存在很多环境,而且每个环境他们的配置文件的内容可能不同。**

    **比如: 开发环境 测试环境 线上环境。**

    **我就根据不同的环境给出不同的配置内容,你只需要切换环境---即可变成相应环境下的配置。**

    **定义多个环境下的不同配置文件: application\-环境名.properties**

    **在application.properties配置文件中激活相应的配置**
# 引入相关的环境配置--激活开发环境
spring.profiles.active=test
# 写一些不同环境下相同的配置
    六、读取springboot配置文件中的内容

    **springboot中提供了两种读取配置文件内容的方式**
    **第一种: 把读取的内容封装到实体类中**

@Autowired
    private AliPay aliPay;
    @RequestMapping("/index")
    public AliPay index(){
        return aliPay;
    }
    **测试:**

    **第二种: 单个属性读取**

    七、Springboot注册web三大组件

    **web三大组件: \[1\] servlet 、\[2\] filter、 \[3\] 监听器 listene**
    **思考: servlet定义的步骤。**

    **(1) 创建一个类并继承HttpServlet**

    **(2) 重写service方法 【doGet 或doPost方法】**

  **(3)把自定义的servlet注册到web.xml容器中。**

    **我们现在springboot不存在web.xml文件了。**
    **注册Servlet组件**
public class MyServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");
    }
}
package com.ykq.config;

import com.ykq.servlet.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.http.HttpServlet;

@Configuration //====>表示该类为配置类 等价于我们之前的xml文件
public class MyConfig {


    @Bean //xml文件中<bean class=""> 把方法返回的对象交于spring容器来管理
    public ServletRegistrationBean<HttpServlet> registrationBean(){
        ServletRegistrationBean<HttpServlet> servletServletRegistrationBean=new ServletRegistrationBean<>();
        servletServletRegistrationBean.setName("my");
        servletServletRegistrationBean.addUrlMappings("/my");
        servletServletRegistrationBean.setServlet(new MyServlet());
        return servletServletRegistrationBean;
    }
}
    **注册Filter组件**

    **步骤: 1.定义一个过滤器类并实现Filter接口**

             **2.重写接口中的抽象方法**

             **3. 在web.xml文件中注册过滤器。**
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器编码");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        
    }
}

    //过滤的注册
    @Bean
    public FilterRegistrationBean<Filter> filterRegistrationBean(){
        FilterRegistrationBean<Filter> filterRegistrationBean=new FilterRegistrationBean<>();
        filterRegistrationBean.setName("encondigFilter");
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setFilter(new MyFilter());
        return filterRegistrationBean;
    }
    八、SpringBoot的底层原理

8.1 包扫描的原理
    **springboot创建的包必须在主类所在的包以及子包下,才可以被容器扫描到。**

为什么会在主类所在的包以及子包下扫描?

在主函数中调用run方法,而run方法传递了一个被@SpringBootApplication注解修改的类的反射类对象 该@SpringBootApplication它是复合注解。

    **@EnableAutoConfiguration 开启自动配置的注解,而该注解也是一个复合注解。**

    **这里@AutoConfigurationPackage 该注解完成包的自动扫描。**  

    **通过上面的源码分析 我们得到默认扫描的是主类所在的包以及子包。**  

    **我们是否可以自定义包扫描。---可以**

8.2 springboot自动装配原理
    **思考: 我们并没有配置DispatcherServlet。 为何为拦截请求路径到相应的mapping中。**

    **因为springboot在启动时会加载一个自动装配类,而这些自动装配会完成相应的自动装配功能。**
    **流程:**

            **(1)主函数调用run方法,而run方法加载了一个被@SpringBootApplication注解修饰的类。**  

            **而该注解是一个复合注解。其中包含@EnableAutoConfiguration该注解可以开启自动装配,而@EnableAutoConfiguration这个也是一个复合注解。其中包含@Import({AutoConfigurationImportSelector.class})而import注解导入了一个AutoConfigurationImportSelector类,该类用来加载需要的自动装配类。而这些自动装配类完成对应的自动装配功能。**
    **思考: 根据源码 我们看到上来加载了所有的自动装配了,而所有的自动装配类默认127个。这127个从哪来的。**  

    **分析: 自动装配类如何完成自动装配功能**        

    **(1)DipatchServletAutoConfiguration \[可以完成DispatchServlet的自动装配功能**

    **发现传递中文没有乱码,而且返回的json数据中也没有出现乱码,因为springboot加载了编码过滤的自动装配了,而这个装配类完成了编码设置的自动装配。**  

    九、自定义starter依赖

    **如果想自定义Starter,首选需要实现自动化配置,而要实现自动化配置需要满足以下两个条件:**

            **能够自动配置项目所需要的配置信息,也就是自动加载依赖环境**

            **能够根据项目提供的信息自动生成Bean,并且注册到Bean管理容器中;**
9.1 创建一个springboot工程并引入相关得依赖
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-autoconfigure</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
9.2 创建一个属性类
            **作用:** **解析springboot配置文件中提供得内容。**
/**
 * Created by Intellij IDEA
 *
 * @author 王俊凯
 * @Date: 2022/11/17 14:44
 * @Version 1.0
 */
package com.wjk;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "spring.wjk")
public class WjkProperties {

    private String name;
    private String address;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Integer getAge() {
        return age;
    }

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


9.3 定义一个业务类
    **作用: 完成相关得业务操作**
/**
 * Created by Intellij IDEA
 *
 * @author 王俊凯
 * @Date: 2022/11/17 14:46
 * @Version 1.0
 */
package com.wjk;

public class WjkService {

    private WjkProperties wjkProperties;

    public WjkService() {
    }

    public WjkService(WjkProperties wjkProperties) {
        this.wjkProperties = wjkProperties;
    }

    //业务代码
    public void hello(){
        System.out.println("姓名:"+wjkProperties.getName()+"地址:"+wjkProperties.getAddress()+"年龄:"+wjkProperties.getAge());
    }
}


9.4 定义一个自动装配类
    **完成自动装配得功能。用于完成Bean创建等工作**
/**
 * Created by Intellij IDEA
 *
 * @author 王俊凯
 * @Date: 2022/11/17 14:49
 * @Version 1.0
 */
package com.wjk;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration //该类为配置类
@EnableConfigurationProperties(WjkProperties.class) //开启属性配置
@ConditionalOnClass(WjkService.class)  //只要wjkService被引后入,当中的这个类才会被创建
@ConditionalOnProperty(prefix = "spring.wjk",value = "enabled",matchIfMissing = true) //如果引用者没有给定相关的属性值,则采用默认值
public class WjkAutoConfiguration {

    @Autowired
    private WjkProperties wjkProperties;

    @Bean
    @ConditionalOnMissingBean
    public WjkService wjkService(){
        return new WjkService(wjkProperties);
    }

}


9.5 在resource下创建一个目录MATE-INF 里面创建一个文件名spring.factories
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.aaa.YkqAutoConfiguration

9.6 打包–maven 配置了本地仓库
    [打包--maven 配置了本地仓库![icon-default.png?t=M85B](https://i-blog.csdnimg.cn/blog_migrate/4320c758cf64995ac483f9950f04aaf2.png)https://blog.csdn.net/suo\_jia\_hao/article/details/120759708](https://blog.csdn.net/suo_jia_hao/article/details/120759708 "打包--maven 配置了本地仓库")
    **打包成功后,就可以使用一个新的工程,引入自定义的starter的依赖**
    **以上自定义starter依赖是一个简单的例子**

    **想看复杂的例子**:[SpringBoot自定义start启动器图文教程(详细)\_一个考虑转行送外卖的程序员的博客-CSDN博客](https://blog.csdn.net/sdaawafg/article/details/120427882 "SpringBoot自定义start启动器图文教程(详细)_一个考虑转行送外卖的程序员的博客-CSDN博客")
    十、springboot整合数据源

    **数据源:指操作数据库**
10.1 引入数据源得启动依赖
        <!--引入数据源依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
10.2 指定数据源得信息
# 指定数据源信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=wjk351066
10.3 测试


@SpringBootTest
@MapperScan(basePackages = "com.wjk.dao")
class Java111501ApplicationTests {

    /**
     * 该依赖自动装配类 帮你建好DataSource对象 交与容器管理
     */
    @Autowired
    private DataSource dataSource;
    @Test
    void contextLoads() {
        System.out.println(dataSource);
    }
}

10.4 springboot整合第三方数据源
    **数据源: springboot默认整合得数据源HikariDataSource. 很多公司使用得可能是其他得数据源。比如Druid数据源 C3p0数据源。**

    **druid案例提供一个starter依赖。只需要引入该依赖。就会有相应得自动装配。**
 <!--引入druid得数据源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.1</version>
        </dependency>
# 指定数据源信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=wjk351066
spring.datasource.druid.initial-size=5
spring.datasource.druid.max-active=10
10.5 测试
@SpringBootTest
class Qy158Springboot01ApplicationTests {

    //数据源对象---自己有没有创建该类对象---因为你引入spring-boot-starter-jdbc启动依赖。
    //该依赖得自动装配类 帮你创建好DataSource对象 交于容器管理
    @Autowired
    private DataSource dataSource;
    @Test
    void contextLoads() throws SQLException {
        System.out.println(dataSource);
    }

}

    十一、springBoot整合Mybatis

11.1 引依赖
        <!--mybatis得整合启动依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>
11.2 修改配置文件
# 指定mybatis得配置内容
mybatis.mapper-locations=classpath:/mapper/*.xml
# 指定mybatis
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
11.3 写一个实体类(省略)
11.4 创建Dao接口
package com.wjk.dao;

import com.wjk.entity.Student;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;
public interface StudentDao {

    public List<Student> selectAll();


     int insert(Student student);

     int delete(Integer id);

     int update(Student student);
}


11.5 映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wjk.dao.StudentDao">
    <insert id="insert">
        insert into t_student values (null ,#{name},#{age},#{address})
    </insert>

    <update id="update">
        update t_student set name =#{name},age=#{age},address=#{address} where id=#{id}
    </update>

    <delete id="delete">
        delete from t_student where id=#{id}
    </delete>

    <select id="selectAll" resultType="com.wjk.entity.Student">
        select * from t_student
    </select>

</mapper>
11.6 在springboot启动类上加上–dao接口得扫描

11.7 测试—必须为springboot得单元测试【不能使用之前junit得测试】
    @Resource
    private StudentDao studentDao;
    @Test
    void testSelectAll(){
        PageHelper.startPage(1,3);
        List<Student> list = studentDao.selectAll();
        System.out.println(list);
    }
    十二、springboot整合pageHelper

  <!--pagehelper分页插件得依赖-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.2</version>
        </dependency>
@Resource
    private StudentDao studentDao;
    @Test
    void testSelectAll(){
        PageHelper.startPage(1,3);
        List<Student> list = studentDao.selectAll();

        PageInfo<Student> pageInfo = new PageInfo<>(list);
        System.out.println("总条数:"+pageInfo.getTotal());
        System.out.println("当前页的条数:"+pageInfo.getList());
    }
    十三、springboot整合定时器

    **什么是定时器?  在指定的时间间隔内执行相关的任务。**

    **应用场景:**

            **比如: 未支付取消订单。**

            **定时删除OSS中冗余的文件。**

            **注册成功后,在七天发送短信问候。**
13.1 引入定时器的依赖
   <!--引入定时器的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
13.2 定义定时器的业务类
         **在线Cron表达式生成器的链接: [在线Cron表达式生成器](https://cron.qqe2.com/ " 在线Cron表达式生成器")**
package com.wjk.quartz;


import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component //交与容器管理
public class MyQuartz {

    /**
     * 业务代码 Scheduled规定什么时候执行业务代码
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    public void test(){
        System.out.println("********************");
    }
}


13.3 开启定时器的注解

    十四、 springboot整合swagger2

    **什么是swagger2?   使用Swagger开源和专业工具集简化用户、团队和企业的API开发。了解Swagger如何帮助您大规模设计和记录API文档**

    **为什么使用API文档?**

14.1 我们如何使用swagger2? springboot的版本不能那么高。2.2~2.5之间
 <!--引入swagger2的依赖-->
        <dependency>
            <groupId>com.spring4all</groupId>
            <artifactId>swagger-spring-boot-starter</artifactId>
            <version>1.9.1.RELEASE</version>
        </dependency>

        <!--swagger图形化界面-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.9.6</version>
        </dependency>
14.2 创建一个swagger配置类—所有的功能都集成在Docket类
@Configuration  //标记为配置类
public class SwaggerConfig {

    @Bean
    public Docket docket(){
        Docket docket = new Docket(DocumentationType.SWAGGER_2)

        return docket;
    }
}
14.3 开启swagger2注解
package com.wjk;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@SpringBootApplication
@EnableScheduling //开启定时器注解
@EnableSwagger2 //开启swagger2的注解
public class SpringBoot1118Application {

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

}

14.4 定义相关的接口
@RestController
public class HelloController {


    @GetMapping("hello01")
    public String hello01(){
        return "hello01";
    }
}
14.5 查看swagger2的界面

14.6 最终的配置类完整格式
/**
 * Created by Intellij IDEA
 *
 * @author 王俊凯
 * @Date: 2022/11/18 10:06
 * @Version 1.0
 */
package com.wjk.config;

import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.VendorExtension;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.ArrayList;

@Configuration  //标记为配置类
public class SwaggerConfig {

    @Bean
    public Docket docket(){
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                //组名
                .groupName("wjk")
                //api信息
                .apiInfo(getInfo())
                //选择哪些生成api接口--根据请求路径选择 (2)根据包名选择
                .select()
                //根据请求路径选择
                .paths(Predicates.and(PathSelectors.regex("/api/.*")))
                //根据报名选择
                .apis(RequestHandlerSelectors.basePackage("com.wjk.controller"))
                .build()
                ;
        return docket;
    }


    private ApiInfo getInfo(){
        Contact DEFAULT_CONTACT = new Contact("王俊凯", "http://www.jd.com", "1315272325@qq.com");
        ApiInfo info = new ApiInfo("在线预约挂号系统", "在线挂号系统", "9.9", "http://www.baidu.com",
                DEFAULT_CONTACT, "上海富有银行有限公司", "http://www.taobao.com", new ArrayList<VendorExtension>());
        return info;
    }
}


    **我们还有另外一个网址  更简洁更容易看懂**  [http://localhost:port/doc.html](http://localhost/doc.html "http://localhost:port/doc.html")         

介绍: swagger常用的注解

  • @Api:修饰整个类,描述Controller的作用

  • @ApiOperation:描述一个类的一个方法,或者说一个接口

  • @ApiImplicitParam:一个请求参数

  • @ApiImplicitParams:多个请求参数

  • @ApiModel:用对象来接收参数

  • @ApiModelProperty:用对象接收参数时,描述对象的一个字段

     十五、thymeleaf模板引擎

    **就是一个网页模板【jsp 现在不能使用jsp的原因:springboot中内置的tomcat 不支持jsp模板引擎】。**
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
@RestController
public class PageController {

    @RequestMapping("/index")
    public String index(){
        return "index";
    }
}

    [Thymeleaf\_洋葱爱代码的博客-CSDN博客\_thymeleaf](https://blog.csdn.net/qq_48788523/article/details/123942193 "Thymeleaf_洋葱爱代码的博客-CSDN博客_thymeleaf")   **具体使用请看文档  懒得写了**

Java开发的就业市场正在经历结构性调整,竞争日益激烈

传统纯业务开发岗位(如仅完成增删改查业务的后端工程师)的需求,特别是入门级岗位,正显著萎缩。随着企业技术需求升级,市场对Java人才的要求已从通用技能转向了更深入的领域经验(如云原生、微服务)或前沿的AI集成能力。这也导致岗位竞争加剧,在一、二线城市,求职者不仅面临技术内卷,还需应对学历与项目经验的高门槛。

大模型为核心的AI领域正展现出前所未有的就业热度与人才红利

2025年,AI相关新发岗位数量同比激增543%,单月增幅最高超过11倍,大模型算法工程师位居热门岗位前列。行业顶尖人才的供需严重失衡,议价能力极强,跳槽薪资涨幅可达30%-50%。值得注意的是,市场并非单纯青睐算法研究员,而是急需能将大模型能力落地于复杂业务系统的工程人才。这使得具备企业级架构思维和复杂系统整合经验的Java工程师,在向“Java+大模型”复合人才转型时拥有独特优势,成为企业竞相争夺的对象,其薪资天花板也远高于传统Java岗位。

在这里插入图片描述

说真的,这两年看着身边一个个搞Java、C++、前端、数据、架构的开始卷大模型,挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis,稳稳当当过日子。

结果GPT、DeepSeek火了之后,整条线上的人都开始有点慌了,大家都在想:“我是不是要学大模型,不然这饭碗还能保多久?”

先给出最直接的答案:一定要把现有的技术和大模型结合起来,而不是抛弃你们现有技术!掌握AI能力的Java工程师比纯Java岗要吃香的多。

即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地!大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇!

如何学习AGI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享**

一、2025最新大模型学习路线

一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1级别:AI大模型时代的华丽登场

L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理,关键技术,以及大模型应用场景;通过理论原理结合多个项目实战,从提示工程基础到提示工程进阶,掌握Prompt提示工程。

L2级别:AI大模型RAG应用开发工程

L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3级别:大模型Agent应用架构进阶实践

L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体;同时还可以学习到包括Coze、Dify在内的可视化工具的使用。

L4级别:大模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调;并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握;而L3 L4更多的是通过项目实战来掌握大模型的应用开发,针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。

二、大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

三、大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

四、大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

五、大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐