SpringBoot之SpringApplication

简介

可以用于从java主方法中引导和启动Spring应用程序的类,在默认情况下,通过以下步骤来启动应用:

  • 创建一个ApplicationContext实例
  • 注册CommandLinePropertySource用来暴露命令行参数作为spring的属性
  • refresh applicationContext,加载所有的singleton bean
  • 触发任何CommandLineRunner bean

自定义SpringApplication

默认的启动方式,代码如下,不做深入介绍

1
SpringApplication.run(AppBoot1.class, args);

当然也可以做一些定制,如在Banner里面介绍的自定义banner,还有添加Listener等诸多设置,格式如下:

123
SpringApplication app = new SpringApplication(MySpringConfiguration.class);	app.setBannerMode(Banner.Mode.OFF);	app.run(args);

使用Fluent Builder API进行构建

先上代码,如下:

12345678910111213141516171819202122232425262728293031
new SpringApplicationBuilder()                .sources(ParentConfig.class)                .child(Child1Config.class)                .sibling(Child2Config.class)                .banner(new AppBanner())                .logStartupInfo(false)                .run(args);

//@Configuration

@PropertySource("classpath:/parent.properties")public class  {}

// Child1Config.class

@PropertySource("classpath:/child1.properties")public class Child1Config {

}

// Child2Config.class

@PropertySource("classpath:/child2.properties")public class Child2Config {

}

使用SpringApplicationBuilder在构建分层的ApplicationContext应用的时候非常便利,但是官网给的代码示例很简单,对于一些初次介入的人可能理解上不是那么透彻。就上面的代码做一些简单的介绍

  • .sources(ParentConfig.class)该方法是用来配置父配置,或主配置的。但是有坑!!!!请看上面的ParentConfig的代码,注解我使用的是@SpringBootApplication,如果你使用的是springboot的1.x的版本,那么你会很顺利,如果你正在研究springboot 2.x的版本,你会发现无论如何也无法启动成功(我被坑的好惨)…。聪明的人也许看到我的注释,没错换成@Configuration之后就可以正常工作。但是很抱歉,这是为什么暂时还没找到原因,在github上请教暂时也没得到正确的结果,后面继续研究,如果有人发现了其中的原因,请通知我一下
  • .child(Child1Config.class)那么通过名字就可以看到是子环境了,Child1Config就是child1的配置文件。也许你的应用里有多个child,那么你可能会想用多个child().child(),那么这样你的第二个child不是parent的child,而是第一个child的child,parent的孙子。想要实现多个同级的孩子,可以使用代码中的.sibling(Child2Config.class)方法。这里同样存在一个springboot的版本改动问题,那就是如果你要在配置文件里面为child1配置一个context path,那么在版本1里面的方法是server.contextPath=child1,但是如果使用版本2的朋友就需要做一点小改动了,改为server.servlet.contextPath=child1

可以参照github上的代码进行详细的理解github

事件和监听器

spring里面的监听器有三种实现方式:

  • @EventListener注解方式
  • 实现ApplicationListener接口
  • 实现SmartApplicationListener接口

上面三种方式代码分别为

12345678910
@Componentpublic class AnnotationRegisterListener {

    @EventListener    public void register(UserRegisterEvent event) {        User user = event.getUser();

        System.out.println("AnnotationRegisterListener " + user.getName() + ", " + user.getPassword());    }}
1234567891011
@Componentpublic class RegisterListener implements ApplicationListener<UserRegisterEvent>{

    @Override    public void onApplicationEvent(UserRegisterEvent event) {

        User user = event.getUser();

        System.out.println("RegisterListener " + user.getName() + ", " + user.getPassword());    }}
123456789101112131415161718192021222324252627282930313233343536373839
@Componentpublic class UserRegisterListener implements SmartApplicationListener {

    /**     * 该方法返回true&supportsSourceType同样返回true时,才会调用该监听内的onApplicationEvent方法     * @param eventType     * @return     */    @Override    public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {        return UserRegisterEvent.class.isAssignableFrom(eventType);    }

    /**     * 该方法返回true&supportsEventType同样返回true时,才会调用该监听内的onApplicationEvent方法     * @param sourceType     * @return     */    @Override    public boolean supportsSourceType(@Nullable Class<?> sourceType) {        return UserService.class.isAssignableFrom(sourceType);    }

    @Override    public void onApplicationEvent(ApplicationEvent event) {        UserRegisterEvent userRegisterEvent = (UserRegisterEvent) event;        User user = userRegisterEvent.getUser();        System.out.println("UserRegisterListener " + user.getName() + ", " + user.getPassword());    }

    /**     * 同步情况下监听执行的顺序     * @return     */    @Override    public int getOrder() {        return 3;    }}

