SpringApplication.run方法-创建SpringApplication对象

springboot启动类

@SpringBootApplication
public class Task02Applicaiton {

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

### run方法
```java
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {		
//调用重载方法
		return run(new Class<?>[] { primarySource }, args);
	}
```

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200708134859529.png)
```java
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
		return new SpringApplication(primarySources).run(args);
	}
```

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200708134959800.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvMDQ5MQ==,size_16,color_FFFFFF,t_70)
#### 构造方法 -先创建SpringApplication对象

```java

public SpringApplication(Class<?>... primarySources) {
//primarySources就是启动类传入进来的那个类
		this(null, primarySources);
	}
```

重载方法
```java
	public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
		this.resourceLoader = resourceLoader;
		Assert.notNull(primarySources, "PrimarySources must not be null");
		//这行代码是将启动类存储到SpringApplicationd对象的primarySources 属性中
		this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
		//推断WebApplicationType -推断Web应用类型
		this.webApplicationType = WebApplicationType.deduceFromClasspath();
		//设置初始化spring.factories文件中ApplicationContextInitializer的类
		/*
		org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
其实这个方法就是通过SpringFactoriesLoader类的loadFactoryNames()方法从类路径下的 “META-INF/spring.factories” 文件中找到所有的 “ApplicationContextInitializer”,然后保存到 SpringApplication的initializers属性中。
		 */
		setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
		//设置并初始化spring.factories文件中ApplicationListener的监听器
		/*
		org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer
		 */
		//和上个方法类似,只不过这个方法是加载Spring应用事件监听器,但是原理是 一样的,都是利用SpringFactoriesLoader类的loadFactoryNames()方法,只不过这个初始化的对象变成了ApplicationListener
		setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
		//这个方法的作用是从多个配置类中找到含有main方法的主配置类
		this.mainApplicationClass = deduceMainApplicationClass();
	}

```



![在这里插入图片描述](https://img-blog.csdnimg.cn/20200708140753907.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvMDQ5MQ==,size_16,color_FFFFFF,t_70)





#### 	this.mainApplicationClass = deduceMainApplicationClass();
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200708141013903.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvMDQ5MQ==,size_16,color_FFFFFF,t_70)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200708140927871.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvMDQ5MQ==,size_16,color_FFFFFF,t_70)
```java

	private Class<?> deduceMainApplicationClass() {
		try {
			StackTraceElement[] stackTrace = new RuntimeException().getStackTrace();
			for (StackTraceElement stackTraceElement : stackTrace) {
				//判断是不是main方法是就反射获取这个类
				if ("main".equals(stackTraceElement.getMethodName())) {
					return Class.forName(stackTraceElement.getClassName());
				}
			}
		}
		catch (ClassNotFoundException ex) {
			// Swallow and continue
		}
		return null;
	}
```


这个class对象并一定要传入其主配置类,因为我们知道@SpringBootApplication 元标注 @EnableAutoConfiguration,它们的作用基本相同,换言之,这里的class 对象我们可以传入任意标注了@EnableAutoConfiguration@Configuration两个注解的类。




```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值