一步步分析springboot啟動機制(starter機制)

2020-10-17 愛馬士

前言

使用過springboot的同學應該已經知道,springboot通過默認配置了很多框架的使用方式幫我們大大簡化了項目初始搭建以及開發過程。本文的目的就是一步步分析springboot的啟動過程,分析springboot是如何幫我們簡化這個過程的。

springboot幫我們做了什麼

通常搭建一個基於spring的web應用,我們需要做以下工作:

1、pom文件中引入相關jar包,包括spring、springmvc、redis、mybaits、log4j、mysql-connector-java 等等相關jar ...

2、配置web.xml,Listener配置、Filter配置、Servlet配置、log4j配置、error配置 ...

3、配置資料庫連接、配置spring事務

4、配置視圖解析器

5、開啟註解、自動掃描功能

6、配置完成後部署tomcat、啟動調試

......

搭個初始項目不一會就一個小時甚至半天過去了。而用springboot後,一切都變得很簡便快速。下來我們來一步步分析springboot的起步依賴與自動配置這兩個核心原理。

回到頂部

起步依賴

在springboot中我們只需要引入下面簡單的幾步就可以完成一個ssm後臺項目的初始搭建。

1、引入jar

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --></parent><!--mybatis 開發包--><dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version></dependency><!--springboot web模塊支持--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope></dependency><!--druid 的數據源--><dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.31</version></dependency>

spring-boot-starter-web包自動幫我們引入了web模塊開發需要的相關jar包,

mybatis-spring-boot-starter幫我們引入了dao開發相關的jar包。

spring-boot-starter-xxx是官方提供的starter,xxx-spring-boot-starter是第三方提供的starter。

如下截圖:

可以看出在這個mybatis-spring-boot-starter 中,並沒有任何源碼,只有一個pom文件,它的作用就是幫我們引入了相關jar包。

2、配置數據源

spring: datasource: url: jdbc:mysql://127.0.0.1:3306/mybatis_test username: root password: root driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource dbcp2: min-idle: 5 initial-size: 5 max-total: 5 max-wait-millis: 200

stater機制幫我們完成了項目起步所需要的的相關jar包。那問題又來了,傳統的spring應用中不是要在application.xml中配置很多bean的嗎,比如dataSource的配置,transactionManager的配置 ... springboot是如何幫我們完成這些bean的配置的?下面我們來分析這個過程

回到頂部

自動配置

基於java代碼的bean配置

以mybatis為例,在上面的截圖中,我們發下mybatis-spring-boot-starter這個包幫我們引入了mybatis-spring-boot-autoconfigure這個包,如下圖:

裡面有MybatisAutoConfiguration這個類,打開這個類看看有什麼東西。

熟悉@Configuration&、@Bean這兩個bean的同學或許已經知道了。這兩個註解一起使用就可以創建一個基於java代碼的配置類,可以用來替代相應的xml配置文件。

@Configuration註解的類可以看作是能生產讓Spring IoC容器管理的Bean實例的工廠。

@Bean註解告訴Spring,一個帶有@Bean的註解方法將返回一個對象,該對象應該被註冊到spring容器中。

傳統的基於xml的bean配置方法如下:

<beans> <bean id = "car" class="com.itpsc.Car"> <property name="wheel" ref = "wheel"></property> </bean> <bean id = "wheel" class="com.itpsc.Wheel"></bean> </beans>

相當於用基於java代碼的配置方式:

@Configuration public class Conf { @Bean public Car car() { Car car = new Car(); car.setWheel(wheel()); return car; } @Bean public Wheel wheel() { return new Wheel(); } }

所以上面的MybatisAutoConfiguration這個類,自動幫我們生成了SqlSessionFactory這些Mybatis的重要實例並交給spring容器管理,從而完成bean的自動註冊。

自動配置條件依賴

從MybatisAutoConfiguration這個類中使用的註解可以看出,要完成自動配置是有依賴條件的。

