spring boot原理是什麼:
#一、內容簡介
透過《Spring Boot 體驗》介紹了Spring Boot可以幹什麼,這篇文章主要來解析它各個功能點的基本實現思路,從而對Spring Boot有個整體的理性認知。
依賴管理:Spring Boot做了大量的starter,而starter只是幫我們導入依賴項的一個入口,簡化專案依賴管理
自動配置:Spring Boot基於Spring程式碼配置提供了許多常用元件和框架的組態類,從而簡化專案組態
內嵌容器:整合Java的常見Web容器,簡化開發環境搭建,而且是打包插件打包web應用為可執行文件的基礎
Maven插件:用於打包可直接運行的jar文件或war文件,為項目的開箱即用提供支持,當然還有輔助開發的一些小功能
熱啟動:減少開發過程中反覆啟動容器的次數,提高開發效率
#應用監控:為應用審計、健康監控、度量資料收集提供基本服務
CLI(命令列工具):進行快速原型搭建,沒有必要使用
二、起始依賴:starter
在常規的Maven工程中,如果要使用某個框架或元件,需要導入大量的依賴,而且得注意依賴的版本匹配等問題,在Spring Boot中提供了大量的starter,這樣的starter會藉助Maven的依賴傳遞幫我們導入相關的依賴。例如以下的pom文件,它會加入web相關的依賴項,包括Spring Web、Spring MVC等:
....... <dependencies> <!--Web应用程序的典型依赖项--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.1.1.RELEASE</version> </dependency> </dependencies> .......
原理:我們只是導入了一個依賴項
簡而言之,我們的專案如果依賴了某個starter,那麼該starter又會依賴很多其他依賴項,而Maven的依賴傳遞會把starter依賴的依賴項加入我們的專案中。 starter只是做為了一個我們專案依賴項的導入中介。
有關maven的依賴傳遞可以參考相關資料,簡單描述如下:
專案A依賴B,B又依賴C。專案A只需要聲明依賴B,不需要聲明依賴C, Maven自動管理這種依賴的傳遞。
二、自動配置:AutoConfiguration
Spring Boot會按照某些條件使用預設值自動配置相關的元件或框架,從而大幅減少專案的配置文件,它在Spring自動掃描和基於程式碼配置的基礎上加入了自己的處理流程。以下內容先簡單介紹Spring基於程式碼配置,然後介紹Spring Boot做了什麼。
(一)、Spring基於程式碼設定
在Spring3以前,使用Spring上下文的方式一般是如下的:
Spring 設定檔
<!-- 数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" /> <property name="username" value="hr" /> <property name="password" value="hr" /></bean> <!--组件扫描--> <context:component-scan base-package="com.demo.spring.sample.step03.?rvic?" />
業務代碼
package com.demo.spring.sample.step03.service.impl;.......@Service("userService") public class UserService implements IUserService { @Autowired private IUserDAO userDAO = null; }
建立Spring上下文
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
總結:
#透過component-scan告訴Spring去掃描類別路徑下加入了@Component、 @Repository、@Service、 @ Controlle註解的類,Spring 實例化這些類,並且把實例註冊到Spring上下文中,但是資料來源、屬性檔案等第三方的bean還是採用XML檔案來配置,如果要完全消除XML配置文件,還是不太可行的,如果一定要做,相對比較麻煩。
使用XML設定檔有利有弊,其中一個弊端是無法過多的客製化bean的實例化過程,例如以上的dataSource,如果想要在類別路徑下有oracle的jdbc驅動時才去實例化,這是無法完成的。還有一個弊端是程式碼邏輯分散,因為有一部分的邏輯是在XML中配置的;當然好處就是配置集中化,而且方便配置切換。
在Spring3以後,可以透過如下的方式使用Spring容器:
Spring 設定類別
@Configuration // 表明当前类提供Spring配置文件的作用,Spring上下文会从当前类的注解中提取配置信息 @ComponentScan(basePackages = "com.demo.spring.sample.step08") // 开启组件扫描 public class AppConfig { @Bean // 表示这个方法实例化一个bean,id=dataSource public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(driverClassName); dataSource.setUrl(url); dataSource.setUsername(userName); dataSource.setPassword(password); return dataSource; }}
業務程式碼
package com.demo.spring.sample.step03.service.impl;.......@Service("userService") public class UserService implements IUserService { @Autowired private IUserDAO userDAO = null; }
建立Spring上下文
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
總結:
建立Spring上下文時不再使用基於XML的配置,設定檔消失,由AppConfig這個類別來代替,這個類別需要加@Configuration註解,而且該類別中可以有加@Bean註解的方法,容器會自動呼叫這樣的方法來實例化Bean。
(二)、Spring Boot的自動配置
Spring Boot幫寫了大量的加入了@Configuration註解的類,每個類提供一種組件或框架的配置,例如DataSourceConfiguration .java中的靜態內部類別Dbcp2,它提供DBCP資料來源的配置
//DBCP 数据源配置. @Configuration //这个注解在实际代码中没有加,当前类被其它配置类Import @ConditionalOnClass(org.apache.commons.dbcp2.BasicDataSource.class) @ConditionalOnMissingBean(DataSource.class) @ConditionalOnProperty(name = "spring.datasource.type", matchIfMissing = true,havingValue = "org.apache.commons.dbcp2.BasicDataSource") static class Dbcp2 { @Bean @ConfigurationProperties(prefix = "spring.datasource.dbcp2") public org.apache.commons.dbcp2.BasicDataSource dataSource( DataSourceProperties properties) { return createDataSource(properties, org.apache.commons.dbcp2.BasicDataSource.class); } }
總結:
当Spring Boot启动的基本步骤走完后, 如果启用了自动配置,Spring Boot会加载
spring.factories文件中自动配置类的部分内容
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ ...... org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ ......
(三)、如何覆盖自动配置的属性
Spring Boot的自动配置会采用大量的默认值(约定由于配置),可以通过在类路径下提供application.properties或者application.yml配置文件来覆盖默认值,当然部分属性值必须通过该配置文件来提供,比如如果要使用Spring Boot对数据源的自动配置,则在配置文件中必须提供jdbc的url,否则会抛出异常。
三、集成内嵌容器 :main方法
Spring Boot支持的内嵌容器Tomcat、Jetty、Undertow本身就支持在Java中内嵌使用,因为这些容器本身就是使用Java编写的,只不过Spring Boot在main方法的调用链中根据自动配置嵌入了这样的容器。
不使用这样的内嵌容器也是可以的,在Maven中移除这样的依赖就可以,当然这个时候如果要通过Spring Boot使用Web相关框架,则需要打包为war包后独立部署,或者在开发过程中使用IDE环境的开发部署功能。
不使用内嵌容器的Web应用在打包时需要对工程进行一定的修改。
四、打包可运行文件 :maven-plugin
Maven使用的默认打包工具支持打包jar文件或者war文件,但是打包后的jar文件中不能再嵌入jar文件,而打包后的war文件不能直接运行,为了把工程所有文件打包为一个可直接运行的jar文件或war文件,spring提供了一个maven插件来解决这样的问题。当然这个插件还提诸如spring-boot:run这样的开发功能
五、热启动 :devtools
在开发过程中,当完成一个功能单元后,我们会启动程序查看运行效果,如果代码需要再次修改,则修改后需要关掉程序,然后重启程序,这个过程不断迭代,从而完成代码的编写、调试。
Spring Boot 热启动通过重写容器的类加载器,完成程序的部分重启,从而简化、加速程序的调试过程。spring-boot-devtools通过两个类加载器分别加载依赖库和项目代码,当spring-boot-devtools发现项目的编译输出路径下有变化时,通过其中的一个类加载器重新加载所有的项目自有代码,从而完成热启动。这样的热启动比冷启动(关闭、重启)要快很多,到底快多少取决于项目自有代码的数量。
和热启动对应的还有一个热替换,是指单独地替换被修改的某一个class到jvm中,甚至可以单独替换class的某个方法,这种方式比热启动要快,通常使用 JavaAgent 拦截默认加载器的行为来实现,spring有个独立的项目Spring Loaded就是这么做的,但是项目已经被移到了 attic 了,也就是被Spring束之高阁,所以不建议使用。
六、应用监控:actuator
如果类路径中有actuator这个组件的话,Spring Boot的自动配置会自动创建一些端点(端点:遵循Restful设计风格的资源,对应于Controller的某一个处理请求的方法),这些端点接受请求后返回有关应用的相关信息,比如:健康信息、线程信息等。返回的是json格式的数据,而使用 Spring Boot Admin 可以实现这些 JSON 数据的视图展现,当然也可以为其他应用监控系统监控当前系统提供服务。
七、问题:
为什么pom文件中要继承spring-boot-starter-parent?
spring-boot-starter-parent是spring-boot提供的一个pom,在该pom中定义了很多属性,比如:java源文件的字符编码,编译级别等,还有依赖管理、资源定义的相关pom配置,项目的pom如果继承starter-parent,可以减少相关配置
推荐教程: 《java教程》
以上是spring boot原理是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

Atom編輯器mac版下載
最受歡迎的的開源編輯器

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

禪工作室 13.0.1
強大的PHP整合開發環境

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中