springboot原理实战(4)-springboot入口分析

简介: springboot原理实战(4)-springboot入口分析

目录


从现在开始进入springboot项目入门,先来张本文的概要脑图:

1dc618a0ed9580ce8bfa6facb208c08f.png


一、环境搭建2种方式


这里说的是Pom引入springboot的包的方式:


①继承父组件


<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.demo</groupId>
    <artifactId>springboot2-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot2-demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>


关键是这里:

5d4c6812c8535adbb050f4ddf2e1bce8.png


②第2种引入方式:


不继承spring-boot-starter-parent。


我们从maven中央仓库找到这个包:

46a9d80a6e05e4e3b19d57a0ee70bcdf.png

修改下:

这样引入:


<dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.2.5.RELEASE</version>
    <scope>import</scope>
    <type>pom</type>
</dependency>


全部的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.demo</groupId>
    <artifactId>springboot2-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot2-demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>2.2.5.RELEASE</version>
                    <scope>import</scope>
                    <type>pom</type>
                </dependency>
            </dependencies>
        </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>


上面的2种方式都可以。


二.@SpringBootApplication注解分析


我们看下启动类上有个注解@SpringBootApplication注解

,这个注解,满足我们的所有想象,帮我们做了都很多的工作。

来段代码:


@SpringBootConfiguration
public class Springboot2DemoApplication {
    @Bean
    public Runnable createRunnable(){
        return () -> {
            System.out.println("spirng boot is started");
        };
    }
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Springboot2DemoApplication.class, args);
        context.getBean(Runnable.class).run();
        System.out.println(context.getBean(User.class));
    }
}


点击注解看到,它是个组合注解:

1dc618a0ed9580ce8bfa6facb208c08f.png


@ComponentScan 可以扫描当前包下的组件。

@SpringBootConfiguration把入口类配置成一个Configuration配置类。它包含了

@Configuration注解。

5d4c6812c8535adbb050f4ddf2e1bce8.png

@EnableAutoConfiguration自动配置,功能强大,以后说。


案例1:入口替换为@ComponentScan


定义一个bean


@Component
public class User {
}


修改入口注解:


@ComponentScan
public class App2 {
    @Bean
    public Runnable createRunnable(){
        return () -> {
            System.out.println("spirng boot is started");
        };
    }
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(App2.class, args);
        context.getBean(Runnable.class).run();
        System.out.println(context.getBean(User.class));
        System.out.println(context.getBean(List.class));
    }
}


运行结果:

1dc618a0ed9580ce8bfa6facb208c08f.png

完美。

说明什么?


说明@ComponentScan扫描到了User对象,容器拿到这个bean。

但是这个入口类为啥能拿到Runnable这个类?我们明明去掉了SpringBootConfiguration,不能把这个类当成配置类了啊。


解答:

我们看下入口的run的方法:

5d4c6812c8535adbb050f4ddf2e1bce8.png46a9d80a6e05e4e3b19d57a0ee70bcdf.png


答案在这里。

这里会把入口类这个resouce类默认配置到容器中,所以可以当做配置类来使用。


案例2:@SpringBootConfiguration替换@Configuration


演示@SpringBootConfiguration是否有配置功能:


@SpringBootConfiguration
public class MyConfig {
    @Bean
    public List createList(){
        return new ArrayList();
    }
}


测试:


@ComponentScan
public class Springboot2DemoApplication {
    @Bean
    public Runnable createRunnable(){
        return () -> {
            System.out.println("spirng boot is started");
        };
    }
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Springboot2DemoApplication.class, args);
        context.getBean(Runnable.class).run();
        System.out.println(context.getBean(List.class));
    }
}


1dc618a0ed9580ce8bfa6facb208c08f.png1dc618a0ed9580ce8bfa6facb208c08f.png1dc618a0ed9580ce8bfa6facb208c08f.png

1dc618a0ed9580ce8bfa6facb208c08f.png

可以看出已经注入进来了。


三、两种启动方式


①默认的静态方法运行


5d4c6812c8535adbb050f4ddf2e1bce8.png


官方默认是这种方式,使用SpringApplication调用run方法,运行整个springboot项目。现在换一种方式启动:


②new SpringApplication()方式启动


@ComponentScan
public class App {
@Bean
    public Runnable createRunnable(){
        return () -> {
            System.out.println("spirng boot is started");
        };
    }
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(App.class);
//        Set<String> sets = new HashSet<>();
//        sets.add(App.class.getName());
//        app.setSources(sets);
        ConfigurableApplicationContext context = app.run(args);
        context.getBean(Runnable.class).run();
        System.out.println(context.getBean(User.class));
    }
}


看下效果:


1dc618a0ed9580ce8bfa6facb208c08f.png


也可以这样写:


@ComponentScan
public class App {
   @Bean
    public Runnable createRunnable(){
        return () -> {
            System.out.println("spirng boot is started");
        };
    }
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication();
        Set<String> sets = new HashSet<>();
        sets.add(App.class.getName());
        app.setSources(sets);
        ConfigurableApplicationContext context = app.run(args);
        context.getBean(Runnable.class).run();
        System.out.println(context.getBean(User.class));
    }
}


结果完美:


5d4c6812c8535adbb050f4ddf2e1bce8.png