@Configuration@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})@ConditionalOnBean({DataSource.class})@EnableConfigurationProperties({MybatisProperties.class})@AutoConfigureAfter({DataSourceAutoConfiguration.class})public class MybatisAutoConfiguration {//....}

這些是springboot特有的,常見的條件依賴註解有:

@ConditionalOnBean,僅在當前上下文中存在某個bean時,才會實例化這個Bean。

@ConditionalOnClass,某個class位於類路徑上,才會實例化這個Bean。

@ConditionalOnExpression,當表達式為true的時候,才會實例化這個Bean。

@ConditionalOnMissingBean,僅在當前上下文中不存在某個bean時,才會實例化這個Bean。

@ConditionalOnMissingClass,某個class在類路徑上不存在的時候,才會實例化這個Bean。

@ConditionalOnNotWebApplication,不是web應用時才會實例化這個Bean。

@AutoConfigureAfter,在某個bean完成自動配置後實例化這個bean。

@AutoConfigureBefore,在某個bean完成自動配置前實例化這個bean。

所以要完成Mybatis的自動配置,需要在類路徑中存在SqlSessionFactory.class、SqlSessionFactoryBean.class這兩個類,需要存在DataSource這個bean且這個bean完成自動註冊。

進入DataSourceAutoConfiguration這個類,可以看到這個類屬於這個包:

org.springframework.boot.autoconfigure.jdbc

這個包又屬於spring-boot-autoconfigure-2.0.4.RELEASE.jar這個包,自動配置這個包幫們引入了jdbc、kafka、logging、mail、mongo等包。很多包需要我們引入相應jar後自動配置才生效。

bean參數獲取

到此我們已經知道了bean的配置過程,但是還沒有看到springboot是如何讀取yml或者properites配置文件的的屬性來創建數據源的?

在DataSourceAutoConfiguration類裡面,我們注意到使用了EnableConfigurationProperties這個註解。

@Configuration@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})@EnableConfigurationProperties({DataSourceProperties.class})@Import({DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class})public class DataSourceAutoConfiguration {...}

DataSourceProperties中封裝了數據源的各個屬性,且使用了註解ConfigurationProperties指定了配置文件的前綴。

@ConfigurationProperties( prefix = "spring.datasource")public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean { private ClassLoader classLoader; private String name; private boolean generateUniqueName; private Class<? extends DataSource> type; private String driverClassName; private String url; private String username; private String password; private String jndiName; ...}

@EnableConfigurationProperties與@ConfigurationProperties這兩個註解有什麼用呢?我們先看一個例子:

@Component@ConfigurationProperties(prefix="spring.datasource")public class PropertiesBean { private String url; private String username; private String password; //省略getter、setter... @Override public String toString() { return "PropertiesBean{" + "url='" + url + '\'' + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; }}

@SpringBootApplication@MapperScan("com.itpsc.mapper*")@EnableConfigurationPropertiespublic class SpringbootMybatisDemoApplication { public static void main(String[] args) { //SpringApplication.run(SpringbootMybatisDemoApplication.class, args); ConfigurableApplicationContext context = SpringApplication.run(SpringbootMybatisDemoApplication.class, args); //獲取yml配置轉換後的bean System.out.println("----------------------"+context.getBean(PropertiesBean.class)); context.close(); }}

運行結果:

從運行結果可以看出@ConfigurationProperties與@EnableConfigurationPropertie的作用就是:

@ConfigurationProperties註解的作用是把yml或者properties配置文件轉化為bean。

@EnableConfigurationProperties註解的作用是使@ConfigurationProperties註解生效。如果只配置@ConfigurationProperties註解,在spring容器中是獲取不到yml或者properties配置文件轉化的bean的。

通過這種方式,把yml或者properties配置參數轉化為bean,這些bean又是如何被發現與加載的?

bean發現

springboot默認掃描啟動類所在的包下的主類與子類的所有組件,但並沒有包括依賴包的中的類,那麼依賴包中的bean是如何被發現和加載的?

我們通常在啟動類中加@SpringBootApplication這個註解,點進去看

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class}), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class})})public @interface SpringBootApplication {...}

