SpringBoot 시작 방법 run()소스 코드 분석

입구
보통 간단 한 SpringBoot 기초 프로젝트 는 다음 과 같은 코드 가 있 습 니 다.

@SpringBootApplication
@RestController
@RequestMapping("/")
public class Application {

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

}
주목 할 만 한 것 은 SpringApplication.run 및 주해@SpringBootApplication 입 니 다.
run 방법

public ConfigurableApplicationContext run(String... args) {
	 //   
		StopWatch stopWatch = new StopWatch();
		stopWatch.start();
		ConfigurableApplicationContext context = null;
		Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
		configureHeadlessProperty();
		//      
		SpringApplicationRunListeners listeners = getRunListeners(args);
		//      
		listeners.starting();
		try {
		 // application       
			ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
			ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
			//      bean  
			configureIgnoreBeanInfo(environment);
			Banner printedBanner = printBanner(environment);
			//        
			context = createApplicationContext();
			exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,
					new Class[] { ConfigurableApplicationContext.class }, context);
		 //      ,  bean
			prepareContext(context, environment, listeners, applicationArguments, printedBanner);
			//      
			refreshContext(context);
			//       
			afterRefresh(context, applicationArguments);
			stopWatch.stop();
			if (this.logStartupInfo) {
				new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
			}
			//       
			listeners.started(context);
			//   
			callRunners(context, applicationArguments);
		}
		catch (Throwable ex) {
			handleRunFailure(context, ex, exceptionReporters, listeners);
			throw new IllegalStateException(ex);
		}

		try {
		 //        
			listeners.running(context);
		}
		catch (Throwable ex) {
			handleRunFailure(context, ex, exceptionReporters, null);
			throw new IllegalStateException(ex);
		}
		return context;
	}
getRunListeners
모니터 가 져 오기

private SpringApplicationRunListeners getRunListeners(String[] args) {
		Class<?>[] types = new Class<?>[] { SpringApplication.class, String[].class };
		//    Spring Factory     
		return new SpringApplicationRunListeners(logger,
				getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args));
	}


	private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) {
		ClassLoader classLoader = getClassLoader();
		// Use names and ensure unique to protect against duplicates
		//    spring.factories
		Set<String> names = new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(type, classLoader));
		//   SpringFactory  
		List<T> instances = createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names);
		/**
		 *    {@link Ordered}
		 */
		AnnotationAwareOrderComparator.sort(instances);
		return instances;
	}

createSpringFactoriesInstances

 @SuppressWarnings("unchecked")
 private <T> List<T> createSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes,
 		ClassLoader classLoader, Object[] args, Set<String> names) {
 //    
 	List<T> instances = new ArrayList<>(names.size());
 	for (String name : names) {
 		try {
 		 //         class  
 			Class<?> instanceClass = ClassUtils.forName(name, classLoader);
 			Assert.isAssignable(type, instanceClass);
 			//      
 			Constructor<?> constructor = instanceClass.getDeclaredConstructor(parameterTypes);
 			//       
 			T instance = (T) BeanUtils.instantiateClass(constructor, args);
 			//       
 			instances.add(instance);
 		}
 		catch (Throwable ex) {
 			throw new IllegalArgumentException("Cannot instantiate " + type + " : " + name, ex);
 		}
 	}
 	return instances;
 }
printBanner

private Banner printBanner(ConfigurableEnvironment environment) {
		if (this.bannerMode == Banner.Mode.OFF) {
			return null;
		}
		ResourceLoader resourceLoader = (this.resourceLoader != null) ? this.resourceLoader
				: new DefaultResourceLoader(getClassLoader());
		//      
		SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter(resourceLoader, this.banner);
		if (this.bannerMode == Mode.LOG) {
		 //   
			return bannerPrinter.print(environment, this.mainApplicationClass, logger);
		}
 //   
		return bannerPrinter.print(environment, this.mainApplicationClass, System.out);
	}
	Banner print(Environment environment, Class<?> sourceClass, PrintStream out) {
		Banner banner = getBanner(environment);
		banner.printBanner(environment, sourceClass, out);
		return new PrintedBanner(banner, sourceClass);
	}
최종 출력 내용 클래스:org.springframework.boot.SpringBootBanner

class SpringBootBanner implements Banner {

	private static final String[] BANNER = { "", " . ____  _  __ _ _",
			" /\\\\ / ___'_ __ _ _(_)_ __ __ _ \\ \\ \\ \\", "( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\",
			" \\\\/ ___)| |_)| | | | | || (_| | ) ) ) )", " ' |____| .__|_| |_|_| |_\\__, | / / / /",
			" =========|_|==============|___/=/_/_/_/" };

	private static final String SPRING_BOOT = " :: Spring Boot :: ";

	private static final int STRAP_LINE_SIZE = 42;

	@Override
	public void printBanner(Environment environment, Class<?> sourceClass, PrintStream printStream) {
		for (String line : BANNER) {
			printStream.println(line);
		}
		String version = SpringBootVersion.getVersion();
		version = (version != null) ? " (v" + version + ")" : "";
		StringBuilder padding = new StringBuilder();
		while (padding.length() < STRAP_LINE_SIZE - (version.length() + SPRING_BOOT.length())) {
			padding.append(" ");
		}

		printStream.println(AnsiOutput.toString(AnsiColor.GREEN, SPRING_BOOT, AnsiColor.DEFAULT, padding.toString(),
				AnsiStyle.FAINT, version));
		printStream.println();
	}

}
이 편 을 통 해 spring boot 시작 방법 에 대한 해석 을 통 해 spring boot 밑바닥 에 대해 대체적으로 알 게 되 었 고 주요 방법 만 분 석 했 으 니 여러분 께 도움 이 되 기 를 바 랍 니 다.
여기 서 SpringBoot 시작 방법 run()소스 감상 분석 에 관 한 글 은 여기까지 입 니 다.더 많은 SpringBoot 시작 run()내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기