同时,还可以调用其他的入口:


比如从新写个类,没有@ComponentScan,当前类也没有注入bean


public class App2 {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication();
        Set<String> sets = new HashSet<>();
        sets.add(App.class.getName());
        app.setSources(sets);
        ConfigurableApplicationContext context = app.run(args);
        context.getBean(Runnable.class).run();
        System.out.println(context.getBean(User.class));
        System.out.println(context.getBean(List.class));
    }
}


可以看到这里调用的是其他的入口类


46a9d80a6e05e4e3b19d57a0ee70bcdf.png

显示结果也ok:

1dc618a0ed9580ce8bfa6facb208c08f.png

相关文章
|
2月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
93 0
|
13天前
|
NoSQL Java Redis
Redis6入门到实战------ 八、Redis与Spring Boot整合
这篇文章详细介绍了如何在Spring Boot项目中整合Redis,包括在`pom.xml`中添加依赖、配置`application.properties`文件、创建配置类以及编写测试类来验证Redis的连接和基本操作。
Redis6入门到实战------ 八、Redis与Spring Boot整合
|
3天前
|
Java API UED
【实战秘籍】Spring Boot开发者的福音:掌握网络防抖动,告别无效请求,提升用户体验!
【8月更文挑战第29天】网络防抖动技术能有效处理频繁触发的事件或请求,避免资源浪费,提升系统响应速度与用户体验。本文介绍如何在Spring Boot中实现防抖动,并提供代码示例。通过使用ScheduledExecutorService,可轻松实现延迟执行功能,确保仅在用户停止输入后才触发操作,大幅减少服务器负载。此外,还可利用`@Async`注解简化异步处理逻辑。防抖动是优化应用性能的关键策略,有助于打造高效稳定的软件系统。
12 2
|
2天前
|
JSON Java API
解码Spring Boot与JSON的完美融合:提升你的Web开发效率,实战技巧大公开!
【8月更文挑战第29天】Spring Boot作为Java开发的轻量级框架,通过`jackson`库提供了强大的JSON处理功能,简化了Web服务和数据交互的实现。本文通过代码示例介绍如何在Spring Boot中进行JSON序列化和反序列化操作,并展示了处理复杂JSON数据及创建RESTful API的方法,帮助开发者提高效率和应用性能。
12 0
|
2天前
|
Java 开发者 Spring
Spring Boot实战宝典:揭秘定时任务的幕后英雄,让业务处理如流水般顺畅,轻松驾驭时间管理艺术!
【8月更文挑战第29天】在现代应用开发中,定时任务如数据备份、报告生成等至关重要。Spring Boot作为流行的Java框架,凭借其强大的集成能力和简洁的配置方式,为开发者提供了高效的定时任务解决方案。本文详细介绍了如何在Spring Boot项目中启用定时任务支持、编写定时任务方法,并通过实战案例展示了其在业务场景中的应用,同时提供了注意事项以确保任务的正确执行。
10 0
|
2月前
|
Java Spring 容器
Spring Boot 启动源码解析结合Spring Bean生命周期分析
Spring Boot 启动源码解析结合Spring Bean生命周期分析
67 11
|
2月前
|
SQL Java 数据库连接
springboot~mybatis-pagehelper原理与使用
【7月更文挑战第15天】MyBatis-PageHelper是用于MyBatis的分页插件,基于MyBatis的拦截器机制实现。它通过在SQL执行前动态修改SQL语句添加LIMIT子句以支持分页。使用时需在`pom.xml`添加依赖并配置方言等参数。示例代码: PageHelper.startPage(2, 10); List&lt;User&gt; users = userMapper.getAllUsers(); PageInfo&lt;User&gt; pageInfo = new PageInfo&lt;&gt;(users); 这使得分页查询变得简单且能获取总记录数等信息。
|
16天前
|
Dubbo Java Nacos
【实战攻略】破解Dubbo+Nacos+Spring Boot 3 Native打包后运行异常的终极秘籍——从零开始彻底攻克那些让你头疼不已的技术难题!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但使用Dubbo+Nacos+Spring Boot 3进行GraalVM native打包后常遇运行异常。本文剖析此问题及其解决策略:确认GraalVM版本兼容性;配置反射列表以支持必要类和方法;采用静态代理替代动态代理;检查并调整配置文件;禁用不支持的功能;利用日志和GraalVM诊断工具定位问题;根据诊断结果调整GraalVM配置。通过系统排查方法,能有效解决此类问题,确保服务稳定运行。
39 0
|
2月前
|
监控 Java 微服务
Spring Boot微服务部署与监控的实战指南
【7月更文挑战第19天】Spring Boot微服务的部署与监控是保障应用稳定运行和高效维护的重要环节。通过容器化部署和云平台支持,可以实现微服务的快速部署和弹性伸缩。而利用Actuator、Prometheus、Grafana等监控工具,可以实时获取应用的运行状态和性能指标,及时发现并解决问题。在实际操作中,还需根据应用的具体需求和场景,选择合适的部署和监控方案,以达到最佳效果。
|
2月前
|
Java 开发者 Spring
深入理解Spring Boot中的自动配置原理
深入理解Spring Boot中的自动配置原理
下一篇
云函数