1.什么是SpingBoot

        SpringBoot基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。

2.为何使用SpringBoot

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

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

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

(4)尽可能自动配置Spring容器;

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

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

3.如何创建SpringBoot工程

        创建SpringBoot工程有两种方法。

        第一种:快速搭建(需要联网)

                新建项目--选择 Spring Initializr 服务创建SpringBoot应用程序

                更换服务器URL,默认的URL是国外的镜像源,更换为 https://start.aliyun.com 使用国内的阿里云镜像源,速度更快--下一步

                选择SpingBoot版本,建议版本第一点,推荐2.6或2.4版本,然后点击Web勾选Spring Web进行创建

        第二种:手动搭建

                新建项目--选择新建项目,构建系统选择Maven--创建

                在pom文件种引入SpringBoot的依赖

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

                在resources目录下创建 application.properties文件或 application.yml,这边选择第二种,需要注意的是yml文件在:后输入值的话需要用空格隔开,并且yml属于层级关系,这个不能乱。

                在java目录下创建com.boot.SpringBootApplicationMain主启动类

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

                添加启动类注解,以及main方法启动项目,在boot目录下创建演示Controller

@RestController
@RequestMapping("/hello")
public class HelloController {
    @GetMapping("/index")
    public Object index(){
        return "你好,SpringBoot";
    }
}

                通过main方法的启动类启动项目,然后访问 localhost:8080/hello/index。结果看出,页面显示了返回值。

4.SpringBoot工程的配置文件

        刚刚创建的application.yml就是SpringBoot工程的配置文件,内置了许多配置。

server:
  port: 80

student:
  name: yp
  classes: 6
  hobby[0]: sing
  hobby[1]: jump
  hobby[2]: rap
  hobby[3]: basketball

        例如,修改服务器的端口号,以及对象的创建。那么如何来获取配置文件内的属性值呢?

        获取配置文件内的属性值有两种方法。

        第一种:@Value

                在controller内,通过@Value注解将配置文件内的属性值赋值给某个属性

@Value("${student.name}")
    private String name;

    @Value("${student.classes}")
    private Integer classes;

    @GetMapping("/get")
    public String get(){
        return "name:"+name + ",class:"+classes;
    }

                @Value括号内为格式${},花括号内为配置文件内的属性名,然后赋值给一个私有的属性,便可以在方法中使用这个属性。

                运行查看 localhost:8080/hello/get 结果:返回了yp和6

        第二种:@ConfigurationProperties

                为何使用这种方法,因为第一种方法只能获取基础的数据类型和字符串类型的值,而定义的hobby数组则无法进行获取,第二种方式的用法是在一个对象上方添加该注解,但该类需要被Spring容器来管理所有需要添加@Component注解,并且需要Get和Set方法,所以引入lombok依赖,添加@Data依赖。

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
@Data
@Component
@ConfigurationProperties(prefix = "student")
public class Student {
    private String name;
    private Integer classes;
    private String[] hobby;
}

                @ConfigurationProperties括号内有一个prefix前缀参数,如果接收的属性值都属于一个对象,那么在prefix加上该对象名称,并定义属性来接受这些值,这里定义了一个字符串数组来接收配置文件中的数组。

                因为现在这个类已经被Spring容器来进行管理了,所以我们可以在controller中通过自动注入的方式来获取这个类了。

@Autowired
    private Student student;

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

        通过注入获得类,然后将此类返回并运行查看结果,页面就显示了配置文件中的值。

5.SpringBoot注册Web组件

        我们在使用Springmvc框架进行开发的时候,Web组件会自动将我们的Servlet和Filter注册进web.xml文件中,那么使用SpringBoot开发时,并没有web.xml文件,应该如何去进行注册呢?可以通过配置的方式将组件注册进去。

        创建一个Servlet和Filter

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

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Do Post");
    }
}
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

        然后将Servlet和Filter注册进SpringBoot,在boot目录下创建config.MyConfig配置类。

@Configuration
public class MyConfig {
    @Bean
    public ServletRegistrationBean<Servlet> servletServletRegistrationBean(){
        ServletRegistrationBean<Servlet> servletServletRegistrationBean = new ServletRegistrationBean<>();
        servletServletRegistrationBean.setServlet(new MyServlet());
        servletServletRegistrationBean.setName("MyServlet");
        servletServletRegistrationBean.addUrlMappings("/my");
        return servletServletRegistrationBean;
    }
    
    @Bean
    public FilterRegistrationBean<Filter> filterFilterRegistrationBean(){
        FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
        filterFilterRegistrationBean.setFilter(new MyFilter());
        filterFilterRegistrationBean.setName("MyFilter");
        filterFilterRegistrationBean.addUrlPatterns("/*");
        return filterFilterRegistrationBean;
    }
}

        配置类需要在类上添加配置注解,第一个bean为Servlet组件,ServletRegistrationBean为注册Servlet的bean,在bean中创建一个Servlet的注册器,并设置Servlet,名称,路径。第二个bean为Filter组件,FilterRegistrationBean为注册Filter的bean,在bean中创建一个Filter的注册器,设置Filter,名称,添加拦截的路径。

        启动访问 localhost:8080/my 并查看控制台输出结果

springboot注册到nacos控制台没看到_配置文件

        执行了过滤器和DoGet方法,说明Web组件注册成功了!

6. SpringBoot自动扫描包的原理

        查看@SpringBootApplication注解,可以看到它是一个复合注解

springboot注册到nacos控制台没看到_配置文件_02

         在@EnalbeAutoConfiguration注解,可以通过名字知道他是一个开启自动配置的注解。进入该注解。

springboot注册到nacos控制台没看到_配置文件_03

         在@AutoConfigurationPackage注解,通过名字知道他是一个自动配置包,那他是如何获取到包呢,进入这个注解内。

springboot注册到nacos控制台没看到_spring_04

         在Import注解中,看到他导入了一个注册包的反射类,进入该类中,可以看到一个方法

springboot注册到nacos控制台没看到_Web_05

        通过该方法可以看出,该方法调用注册方法,通过getPackageNames()方法获取到包名进行了注册,所以可以得出:

        SpringBoot默认扫描的是带有@SpringBootApplication注解的主启动类父级包下的所有子包和子类,通过上述方法获取包路径来获取包名进行注册类,再通过自动装配包,将类进行自动装配,最后开启自动装配。

7.如何扫描自定义包下的类

        在主启动类里,通过@ComponentScan()注解在括号内传入basePackages = { },花括号内传入包的全路径并用引号包裹,但该方法会覆盖原本的默认扫描路径。