實際上重要的只有三個Annotation:

@Configuration(@SpringBootConfiguration裡面還是應用了@Configuration)

@EnableAutoConfiguration

@ComponentScan

@Configuration的作用上面我們已經知道了,被註解的類將成為一個bean配置類。

@ComponentScan的作用就是自動掃描並加載符合條件的組件,比如@Component和@Repository等,最終將這些bean定義加載到spring容器中。

@EnableAutoConfiguration 這個註解的功能很重要,藉助@Import的支持,收集和註冊依賴包中相關的bean定義。

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import({AutoConfigurationImportSelector.class})public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; Class<?>[] exclude() default {}; String[] excludeName() default {};}

如上源碼,@EnableAutoConfiguration註解引入了@AutoConfigurationPackage和@Import這兩個註解。@AutoConfigurationPackage的作用就是自動配置的包,@Import導入需要自動配置的組件。

進入@AutoConfigurationPackage,發現也是引入了@Import註解

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@Import({Registrar.class})public @interface AutoConfigurationPackage {}

static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports { Registrar() { } public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { AutoConfigurationPackages.register(registry, new String[]{(new AutoConfigurationPackages.PackageImport(metadata)).getPackageName()}); } public Set<Object> determineImports(AnnotationMetadata metadata) { return Collections.singleton(new AutoConfigurationPackages.PackageImport(metadata)); } }

new AutoConfigurationPackages.PackageImport(metadata)).getPackageName()

new AutoConfigurationPackages.PackageImport(metadata)

這兩句代碼的作用就是加載啟動類所在的包下的主類與子類的所有組件註冊到spring容器,這就是前文所說的springboot默認掃描啟動類所在的包下的主類與子類的所有組件。

那問題又來了,要搜集並註冊到spring容器的那些beans來自哪裡?

進入 AutoConfigurationImportSelector類,

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {private static final String[] NO_IMPORTS = new String[0];... public String[] selectImports(AnnotationMetadata annotationMetadata) { if(!this.isEnabled(annotationMetadata)) { return NO_IMPORTS; } else { AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader); AnnotationAttributes attributes = this.getAttributes(annotationMetadata); List configurations = this.getCandidateConfigurations(annotationMetadata, attributes); configurations = this.removeDuplicates(configurations); Set exclusions = this.getExclusions(annotationMetadata, attributes); this.checkExcludedClasses(configurations, exclusions); configurations.removeAll(exclusions); configurations = this.filter(configurations, autoConfigurationMetadata); this.fireAutoConfigurationImportEvents(configurations, exclusions); return StringUtils.toStringArray(configurations); } }... protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { List configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader()); Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct."); return configurations; }...}

SpringFactoriesLoader.loadFactoryNames方法調用loadSpringFactories方法從所有的jar包中讀取META-INF/spring.factories文件信息。

private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) { MultiValueMap result = (MultiValueMap)cache.get(classLoader); if(result != null) { return result; } else { try { Enumeration ex = classLoader != null?classLoader.getResources("META-INF/spring.factories"):ClassLoader.getSystemResources("META-INF/spring.factories"); LinkedMultiValueMap result1 = new LinkedMultiValueMap(); while(ex.hasMoreElements()) { URL url = (URL)ex.nextElement(); UrlResource resource = new UrlResource(url); Properties properties = PropertiesLoaderUtils.loadProperties(resource); Iterator var6 = properties.entrySet().iterator(); while(var6.hasNext()) { Entry entry = (Entry)var6.next(); List factoryClassNames = Arrays.asList(StringUtils.commaDelimitedListToStringArray((String)entry.getValue())); result1.addAll((String)entry.getKey(), factoryClassNames); } } cache.put(classLoader, result1); return result1; } catch (IOException var9) { throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var9); } } }

