本文共 2847 字,大约阅读时间需要 9 分钟。
2021SC@SDUSC
一、准备工作:了解springboot用来标记stereotype的annotation
使用的是springboot框架,这种框架比之前使用的ssm框架要更加的简便,最直观的体现就是SpringBoot项目可以直接打包成jar包,即使在不具备安装运行环境的情况下,只要下载了jar包,就能直接启动程序,具有很强的可移植性。这对应了上篇文章中提到的第一种运行方式。
spring boot项目一般可以使用Maven命令打包,或者借助Idea打包。
要想读懂这个项目,我们要先对springboot的框架设计做一些了解,首先需要认识常用的几个用来标记stereotype的annotation,主要分为以下四个:@Component,@Controller,@Repository,@Service。这四个都在org.springframework.stereotype包下面,后面3个都属于@Component,可以理解为@Component是@Controller,@Repository,@Service的基类。
1、@controller :控制器,用于标注控制层组件,比如:web controller。
2、@service服务:用于标注业务层组件。 3、@repository:用于标注数据访问组件,即DAO组件,负责实现dao访问。 4、@component :用来标记任何被Spring管理的组件,泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 @Component,@Service,@Controller,@Repository注解的类,都会纳入进spring容器中管理。只需要在Spring的xml中加入<context:component-scan>元素,Spring可以自动找到这些class,并实现注册。二、ServerMain分析——项目的起点
private static final Logger logger = LoggerFactory.getLogger(ServerMain.class);
上述是servermain的第一行代码,Logger来自import的org.slf4j.Logger包。
首先来了解一下什么是slf4j, Simple Logging Facade for Java(SLF4J)是门面模式的典型应用,用作各种日志框架(例如java.util.logging,logback,log4j)的简单外观或抽象(提供接口),允许最终用户在部署时插入所需的日志记录框架(提供获取具体日志对象的方法)。
简而言之,SLF4J只是一个日志标准,并不是日志系统的具体实现。slf4j的作用:只要所有代码都使用门面对象slf4j,我们就不需要关心具体实现,只要最终所有地方使用一种具体实现即可,便于我们更换、维护。这行代码就是通过LoggerFactory去获取slf4j提供的一个Logger接口的具体实现。
Logger 提供以下功能:1、管理线程的信息; 2、管理类的信息;3、将 JSON 文本人性化输出;4、将换行符人性化输出;5、简洁的输出;6、从日志跳转到源码。 Logger 与 原生 Log 最大的不同就是:Logger 打印出来的日志一目了然。日志记录消息将被转发到已注册的处理程序对象,这些对象可以将消息转发到各种目标,包括控制台、文件、操作系统日志等。
public static void main(String[] args) { StopWatch stopWatch = new StopWatch(); // 声明一个秒表用来记时 stopWatch.start(); ConfigurableApplicationContext context = new SpringApplicationBuilder(ServerMain.class) .logStartupInfo(false) .banner(new AppBanner()) .run(args); stopWatch.stop(); Integer port = context.getBean(ServerProperties.class).getPort(); logger.info("kkFileView 服务启动完成,耗时:{}s,演示页请访问: http://127.0.0.1:{} ", stopWatch.getTotalTimeSeconds(), port); }
第四行调用SpringApplication启动项目,源码及分析如下:
public SpringApplication(ResourceLoader resourceLoader, Class ... primarySources) { this.resourceLoader = resourceLoader; Assert.notNull(primarySources, "PrimarySources must not be null"); // 将启动类放入primarySources this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources)); // 获取web应用类型 (webFlux, servlet) this.webApplicationType = WebApplicationType.deduceFromClasspath(); // 获取 项目 META-INF/spring.factories中org.springframework.context.ApplicationContextInitializer setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class)); // 获取 项目 META-INF/spring.factories中org.springframework.context.ApplicationListener setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); this.mainApplicationClass = deduceMainApplicationClass();}
转载地址:https://blog.csdn.net/m0_55503427/article/details/120635299 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!