{"id":1757,"date":"2023-03-26T21:34:09","date_gmt":"2023-03-26T13:34:09","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1757"},"modified":"2023-04-23T21:25:56","modified_gmt":"2023-04-23T13:25:56","slug":"four-major-components-of-spring-boot","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/26\/four-major-components-of-spring-boot\/","title":{"rendered":"Spring Boot\u56db\u5927\u7ec4\u4ef6"},"content":{"rendered":"<h2>Spring Boot\u7279\u70b9<\/h2>\n<ul>\n<li>\u9075\u5faa\u7ea6\u5b9a\u4f18\u4e8e\u914d\u7f6e\u7684\u539f\u5219<\/li>\n<li>\u63d0\u4f9bstarter pom\uff0c\u9ad8\u6548\u5305\u7ba1\u7406<\/li>\n<li>\u7b80\u5316\u914d\u7f6e\uff0c\u65e0\u9700xml<\/li>\n<li>\u5185\u5d4cServlet\u5bb9\u5668<\/li>\n<li>\u4e0e\u4e3b\u6d41\u6846\u67b6\u96c6\u6210\u7b80\u5355<\/li>\n<\/ul>\n<p><!-- more --><\/p>\n<h2>Spring Boot\u56db\u5927\u7ec4\u4ef6<\/h2>\n<h3>Auto-Configuration<\/h3>\n<p>\u8fd0\u884c\u4f9d\u8d56\uff1a<\/p>\n<ul>\n<li>\u7ee7\u627f<code>spring-boot-starter-parent<\/code><\/li>\n<li>\u7ee7\u627f<code>spring-boot-dependencies<\/code><\/li>\n<li>\u5f15\u5165<code>spring-boot-autoconfigure<\/code><\/li>\n<\/ul>\n<p>\u8fd0\u884c\u673a\u5236\uff1a<\/p>\n<ul>\n<li>\u6ce8\u89e3<code>EnableAutoConfiguration<\/code><\/li>\n<li><code>AutoConfigurationImportSelector<\/code><\/li>\n<li>\u901a\u8fc7<code>selectImports<\/code>\u52a0\u8f7d\u81ea\u52a8\u914d\u7f6e\u4fe1\u606f<\/li>\n<li>\u901a\u8fc7<code>getCandidateConfigurations<\/code>\u52a0\u8f7d<code>META-INF\/spring.factories<\/code><\/li>\n<\/ul>\n<h4>\u5b98\u65b9\u96c6\u6210\u6846\u67b6<\/h4>\n<ul>\n<li>RabbitAutoConfiguration<\/li>\n<li>JpaRepositoriesAutoConfiguration<\/li>\n<li>ElasticSearchAutoConfiguration<\/li>\n<li>RedisAutoConfiguration<\/li>\n<li>LdapDataAutoConfiguration<\/li>\n<li>MongoAutoConfiguration<\/li>\n<\/ul>\n<h4>\u7b2c\u4e09\u65b9\u96c6\u6210\u6846\u67b6<\/h4>\n<ul>\n<li>MybatisAutoConfiguration<\/li>\n<li>DubboAutoConfiguration<\/li>\n<li>PageHelperAutoConfiguration<\/li>\n<\/ul>\n<h4>\u5e38\u7528\u6ce8\u89e3<\/h4>\n<ul>\n<li><code>@Configuration<\/code>\uff1aSpring\u4e0a\u4e0b\u6587\u914d\u7f6e<\/li>\n<li><code>@Bean<\/code>\uff1a\u5bf9\u8c61\u6ce8\u89e3<\/li>\n<li><code>@ConditionalOnBean<\/code>\uff1a\u5f53SpringIoc\u5bb9\u5668\u5185\u5b58\u5728\u6307\u5b9aBean\u7684\u6761\u4ef6<\/li>\n<li><code>@ConditionalOnClass<\/code>\uff1a\u5f53SpringIoc\u5bb9\u5668\u5185\u5b58\u5728\u6307\u5b9aClass\u7684\u6761\u4ef6<\/li>\n<li><code>@ConditionalOnMissingBean<\/code>\uff1a\u5f53SpringIoc\u5bb9\u5668\u5185\u4e0d\u5b58\u5728\u6307\u5b9aBean\u7684\u6761\u4ef6<\/li>\n<li><code>@ConditionalOnMissingClass<\/code>\uff1a\u5f53SpringIoc\u5bb9\u5668\u5185\u4e0d\u5b58\u5728\u6307\u5b9aClass\u7684\u6761\u4ef6<\/li>\n<li><code>@ConditionalOnProperty<\/code>\uff1a\u6307\u5b9a\u7684\u5c5e\u6027\u662f\u5426\u6709\u6307\u5b9a\u7684\u503c<\/li>\n<li><code>@ConditionalOnResource<\/code>\uff1a\u7c7b\u8def\u5f84\u662f\u5426\u6709\u6307\u5b9a\u7684\u503c<\/li>\n<\/ul>\n<h3>Starter<\/h3>\n<p>Starter\u662fSpring Boot\u4e2d\u7684\u4e00\u4e2a\u975e\u5e38\u91cd\u8981\u7684\u6982\u5ff5\uff0cStarter\u76f8\u5f53\u4e8e\u6a21\u5757\uff0c\u5b83\u80fd\u5c06\u6a21\u5757\u6240\u9700\u7684\u4f9d\u8d56\u6574\u5408\u8d77\u6765\u5e76\u5bf9\u6a21\u5757\u5185\u7684Bean\u6839\u636e\u73af\u5883\uff08\u6761\u4ef6\uff09\u8fdb\u884c\u81ea\u52a8\u914d\u7f6e\u3002\u4f7f\u7528\u8005\u53ea\u9700\u8981\u4f9d\u8d56\u76f8\u5e94\u529f\u80fd\u7684Starter\uff0c\u65e0\u9700\u505a\u8fc7\u591a\u7684\u914d\u7f6e\u548c\u4f9d\u8d56\uff0cSpring Boot\u5c31\u80fd\u81ea\u52a8\u626b\u63cf\u5e76\u52a0\u8f7d\u76f8\u5e94\u7684\u6a21\u5757\u3002<\/p>\n<h4>\u5e38\u7528Starter<\/h4>\n<ul>\n<li>The Web Starter<\/li>\n<li>The Data JPA Starter<\/li>\n<li>mybatis-spring-boot-starter<\/li>\n<li>pagehelper-spring-boot-starter<\/li>\n<li>dubbo-spring-boot-starter<\/li>\n<li>The Mail Starter<\/li>\n<li>The Test Starter<\/li>\n<\/ul>\n<h4>\u5f00\u53d1Starter\u6b65\u9aa4<\/h4>\n<ul>\n<li>\u65b0\u5efaMaven\u9879\u76ee\uff0c\u5728\u9879\u76ee\u7684pom\u6587\u4ef6\u4e2d\u5b9a\u4e49\u4f7f\u7528\u7684\u4f9d\u8d56<\/li>\n<li>\u65b0\u5efa\u914d\u7f6e\u7c7b\uff0c\u5199\u597d\u914d\u7f6e\u9879\u548c\u9ed8\u8ba4\u7684\u914d\u7f6e\u503c\uff0c\u6307\u660e\u914d\u7f6e\u9879\u524d\u7f00<\/li>\n<li>\u65b0\u5efa\u81ea\u52a8\u88c5\u914d\u7c7b\uff0c\u4f7f\u7528<code>@Configuration<\/code>\u548c<code>@Bean<\/code>\u6765\u8fdb\u884c\u81ea\u52a8\u88c5\u914d<\/li>\n<li>\u65b0\u5efaspring.factories\u6587\u4ef6\uff0c\u6307\u5b9aStarter\u7684\u81ea\u52a8\u88c5\u914d\u7c7b<\/li>\n<\/ul>\n<h4>Starter\u5b9e\u4f8b<\/h4>\n<p>\uff081\uff09\u5b9a\u4e49\u5f00\u5173\u6ce8\u89e3<\/p>\n<pre><code class=\"language-java\">import java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n\/**\n * Enable AppBlog DevTool for spring boot application\n *\/\n@Target({ElementType.TYPE})\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\npublic @interface EnableAppBlogConfiguration {\n\n}<\/code><\/pre>\n<p>\uff082\uff09\u5b9a\u4e49\u7ea6\u5b9a\u914d\u7f6e\u5c5e\u6027<\/p>\n<pre><code class=\"language-java\">@ConfigurationProperties(prefix = &quot;spring.appblog&quot;)\npublic class AppBlogProperties {\n\n    private String name = null;\n\n}<\/code><\/pre>\n<p>\uff083\uff09\u5b9a\u4e49\u81ea\u52a8\u914d\u7f6e\u7c7b<\/p>\n<pre><code class=\"language-java\">import org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnBean;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnClass;\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport cn.appblog.annotation.EnableAppBlogConfiguration;\n\n@Configuration\n@ConditionalOnBean(annotation = EnableAppBlogConfiguration.class)\n@EnableConfigurationProperties(AppBlogProperties.class)\npublic class AppBlogConfiguration {\n    @Autowired\n    private AppBlogProperties properties;\n\n    @Bean\n    public Object createBean() {\n        System.out.println(&quot;AppBlog=&quot; + properties);\n        return new Object();\n    }\n}<\/code><\/pre>\n<p>\uff084\uff09\u5b9a\u4e49\u542f\u52a8Banner<\/p>\n<pre><code class=\"language-java\">package cn.appblog.boot.context.event;\n\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnBean;\nimport org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;\nimport org.springframework.context.ApplicationListener;\n\nimport cn.appblog.annotation.EnableAppBlogConfiguration;\n\n@ConditionalOnBean(annotation = EnableAppBlogConfiguration.class)\npublic class AppBlogBannerApplicationListener implements \n    ApplicationListener&lt;ApplicationEnvironmentPreparedEvent&gt;\n{\n    public static String appblogLogo =\n            &quot;  ################################################################################## \\n&quot; +\n            &quot;  ########          _                ____  _               ____ _   _       ######## \\n&quot; +\n            &quot;  ########         \/ \\   _ __  _ __ | __ )| | ___   __ _  \/ ___| \\ | |      ######## \\n&quot; +\n            &quot;  ########        \/ _ \\ | &#039;_ \\| &#039;_ \\|  _ \\| |\/ _ \\ \/ _` || |   |  \\| |      ######## \\n&quot; +\n            &quot;  ########       \/ ___ \\| |_) | |_) | |_) | | (_) | (_| || |___| |\\  |      ######## \\n&quot; +\n            &quot;  ########      \/_\/   \\_\\ .__\/| .__\/|____\/|_|\\___\/ \\__, (_)____|_| \\_|      ######## \\n&quot; +\n            &quot;  ########              |_|   |_|                  |___\/                    ######## \\n&quot; +\n            &quot;  ########                                                                  ######## \\n&quot; +\n            &quot;  ################################################################################## \\n&quot; +\n            &quot;                                                             \\n&quot; +\n            &quot;\\n&quot;;\n    public static String LINE_SEPARATOR = System.getProperty(&quot;line.separator&quot;);\n\n    @Override\n    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {\n        System.out.println(buildBannerText());\n    }\n\n    private String buildBannerText() {\n        StringBuilder bannerTextBuilder = new StringBuilder();\n        bannerTextBuilder.append(LINE_SEPARATOR).append(appblogLogo).append(&quot; :: AppBlog ::        (v1.0.0)&quot;)\n        .append(LINE_SEPARATOR);\n        return bannerTextBuilder.toString();\n    }\n}<\/code><\/pre>\n<p>\uff085\uff09\u5b9a\u4e49Starter\u914d\u7f6e\u6587\u4ef6<\/p>\n<p><code>resources\/META-INF\/spring.factories<\/code><\/p>\n<pre><code class=\"language-java\">org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\\ncn.appblog.boot.AppBlogConfiguration\n\norg.springframework.context.ApplicationListener=\\\ncn.appblog.boot.context.event.AppBlogBannerApplicationListener<\/code><\/pre>\n<p><code>resources\/META-INF\/spring.provides<\/code><\/p>\n<pre><code>provides: appblog-spring-boot-starter<\/code><\/pre>\n<p>\uff085\uff09\u5b89\u88c5\u5230\u672c\u5730Maven\u4ed3\u5e93<\/p>\n<pre><code>maven install<\/code><\/pre>\n<p>\uff086\uff09\u4f7f\u7528\u81ea\u5b9a\u4e49Starter<\/p>\n<pre><code class=\"language-xml\">&lt;dependency&gt;\n    &lt;groupId&gt;cn.appblog&lt;\/groupId&gt;\n    &lt;artifactId&gt;appblog-spring-boot-starter&lt;\/artifactId&gt;\n    &lt;version&gt;1.0.0-SNAPSHOT&lt;\/version&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n<pre><code class=\"language-java\">\/\/SpringBoot\u542f\u52a8\u6392\u9664RabbitMQ\u81ea\u52a8\u914d\u7f6e\n@SpringBootApplication(exclude={RabbitAutoConfiguration.class})\n@EnableAppBlogConfiguration\npublic class StarterApplication {\n    public static void main(String[] args) {\n        SpringApplication.run(StarterApplication.class, args);\n    }\n}<\/code><\/pre>\n<h3>Spring Boot Cli<\/h3>\n<h4>Spring Boot Cli\u5b89\u88c5<\/h4>\n<p><a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/repo.spring.io\/release\/org\/springframework\/boot\/spring-boot-cli\">https:\/\/repo.spring.io\/release\/org\/springframework\/boot\/spring-boot-cli<\/a><br \/>\n<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/repo.spring.io\/release\/org\/springframework\/boot\/spring-boot-cli\/2.3.3.RELEASE\/spring-boot-cli-2.3.3.RELEASE-bin.tar.gz\">https:\/\/repo.spring.io\/release\/org\/springframework\/boot\/spring-boot-cli\/2.3.3.RELEASE\/spring-boot-cli-2.3.3.RELEASE-bin.tar.gz<\/a><\/p>\n<p>\u4e0b\u8f7d\u89e3\u538b\u5e76\u8bbe\u7f6e\u73af\u5883\u53d8\u91cfpath<\/p>\n<pre><code class=\"language-bash\">spring --version\nspring help  \/\/\u83b7\u53d6\u5e2e\u52a9\nspring help &lt;command&gt;  \/\/\u67e5\u8be2\u67d0\u4e2a\u547d\u4ee4\u7684\u5e2e\u52a9\nspring init &lt;options&gt;  \/\/\u547d\u4ee4\u53c2\u6570\nspring init --list  \/\/\u5217\u51fa\u670d\u52a1\u5185\u5bb9<\/code><\/pre>\n<h4>\u4f7f\u7528\u5b9e\u4f8b<\/h4>\n<p>\uff081\uff09\u521b\u5efa\u652f\u6301 web,data-rest,jpa,jdbc,jooq,mail \u7684Spring Boot\u5de5\u7a0b<\/p>\n<pre><code class=\"language-bash\">spring init -dweb,data-rest,jpa,jdbc,jooq,mail demo<\/code><\/pre>\n<p>\uff082\uff09\u521b\u5efaMaven\u5de5\u7a0b<\/p>\n<pre><code class=\"language-bash\">spring init --build maven -j 1.8 -dweb,jpa,security -b 2.2.3.RELEASE -g cn.appblog -p jar myapp -a hello-boot -v 1.0.0-SNAPSHOT<\/code><\/pre>\n<p>\u4f7f\u7528\u547d\u4ee4\u542f\u52a8\u9879\u76ee<\/p>\n<pre><code class=\"language-bash\">mvn spring-boot:run<\/code><\/pre>\n<h4>\u4f7f\u7528 Spring Boot Cli \u8fd0\u884c\u5355\u72ec Groovy \u811a\u672c\u670d\u52a1<\/h4>\n<p>\uff081\uff09\u521b\u5efa hello.groovy<\/p>\n<pre><code class=\"language-java\">@RestController\npublic class HelloController {\n\n    @RequestMapping(value = &quot;\/hello&quot;)\n    public String sayHello() {\n        return &quot;Hello, Spring Boot!&quot;;\n    }\n}<\/code><\/pre>\n<p>\uff082\uff09\u4f7f\u7528 Spring Boot Cli \u8fd0\u884c<\/p>\n<pre><code class=\"language-bash\">spring run hello.groovy<\/code><\/pre>\n<h4>\u4f7f\u7528 Spring Boot Cli \u8fd0\u884c\u5355\u72ec Java \u811a\u672c\u670d\u52a1<\/h4>\n<p>\uff081\uff09\u521b\u5efa Hello.java<\/p>\n<pre><code class=\"language-java\">@RestController\npublic class HelloController {\n\n    @RequestMapping(value = &quot;\/hello&quot;)\n    public String sayHello() {\n        return &quot;Hello, Spring Boot!&quot;;\n    }\n}<\/code><\/pre>\n<p>\uff082\uff09\u4f7f\u7528 Spring Boot Cli \u8fd0\u884c<\/p>\n<pre><code class=\"language-bash\">spring run Hello.java<\/code><\/pre>\n<h3>Actuator<\/h3>\n<p>Actuator\u662fSpring Boot\u63d0\u4f9b\u7684\u5bf9\u5e94\u7528\u7cfb\u7edf\u7684\u81ea\u8eab\u548c\u76d1\u63a7\u7684\u96c6\u6210\u529f\u80fd\uff0c\u53ef\u4ee5\u5bf9\u5e94\u7528\u7cfb\u7edf\u8fdb\u884c\u914d\u7f6e\u67e5\u770b\u3001\u76f8\u5173\u529f\u80fd\u7edf\u8ba1\u3002<\/p>\n<p>Spring Boot\u96c6\u6210Actuator\uff0c\u5728pom.xml\u4e2d\u6dfb\u52a0Actuator\u4f9d\u8d56<\/p>\n<pre><code class=\"language-xml\">&lt;dependency&gt;\n    &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n    &lt;groupId&gt;spring-boot-starter-actuator&lt;\/groupId&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n<h4>\u914d\u7f6e\u4fe1\u606f<\/h4>\n<pre><code># actuator\u76d1\u63a7\u7aef\u53e3\nmanagement.server.port=8100\nmanagement.server.servlet.context-path=\/actuator\n# \u9ed8\u8ba4\u5f00\u542fhealth\u548cinfo\uff0c\u8bbe\u7f6e*\u5219\u5305\u62ec\u6240\u6709web\u7aef\u53e3\nmanagement.endpoints.web.exposure.include=*\n# \u6253\u5f00\u9ed8\u8ba4\u5173\u95ed\u7684shutdown\u7aef\u70b9\nmanagement.endpoint.shutdown.enabled=true<\/code><\/pre>\n<h4>\u901a\u8fc7http\u534f\u8bae\u8bbf\u95ee\u67e5\u770b\u5185\u90e8\u72b6\u6001<\/h4>\n<ul>\n<li><code>beans<\/code>\uff1a\u663e\u793a\u4e00\u4e2a\u5e94\u7528\u4e2d\u6240\u6709Spring Beans\u7684\u5b8c\u6574\u5217\u8868<\/li>\n<li><code>env<\/code>\uff1a\u663e\u793a\u6765\u81eaSpring\u7684<code>ConfigurationEnvironment<\/code>\u7684\u5c5e\u6027<\/li>\n<li><code>info<\/code>\uff1a\u663e\u793a\u4efb\u610f\u7684\u5e94\u7528\u4fe1\u606f<\/li>\n<li><code>metrics<\/code>\uff1a\u5c55\u793a\u5f53\u524d\u5e94\u7528\u7684metrics\u4fe1\u606f<\/li>\n<li><code>mappings<\/code>\uff1a\u663e\u793a\u4e00\u4e2a\u6240\u6709<code>@RequestMapping<\/code>\u8def\u5f84\u7684\u96c6\u5408\u5217\u8868<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Spring Boot\u7279\u70b9 \u9075\u5faa\u7ea6\u5b9a\u4f18\u4e8e\u914d\u7f6e\u7684\u539f\u5219 \u63d0\u4f9bstarter pom\uff0c\u9ad8\u6548\u5305\u7ba1\u7406 \u7b80\u5316\u914d\u7f6e\uff0c\u65e0\u9700xm [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[41],"tags":[],"class_list":["post-1757","post","type-post","status-publish","format-standard","hentry","category-spring-boot"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1757","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1757"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1757\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1757"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1757"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1757"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}