下面是spring-boot-autoconfigure這個jar中spring.factories文件部分內容,其中有一個key為org.springframework.boot.autoconfigure.EnableAutoConfiguration的值定義了需要自動配置的bean,通過讀取這個配置獲取一組@Configuration類。

org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener# Auto Configuration Import Filtersorg.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\org.springframework.boot.autoconfigure.condition.OnClassCondition# Auto Configureorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\

每個xxxAutoConfiguration都是一個基於java的bean配置類。實際上,這些xxxAutoConfiguratio不是所有都會被加載,會根據xxxAutoConfiguration上的@ConditionalOnClass等條件判斷是否加載。

private static <T> T instantiateFactory(String instanceClassName, Class<T> factoryClass, ClassLoader classLoader) { try { Class ex = ClassUtils.forName(instanceClassName, classLoader); if(!factoryClass.isAssignableFrom(ex)) { throw new IllegalArgumentException("Class [" + instanceClassName + "] is not assignable to [" + factoryClass.getName() + "]"); } else { return ReflectionUtils.accessibleConstructor(ex, new Class[0]).newInstance(new Object[0]); } } catch (Throwable var4) { throw new IllegalArgumentException("Unable to instantiate factory class: " + factoryClass.getName(), var4); } }

如上代碼段,通過反射機制將spring.factories中@Configuration類實例化為對應的java實例。到此我們已經知道怎麼發現要自動配置的bean了,最後一步就是怎麼樣將這些bean加載到spring容器。

bean加載

如果要讓一個普通類交給Spring容器管理,通常有以下方法:

1、使用 @Configuration與@Bean 註解

2、使用@Controller @Service @Repository @Component 註解標註該類,然後啟用@ComponentScan自動掃描

3、使用@Import 方法

springboot中使用了@Import 方法

@EnableAutoConfiguration註解中使用了@Import({AutoConfigurationImportSelector.class})註解,AutoConfigurationImportSelector實現了DeferredImportSelector接口,

DeferredImportSelector接口繼承了ImportSelector接口,ImportSelector接口只有一個selectImports方法。

public class AutoConfigurationImportSelector implements DeferredImportSelector{... public String[] selectImports(AnnotationMetadata annotationMetadata) { if(!this.isEnabled(annotationMetadata)) { return NO_IMPORTS; } else { AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader); AnnotationAttributes attributes = this.getAttributes(annotationMetadata); List configurations = this.getCandidateConfigurations(annotationMetadata, attributes); configurations = this.removeDuplicates(configurations); Set exclusions = this.getExclusions(annotationMetadata, attributes); this.checkExcludedClasses(configurations, exclusions); configurations.removeAll(exclusions); configurations = this.filter(configurations, autoConfigurationMetadata); this.fireAutoConfigurationImportEvents(configurations, exclusions); return StringUtils.toStringArray(configurations); }}...}

public interface DeferredImportSelector extends ImportSelector { @Nullable default Class<? extends DeferredImportSelector.Group> getImportGroup() { return null;}public interface Group {...}}

public interface ImportSelector { String[] selectImports(AnnotationMetadata var1);}

我們先通過一個簡單例子看看@Import註解是如何將bean導入到spring容器的。

1、新建一個bean

public class User { private Long id; private String name; private String password;private String phone;...}

2、創建一個ItpscSelector類繼承ImportSelector接口並實現selectImports方法

public class ItpscSelector implements ImportSelector { public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"com.itpsc.entity.User"}; }}

3、創建ImportConfig類,使用@Configuration、@Import(ItpscSelector.class)註解。

@Configuration@Import(ItpscSelector.class)public class ImportConfig {}

4、從容器獲取bean

@RunWith(SpringRunner.class)@SpringBootTestpublic class ImportSelectorTests { @Test public void testSelectImport() { ApplicationContext ctx = new AnnotationConfigApplicationContext(ImportConfig.class); String[] beanDefinitionNames = ctx.getBeanDefinitionNames(); for (String name : beanDefinitionNames) { System.out.println(name); } }}