前两种实现方式比较简单,稍微介绍一下第三种,这种实现方式必须在supportsEventType和supportsSourceType同时返回true的情况下才会执行事件,具体如何返回true和false就看你自己的业务实现。在这里我使用了jdk的isAssignableFrom方法来判断父子关系的。
上面两种方式事件的执行顺序是无序的,第三种提供了一种指定属性的方法getOrder()

具体的isAssignableFrom是如何使用的,请看如下代码:

123456789101112131415161718192021222324252627282930313233343536373839404142
public class Animal {
}

public class Bird 大专栏  SpringBoot之SpringApplicationn class="keyword">extends Animal implements Fly {

时间: 2024-11-04 01:38:14

SpringBoot之SpringApplication的相关文章

[SpringBoot]源码分析SpringBoot的异常处理机制

微信号:GitShare微信公众号:爱折腾的稻草如有问题或建议,请在公众号留言[1] 前续 为帮助广大SpringBoot用户达到"知其然,更需知其所以然"的境界,作者将通过SpringBoot系列文章全方位对SpringBoot2.0.0.RELEASE版本深入分解剖析,让您深刻的理解其内部工作原理. 正文 在SpringBoot启动时,会查找并加载所有可用的SpringBootExceptionReporter,其源码如下: //7 使用SpringFactoriesLoader在

Spring-boot简单的理解

SpringBoot启动 SpringApplication.run(MyBootApplication.class); SpringApplication.run启动SpringBoot应用,主要过程 要创建Spring容器对象 根据MyBootApplication注解标记功能创建Bean组件对象纳入Spring容器中(@SpringBootApplication) 如果是web程序,会自动启动Tomcat服务器,并将程序发布到服务器上 用户可以对SpringBoot程序访问 @Spring

SpringBoot入门八,添加定时任务

SpringBoot添加定时任务非常简单,只需要两步即可 1. SpringBoot启动类 添加@EnableScheduling注解,开启定时任务的配置 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.Ena

SpringBoot搭建helloword项目(Maven)

1.目标问题 浏览器向服务器发送一个hello请求,服务器接受请求并处理,响应Hello Word 字符串. 使用环境: jdk1.8 + maven3.6.0 + IDEA2019.1 2.实现步骤 2.1 springboot官方自动生成器 打开SpringBoot 官网: 链接    在页面最下方 quick start 点击  Spring Initializr 或者  点此链接 直接进入快速生成页面,在页面中指定一些参数,点击 快速生成一个springboot项目. 如下图: 2.2

SpringBoot扩展点之一:SpringApplicationRunListener

三种监听器的关系 ApplicationListener.SpringApplicationRunListeners.SpringApplicationRunListener的关系: SpringApplicationRunListeners类和SpringApplicationRunListener类是SpringBoot中新增的类.ApplicationListener是spring中框架的类. 在SpringBoot(SpringApplication类)中,使用SpringApplica

idea实现第一个springboot程序

1.环境准备 JDK:1.8 Apache Maven: 3.6.1 IntelliJ IDEA 2019.1.3 x64 SpringBoot 1.5.9.RELEASE:1.5.9: 1.1.MAVEN设置:给maven 的settings.xml配置文件的profiles标签添加 <profile> <id>jdk-1.8</id> <activation> <activeByDefault>true</activeByDefault

SpringBoot原理讲解

一.问题的引入 首先我们来看一个最简单的例子. 我们先创建一个SpringBoot的工程,如何创建一个SpringBoot工程就不说了,不会请自行解决.然后写一个controller类,通过请求路径,返回HelloWorld在浏览器页面上显示. 上面两张图就是程序的一个整体的结构和运行的结果,那么问题来了,SpringBoot程序中没有任何配置,不像Spring框架,写一大堆配置信息在xml文件中,那么程序是怎么将我们这里的Controller类扫描到spring容器中的呢? 二.原理讲解. 首

springboot捕获全局异常和配置多数据源

目录 配置多数据源 写两个数据源的配置类. @(springboot捕获全局异常和配置多数据源) 捕获全局异常是在项目运行期间如果调用的某一个方法出现了运行时异常,则会捕获,并且给出回馈. 首先需要建一个包,包里新建一个捕获异常类GlobalExceptionHandler.前提是springboot的启动类的扫描注解ComponentScan()要扫描到. /** * 用于捕获全局异常 */ @ControllerAdvice//控制器切面 public class GlobalExcepti

springboot多个事务管理

目录 导入依赖 在application.properties配置文件中对两个数据库的配置内容稍作修改. 在java文件夹下新建dbconfig包 在上篇文章中已经配置了数据源的两个配置类,这里需要修改一下. 启动类加上注解配置 @(springboot多个事务管理) 参考上篇文章配置多数据源 Springboot使用jta管理多个事务. 导入依赖 <!-- jta 管理多个数据源的事务--> <dependency> <groupId>org.springframew