運行結果:

org.springframework.context.annotation.internalConfigurationAnnotationProcessororg.springframework.context.annotation.internalAutowiredAnnotationProcessororg.springframework.context.annotation.internalRequiredAnnotationProcessororg.springframework.context.annotation.internalCommonAnnotationProcessororg.springframework.context.event.internalEventListenerProcessororg.springframework.context.event.internalEventListenerFactoryimportConfigcom.itpsc.entity.User

很直觀,selectImports方法返回一組bean,@EnableAutoConfiguration註解藉助@Import註解將這組bean注入到spring容器中,springboot正式通過這種機制來完成bean的注入的。

回到頂部

總結

我們可以將自動配置的關鍵幾步以及相應的註解總結如下:

1、@Configuration&與@Bean->基於java代碼的bean配置

2、@Conditional->設置自動配置條件依賴

3、@EnableConfigurationProperties與@ConfigurationProperties->讀取配置文件轉換為bean。

4、@EnableAutoConfiguration、@AutoConfigurationPackage 與@Import->實現bean發現與加載。

相關焦點

  • JAVA資深架構師帶你一步步剖析SpringBoot啟動機制
    前言使用過springboot的同學應該已經知道,springboot通過默認配置了很多框架的使用方式幫我們大大簡化了項目初始搭建以及開發過程。本文的目的就是一步步分析springboot的啟動過程,分析springboot是如何幫我們簡化這個過程的。
  • Spring面試題:SpringBoot開發自定義starter
    應用程式只需要在maven中引入starter依賴,SpringBoot就能自動掃描到要加載的信息並啟動相應的默認配置。用一句話描述,就是springboot的場景啟動器。開始自定義starter前看看Springboot的AutoConfiguration機制。
  • SpringBoot開發自己的Starter
    SpringBoot starter機制>SpringBoot中的starter是一種非常重要的機制,能夠拋棄以前繁雜的配置,將其統一集成進starter,應用者只需要在maven中引入starter依賴,SpringBoot就能自動掃描到要加載的信息並啟動相應的默認配置。
  • 實戰|從0到1搭建自己的springboot starter
    本文先介紹springboot的 starter機制,從以下方向著手:1.為什麼要用starter2.starter的幾個要素3.編寫自己的starter4.starter的底層實現一、為什麼要用starter
  • springboot整合dubbo+zookeeper(三)
    現在越來越多的公司開發項目中使用了springboot作為搭建服務的框架,而dubbo是一款國內使用較多的SOA架構開發的中間件,其主要由三個部分組成:生產者,消費者,註冊中心。註冊中心一般使用的是zookeeper。於是我們從頭來捋一捋如何搭建一個springboot+dubbo項目。
  • 黑馬程式設計師:SpringBoot教程,SpringBoot高級之原理分析
    一、SpringBoot自動配置--註解說明1.1、Condition條件判斷1.1.1、創建Condition模塊Condition(條件):Condition是在Spring4.0增加的條件判斷功能,通過這個可以功能可以實現選擇性的創建
  • springboot消息機制掃盲
    broker)和目的地(destination)當消息發送者發送消息後,將由消息代理接管,消息代理保證消息傳遞到指定目的地消息隊列主要由兩個形式的目的地隊列(queue):點對點消息通信(point to point)主題(topic):發布(publish)/訂閱(subscribe)消息通信
  • SpringBoot實戰(十二):集成BootAdmin監控
    )新建springboot項目(在此項目名定為zh-monitor) (2)pom文件如下:<?</artifactId> </dependency> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId
  • 從零手寫並發框架(四)異步轉同步 springboot 整合
    )異步查詢轉同步的 7 種實現方式java 手寫並發框架(二)異步轉同步框架封裝鎖策略java 手寫並發框架(三)異步轉同步框架註解和字節碼增強java 手寫並發框架(四)異步轉同步框架spring整合整合思路
  • 用了 springboot + rabbitmq 消息確認機制,我感覺掉坑裡了
    這次我分享的是 springboot + rabbitmq 如何實現消息確認機制,以及在實際開發中的一點踩坑經驗,例如:消息生產者 - > rabbitmq伺服器(消息發送失敗)rabbitmq伺服器自身故障導致消息丟失消息消費者 - > rabbitmq服務(消費消息失敗)
  • 兩小時入門SpringBoot學習(基礎)(上)
    第一步,使用spring Initializr新建一個項目ispringboot,具體操作如下(按照圖中序號依次進行即可):第三種:先在項目根路徑(也就是pom.xml所在目錄)下執行maven命令mvn install,接著進入到target目錄,然後在target目錄下執行java -jar luckymoney-0.0.1-SNAPSHOT.jar即可(注意這種方式是springboot項目脫機後運行的方式)
  • 01:springboot最快入門之三分鐘啟動springboot項目
    讓文件配置變的相當簡單、讓應用部署變的簡單),可以快速開啟一個Web容器進行開發。三、本章目標使用springboot完成一個簡單的web(springmvc)應用程式,通過@restController輸出"HelloWord"到界面,讓我們初步體驗springboot的快速開發、簡單的特性。目標時間:三分鐘。
  • 「SpringBoot」 架構師不懂spring-boot-starter?
    甚至有些同學對`spring-boot-starter`的作用與機制都完全不了。筆者感到要吐血.......SpringBean掃描在了解Spring-Boot-Starter之前, 先看如下Spring-Boot示例。
  • 一看就會,編寫自己的SpringBoot-Starter
    開發自己的starterstarter的好處是,集成眾多依賴,提供一個一站式的依賴項。 Starter相當於模塊,它能將模塊所需的依賴整合起來並對模塊內的Bean根據環境( 條件)進行自動配置。 使用者只需要依賴相應功能的Starter,無需做過多的配置和依賴, Spring Boot就能自動掃描並加載相應的模塊。
  • 兩小時入門SpringBoot學習(基礎)(下)
    接下來說一下請求方式,這裡面的say方法使用的是@GetMapping(&34;),(@GetMapping是@RequestMapping(method = RequestMethod.GET)的縮寫。)
  • SpringBoot實戰(十四):Admin 集成安全模塊
    Security)模塊 1、Spring Boot Admin服務端集成(以zh-monitor為例) (1)Pom中增加Security依賴<dependency> <groupId>org.springframework.boot</groupId>
  • 微服務實戰系列(三)-cloud、boot及maven關係
    介紹2.2.1 介紹其實springboot就是一個maven項目,只不過使用了spring提供的多個starter來加載多個相關依賴包,starter簡單說就是maven包的組合。比如:只需要一個web的starter包就能直接啟動web服務了( springboot項目快速搭建) <dependency> <groupId
  • SpringBoot實戰(五):配置健康檢查與監控
    分別都是如何配置; 3、我們項目中是如何配置基礎系統監控; 二、Pom中添加監控依賴<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator
  • springcloud,springboot是什麼?
    拿我們國家的兵種來說,如何把戰爭這個單體架構微服務化,就是根據適用的場景,拆分出不同的兵種(微服務)然後每個兵種之間通過軍區指揮部採用特有的通信協議連接起來(RPC) ;每個兵種內部自治,有自己的業務,數據,部署單元(建制)對外提供打擊服務(HTTP)。
  • 這篇springboot自動裝配之自定義starter講的夠清楚了吧
    舉個例子:當我們創建一個springboot項目,引入spring-boot-starter-web依賴,會自動給我們創建一個8080埠的tomcat,同時通過配置文件application.yaml配置項目的自定義埠(server.port)。簡單說明下:1、什麼樣的條件?因為我們引入spring-boot-starter-web依賴。