<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Vincent</title>
  
  
  <link href="http://yoursite.com/atom.xml" rel="self"/>
  
  <link href="http://yoursite.com/"/>
  <updated>2020-08-06T02:36:45.478Z</updated>
  <id>http://yoursite.com/</id>
  
  <author>
    <name>YeWenzhen</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>归并排序</title>
    <link href="http://yoursite.com/2020/08/06/Sort%EF%BC%9AMerge-Sort/"/>
    <id>http://yoursite.com/2020/08/06/Sort%EF%BC%9AMerge-Sort/</id>
    <published>2020-08-06T01:49:38.000Z</published>
    <updated>2020-08-06T02:36:45.478Z</updated>
    
    <content type="html"><![CDATA[<hr><h2 id="1-基本思想"><a href="#1-基本思想" class="headerlink" title="1.基本思想"></a>1.基本思想</h2><p>&#8195;&#8195;归并排序，是创建在归并操作上的一种有效的排序算法。算法是采用分治法（Divide and Conquer）的一个非常典型的应用，且各层分治递归可以同时进行。归并排序思路简单，速度仅次于快速排序，为稳定排序算法，一般用于对总体无序，但是各子项相对有序的数列。</p><a id="more"></a><hr><h2 id="2-图解"><a href="#2-图解" class="headerlink" title="2.图解"></a>2.图解</h2><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/Algorithm/Sort/Merge-Sort_1.jpg alt=归并排序 width="70%" ></center> <p> </p><hr><h2 id="3-实现逻辑"><a href="#3-实现逻辑" class="headerlink" title="3.实现逻辑"></a>3.实现逻辑</h2><p>迭代法<br>● 申请空间，使其大小为两个已经排序序列之和，该空间用来存放合并后的序列<br>● 设定两个指针，最初位置分别为两个已经排序序列的起始位置<br>● 比较两个指针所指向的元素，选择相对小的元素放入到合并空间，并移动指针到下一位置<br>● 重复步骤三直到某一指针到达序列尾<br>●  将另一序列剩下的所有元素直接复制到合并序列尾</p><p> </p>递归法● 将序列每相邻两个数字进行归并操作，形成floor(n/2)个序列，排序后每个序列包含两个元素<br>● 设定两个指针，最初位置分别为两个已经排序序列的起始位置<br>● 比较两个指针所指向的元素，选择相对小的元素放入到合并空间，并移动指针到下一位置<br>● 重复步骤三直到某一指针到达序列尾<br>●  将另一序列剩下的所有元素直接复制到合并序列尾<br><hr><h2 id="5-代码实现及详解"><a href="#5-代码实现及详解" class="headerlink" title="5.代码实现及详解"></a>5.代码实现及详解</h2><p>c++版本<br>迭代版</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; </span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">merge_sort</span><span class="params">(T arr[], <span class="keyword">int</span> len)</span> </span>&#123;  <span class="comment">//使用指针来交换的方式</span></span><br><span class="line">    <span class="comment">/*</span></span><br><span class="line"><span class="comment">     * 这道题超级考验数组传参时指针的知识</span></span><br><span class="line"><span class="comment">     * */</span></span><br><span class="line">    T *a = arr;</span><br><span class="line">    T *b = <span class="keyword">new</span> T[len];</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> seg = <span class="number">1</span>; seg &lt; len; seg += seg) &#123;    <span class="comment">//第一个循环，让最初始的一个容器开始进行融合，然后容器内容从1到2到4</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> start = <span class="number">0</span>; start &lt; len; start += seg + seg) &#123;   <span class="comment">//第二个循环，让每次相邻的两个容器进行排序</span></span><br><span class="line">            <span class="keyword">int</span> low = start, mid = <span class="built_in">min</span>(start + seg, len), high = <span class="built_in">min</span>(start + seg + seg, len);</span><br><span class="line">            <span class="comment">// 比较的容器：第一个容器是从low到mid，第二个容器是从mid到high，然后循环的时候会一直增加两个容器的内容，也就是seg</span></span><br><span class="line">            <span class="comment">//low ，mid，high都是每次比较容器的下标，所以要跟长度相比取最小，</span></span><br><span class="line">            <span class="comment">// 有可能最后一次容器比较的时候，只有一个容器了，且容器的大小不足所以mid最后取到len，也可能第二容器不够seg了，只能取到len了</span></span><br><span class="line"></span><br><span class="line">            <span class="keyword">int</span> k = low;  <span class="comment">//将本次比较的两个容器的起始头拿出来，在这里一个个赋值</span></span><br><span class="line">            <span class="keyword">int</span> start1 = low, end1 = mid;   <span class="comment">//将两个容器的起始头拿出来</span></span><br><span class="line">            <span class="keyword">int</span> start2 = mid, end2 = high;</span><br><span class="line">            <span class="comment">//这个三个while循环会把两个容器里在的值都拿出来</span></span><br><span class="line">            <span class="keyword">while</span> (start1 &lt; end1 &amp;&amp; start2 &lt; end2)  <span class="comment">//这个while循环会把两个容器里在的值都拿出来，直到其中一个容器都没有了</span></span><br><span class="line">                b[k++] = a[start1] &lt; a[start2] ? a[start1++] : a[start2++];</span><br><span class="line">            <span class="keyword">while</span> (start1 &lt; end1)    <span class="comment">//当第一个的循环已经做完之后，肯定有一个容器都没有了，但是判断是不是第一个容器还有东西，如果有东西就全部取出来</span></span><br><span class="line">                b[k++] = a[start1++];</span><br><span class="line">            <span class="keyword">while</span> (start2 &lt; end2)   <span class="comment">//当第一个的循环已经做完之后，肯定有一个容器都没有了，但是判断是不是第二个容器还有东西，如果有东西就全部取出来</span></span><br><span class="line">                b[k++] = a[start2++];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">         * 下面三句是数组作为传参的精髓，数组作为传参进来的时候，是变成数组第一位的指针arr，指针传进来后可以对指针所指向的内容进行修改，但是怎么改都不会影响到外面arr的地址</span></span><br><span class="line"><span class="comment">         * 所以一定每次处理的时候，都是要在arr地址上进行处理的，否则没有意义。【这是先验知识】</span></span><br><span class="line"><span class="comment">         * 然后函数一开始就new了个b，这个b的地址是跟arr的地址不一样的</span></span><br><span class="line"><span class="comment">         * 当b已经处理完后，要把b的东西给a，不能直接给，因为直接赋给a就是把b的地址给a，那么后续的处理时，arr的地址里内容还是没有变化呀</span></span><br><span class="line"><span class="comment">         * 所以需要把a的地址暂时存放起来，此时一开始a的地址也是arr的地址，将其存放起来，再把b的地址给a，也就是把b里面的内容给了啊，因为，后续要拿a里的内容进行处理呀</span></span><br><span class="line"><span class="comment">         * 此时做完第二句之后呢，a的地址和b的地址是一样的，再下一次for循环的时候，你不可以在同个地址上的内容上进行移动数值吧，那就出错了呀</span></span><br><span class="line"><span class="comment">         * 类似【2,1】,处理后得到结果肯定变成【1,1】了</span></span><br><span class="line"><span class="comment">         * 刚好又有个temp的地址可以使用，那就直接将temp的地址给b了，然后最后一次for循环处理后，b的地址还是在arr的地址之上</span></span><br><span class="line"><span class="comment">         * */</span></span><br><span class="line">        T *temp = a;</span><br><span class="line">        a = b;</span><br><span class="line">        b = temp;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/*</span></span><br><span class="line"><span class="comment">     * 虽然下面的if语句注释了，也可以正常得到结果，但是按照逻辑来说的话，上面的最后一次循环之后，a拿到的是b的地址，所以拿到的是b里面的内容，所以要进行</span></span><br><span class="line"><span class="comment">     * 一次判断，看a是不是的地址是不是还在arr的地址上，如果不是的话，但是此时b的地址肯定是在arr的地址上的（因为是temp一直在保存着arr的地址），所以只要把</span></span><br><span class="line"><span class="comment">     * a的内容给b，b的地址又是arr的地址，所以处理完成后，arr的地址上指的内容肯定就被修改好了</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">     * */</span></span><br><span class="line">    <span class="keyword">if</span> (a != arr) &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; len; i++)</span><br><span class="line">            b[i] = a[i];</span><br><span class="line">        b = a;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">delete</span>[] b;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>上述的代码更加考验数组和指针之间的知识多一点，下面还有一个版本，通过每次排序后进行赋值的方式来减少指针上的操作，更加简单易懂些</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="comment">// 整數或浮點數皆可使用,若要使用物件(class)時必須設定"小於"(&lt;)的運算子功能</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">merge_sort2</span><span class="params">(T arr[], <span class="keyword">int</span> len)</span> </span>&#123;  <span class="comment">//不使用指针交换的方式</span></span><br><span class="line">    <span class="comment">/*</span></span><br><span class="line"><span class="comment">     * 这道题超级考验数组传参时指针的知识</span></span><br><span class="line"><span class="comment">     * */</span></span><br><span class="line">    T *b = <span class="keyword">new</span> T[len];</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> seg = <span class="number">1</span>; seg &lt; len; seg += seg) &#123;    <span class="comment">//第一个循环，让最初始的一个容器开始进行融合，然后容器内容从1到2到4</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> start = <span class="number">0</span>; start &lt; len; start += seg + seg) &#123;   <span class="comment">//第二个循环，让每次相邻的两个容器进行排序</span></span><br><span class="line">            <span class="keyword">int</span> low = start, mid = <span class="built_in">min</span>(start + seg, len), high = <span class="built_in">min</span>(start + seg + seg, len);</span><br><span class="line">            <span class="comment">// 比较的容器：第一个容器是从low到mid，第二个容器是从mid到high，然后循环的时候会一直增加两个容器的内容，也就是seg</span></span><br><span class="line">            <span class="comment">//low ，mid，high都是每次比较容器的下标，所以要跟长度相比取最小，</span></span><br><span class="line">            <span class="comment">// 有可能最后一次容器比较的时候，只有一个容器了，且容器的大小不足所以mid最后取到len，也可能第二容器不够seg了，只能取到len了</span></span><br><span class="line"></span><br><span class="line">            <span class="keyword">int</span> k = low;  <span class="comment">//将本次比较的两个容器的起始头拿出来，在这里一个个赋值</span></span><br><span class="line">            <span class="keyword">int</span> start1 = low, end1 = mid;   <span class="comment">//将两个容器的起始头拿出来</span></span><br><span class="line">            <span class="keyword">int</span> start2 = mid, end2 = high;</span><br><span class="line">            <span class="comment">//这个三个while循环会把两个容器里在的值都拿出来</span></span><br><span class="line">            <span class="keyword">while</span> (start1 &lt; end1 &amp;&amp; start2 &lt; end2)  <span class="comment">//这个while循环会把两个容器里在的值都拿出来，直到其中一个容器都没有了</span></span><br><span class="line">                b[k++] = arr[start1] &lt; arr[start2] ? arr[start1++] : arr[start2++];</span><br><span class="line">            <span class="keyword">while</span> (start1 &lt; end1)    <span class="comment">//当第一个的循环已经做完之后，肯定有一个容器都没有了，但是判断是不是第一个容器还有东西，如果有东西就全部取出来</span></span><br><span class="line">                b[k++] = arr[start1++];</span><br><span class="line">            <span class="keyword">while</span> (start2 &lt; end2)   <span class="comment">//当第一个的循环已经做完之后，肯定有一个容器都没有了，但是判断是不是第二个容器还有东西，如果有东西就全部取出来</span></span><br><span class="line">                b[k++] = arr[start2++];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">//在这里不能直接将b直接给a，否则就是将b的地址给arr了，后续就再也无法在arr的地址上进行运算【这里讨论的arr是指实参】</span></span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;len;i++)</span><br><span class="line">        &#123;</span><br><span class="line">            arr[i] = b[i];</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">delete</span>[] b;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h2 id="5-分析"><a href="#5-分析" class="headerlink" title="5.分析"></a>5.分析</h2><p>如果有n个数，最多需要走n-1次遍历就可以排好<br>平均时间复杂度：O(nlogn)<br>最佳时间复杂度：O(n)<br>最差时间复杂度：O(nlogn)<br>空间复杂度：O(n)</p><hr><h2 id="6-参考"><a href="#6-参考" class="headerlink" title="6.参考"></a>6.参考</h2><p><a href="url">https://zhuanlan.zhihu.com/p/75678113</a><br><a href="url">https://zhuanlan.zhihu.com/p/124356219</a></p>]]></content>
    
    
    <summary type="html">&lt;hr&gt;
&lt;h2 id=&quot;1-基本思想&quot;&gt;&lt;a href=&quot;#1-基本思想&quot; class=&quot;headerlink&quot; title=&quot;1.基本思想&quot;&gt;&lt;/a&gt;1.基本思想&lt;/h2&gt;&lt;p&gt;&amp;#8195;&amp;#8195;归并排序，是创建在归并操作上的一种有效的排序算法。算法是采用分治法（Divide and Conquer）的一个非常典型的应用，且各层分治递归可以同时进行。归并排序思路简单，速度仅次于快速排序，为稳定排序算法，一般用于对总体无序，但是各子项相对有序的数列。&lt;/p&gt;</summary>
    
    
    
    <category term="Learning notes" scheme="http://yoursite.com/categories/Learning-notes/"/>
    
    <category term="Algorithm" scheme="http://yoursite.com/categories/Learning-notes/Algorithm/"/>
    
    <category term="Sort" scheme="http://yoursite.com/categories/Learning-notes/Algorithm/Sort/"/>
    
    
    <category term="Algorithm" scheme="http://yoursite.com/tags/Algorithm/"/>
    
  </entry>
  
  <entry>
    <title>冒泡排序</title>
    <link href="http://yoursite.com/2020/08/02/Sort%EF%BC%9ABubble-Sort/"/>
    <id>http://yoursite.com/2020/08/02/Sort%EF%BC%9ABubble-Sort/</id>
    <published>2020-08-02T09:40:54.000Z</published>
    <updated>2020-08-06T02:36:53.654Z</updated>
    
    <content type="html"><![CDATA[<hr><h2 id="1-基本思想"><a href="#1-基本思想" class="headerlink" title="1.基本思想"></a>1.基本思想</h2><p>&#8195;&#8195;冒泡排序是一种交换排序，核心是冒泡，把数组中最小的那个往上冒，冒的过程就是和他相邻的元素交换。</b><br>&#8195;&#8195;重复走访要排序的数列，通过两两比较相邻记录的排序码。排序过程中每次从后往前冒一个最小值，且每次能确定一个数在序列中的最终位置。若发生逆序，则交换；有俩种方式进行冒泡，一种是先把小的冒泡到前边去，另一种是把大的元素冒泡到后边。</p><a id="more"></a><hr><h2 id="2-图解"><a href="#2-图解" class="headerlink" title="2.图解"></a>2.图解</h2><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/Algorithm/Sort/bubble_sort_1.gif alt=冒泡排序 ></center> <p> </p><hr><h2 id="3-实现逻辑"><a href="#3-实现逻辑" class="headerlink" title="3.实现逻辑"></a>3.实现逻辑</h2><p>● 比较相邻的元素。如果第一个比第二个大，就交换他们两个。<br>● 对每一对相邻元素作同样的工作，从开始第一对到结尾的最后一对。,每次遍历都会当前遍历最大的数放在最后，<b>最后的元素应该会是最大的数。</b><br>● 所以上次遍历后产生的最大的数已经在后面了，所以不用再对其进行遍历了，所以每次两两交换的数量会变小（即减i）<br>● 持续每次对越来越少的元素重复上面的步骤，直到没有任何一对数字需要比较。</p><p> </p>通过两层循环控制：<br>● 第一个循环（外循环），负责把需要冒泡的那个数字排除在外；<br>● 第二个循环（内循环），负责两两比较交换。<br><hr><h2 id="4-举个栗子"><a href="#4-举个栗子" class="headerlink" title="4.举个栗子"></a>4.举个栗子</h2><p><b>假如有数组为[10,1,35,61,89,36,55]</b></p><p></p>第一趟排序：<br>第一次排序：10和1比较，10大于1，交换位置&#8195;&#8195;&#8195;&#8195;&#8198;[1,10,35,61,89,36,55]<br>第二次排序：10和35比较，10小于35，不交换位置&#8195;&#8195;[1,10,35,61,89,36,55]<br>第三次排序：35和61比较，35小于61，不交换位置&#8195;&#8195;[1,10,35,61,89,36,55]<br>第四次排序：61和89比较，61小于89，不交换位置&#8195;&#8195;[1,10,35,61,89,36,55]<br>第五次排序：89和36比较，89大于36，交换位置&#8195;&#8195;&#8195;[1,10,35,61,36,89,55]<br>第六次排序：89和55比较，89大于55，交换位置&#8195;&#8195;&#8195;[1,10,35,61,36,55,89]<br>第一趟总共进行了<b>六</b>次比较，排序结果：&#8195;&#8195;&#8195;&#8195;&#8195;&#8195;&#8194;[1,10,35,61,36,55,<b><font color="#FF0000">89</font></b>]<br><p></p><p></p>第二趟排序：<br>第一次排序：1和10比较，1小于10，不交换位置&#8195;&#8195;&#8195;&#8198;[1,10,35,61,36,55,89]<br>第二次排序：10和35比较，10小于35，不交换位置&#8195;&#8195;[1,10,35,61,36,55,89]<br>第三次排序：35和61比较，35小于61，不交换位置&#8195;&#8195;[1,10,35,61,36,55,89]<br>第四次排序：61和36比较，61大于36，交换位置&#8195;&#8195;&#8195;[1,10,35,36,61,55,89]<br>第五次排序：61和55比较，61大于55，交换位置&#8195;&#8195;&#8195;[1,10,35,36,55,61,89]<br>第二趟总共进行了<b>五</b>次比较，排序结果：&#8195;&#8195;&#8195;&#8195;&#8195;&#8195;&#8194;[1,10,35,36,55,<b><font color="#FF0000">61</font></b>,89]<br><p></p>按这样子的思路以此类推下去<br>假如数组有n个元素<p></p>第一个for循环<br>从上面的分析可以看到，第一趟遍历走了n次，把n个元素里最大的元素移到本次遍历的最后端<br>第二次遍历走了n-1次，把n-1个元素里最大的元素移到本次遍历的最后一端，<br>因为倒数第二次遍历，就可以把2元素里最大的移到本次遍历的最后一端，那么，就不用再遍历最后一个元素了，所以代码中第一个for循环只需要n-1；<br><p></p>第二个for循环<br>从上面的分析可以看到，第一趟遍历走了n次，把n个元素里最大的元素移到本次遍历的最后端<br>第二次遍历走了n-1次，把n-1个元素里最大的元素移到本次遍历的最后一端，<br>同样的，是不是每次遍历，都会少遍历一个元素呢，所以第二个for循环只需要n-i-1<hr><h2 id="5-代码实现及详解"><a href="#5-代码实现及详解" class="headerlink" title="5.代码实现及详解"></a>5.代码实现及详解</h2><p>c++版本</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">bubble_sort</span><span class="params">(<span class="keyword">int</span> arr[], <span class="keyword">int</span> len)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">int</span> i, j;  </span><br><span class="line">    <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; len<span class="number">-1</span>; i++)    <span class="comment">//总遍历的次数</span></span><br><span class="line">        <span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; len - <span class="number">1</span> -i; j++)  <span class="comment">//每次遍历需要走的个数</span></span><br><span class="line">            <span class="keyword">if</span> (arr[j] &gt; arr[j+<span class="number">1</span>])</span><br><span class="line">                swap(arr[j], arr[j+<span class="number">1</span>]);  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h2 id="6-分析"><a href="#6-分析" class="headerlink" title="6.分析"></a>6.分析</h2><p>如果有n个数，最多需要走n-1次遍历就可以排好<br>平均时间复杂度：O(n^2)<br>最佳时间复杂度：O(n)<br>最差时间复杂度：O(n^2)<br>空间复杂度：O(1)</p><hr><h2 id="7-参考"><a href="#7-参考" class="headerlink" title="7.参考"></a>7.参考</h2><p><a href="url">https://zhuanlan.zhihu.com/p/122284534</a><br><a href="url">https://www.cnblogs.com/bigdata-stone/p/10464243.html</a></p>]]></content>
    
    
    <summary type="html">&lt;hr&gt;
&lt;h2 id=&quot;1-基本思想&quot;&gt;&lt;a href=&quot;#1-基本思想&quot; class=&quot;headerlink&quot; title=&quot;1.基本思想&quot;&gt;&lt;/a&gt;1.基本思想&lt;/h2&gt;&lt;p&gt;&amp;#8195;&amp;#8195;冒泡排序是一种交换排序，核心是冒泡，把数组中最小的那个往上冒，冒的过程就是和他相邻的元素交换。&lt;/b&gt;&lt;br&gt;&amp;#8195;&amp;#8195;重复走访要排序的数列，通过两两比较相邻记录的排序码。排序过程中每次从后往前冒一个最小值，且每次能确定一个数在序列中的最终位置。若发生逆序，则交换；有俩种方式进行冒泡，一种是先把小的冒泡到前边去，另一种是把大的元素冒泡到后边。&lt;/p&gt;</summary>
    
    
    
    <category term="Learning notes" scheme="http://yoursite.com/categories/Learning-notes/"/>
    
    <category term="Algorithm" scheme="http://yoursite.com/categories/Learning-notes/Algorithm/"/>
    
    <category term="Sort" scheme="http://yoursite.com/categories/Learning-notes/Algorithm/Sort/"/>
    
    
    <category term="Algorithm" scheme="http://yoursite.com/tags/Algorithm/"/>
    
  </entry>
  
  <entry>
    <title>想见你</title>
    <link href="http://yoursite.com/2020/04/20/essay2/"/>
    <id>http://yoursite.com/2020/04/20/essay2/</id>
    <published>2020-04-20T01:58:04.000Z</published>
    <updated>2020-08-02T08:32:35.425Z</updated>
    
    <content type="html"><![CDATA[<center><br>《想见你》也太好看了吧，第一次通宵看剧了<br>最近一直在循环《Last Dance》<br>早上突然有个白目的想法<br>我一直循环着这首歌会不会也穿越到另一个人身上呢<br>笑死了</center>  <a id="more"></a><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/essay/essay2_2.jpg></center>  <p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/essay/essay2_3.jpg></center>  <p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/essay/essay2_4.jpg></center>  <p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/essay/essay2_5.jpg></center>  <p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/essay/essay2_6.jpg></center>  <p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/essay/essay2_7.jpg></center>  <p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/essay/essay2_8.jpg></center>  <p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/essay/essay2_9.jpg></center>  <p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/essay/essay2_10.jpg></center>  <p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/essay/essay2_11.jpg></center>  <p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/essay/essay2_12.jpg></center>  <p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/essay/essay2_13.jpg></center>  <p> </p>]]></content>
    
    
    <summary type="html">&lt;center&gt;
&lt;br&gt;《想见你》也太好看了吧，第一次通宵看剧了
&lt;br&gt;最近一直在循环《Last Dance》
&lt;br&gt;早上突然有个白目的想法
&lt;br&gt;我一直循环着这首歌会不会也穿越到另一个人身上呢
&lt;br&gt;笑死了
&lt;/center&gt;</summary>
    
    
    
    <category term="Essay" scheme="http://yoursite.com/categories/Essay/"/>
    
    
  </entry>
  
  <entry>
    <title>Ⅷ.Spring Boot与日志</title>
    <link href="http://yoursite.com/2020/04/15/LN-springboot8/"/>
    <id>http://yoursite.com/2020/04/15/LN-springboot8/</id>
    <published>2020-04-15T12:21:09.000Z</published>
    <updated>2020-05-07T07:30:38.577Z</updated>
    
    <content type="html"><![CDATA[<hr><p>&#8195;&#8195;日志的使用包括日志门面（抽象层）和日志实现。我们在使用的时候只需要调用日志门面即可。我们这里选用日志门面（抽象层）：slf4j和日志实现：logback来进行讲解。<b>在日志使用的时候不用考虑日志实现，只需要考虑日志的实现就可以了</b>。</p><hr><a id="more"></a><h2 id="1-日志门面slf4j与日志实现logback的使用"><a href="#1-日志门面slf4j与日志实现logback的使用" class="headerlink" title="1.日志门面slf4j与日志实现logback的使用"></a>1.日志门面slf4j与日志实现logback的使用</h2><p>在官网上，我们可以看到slf4j的使用，<a href="http://www.slf4j.org/manual.html">slf4j用户手册</a>。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> org.slf4j.Logger;</span><br><span class="line"><span class="keyword">import</span> org.slf4j.LoggerFactory;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">HelloWorld</span> </span>&#123;</span><br><span class="line">  <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;</span><br><span class="line">    Logger logger = LoggerFactory.getLogger(HelloWorld<span class="class">.<span class="keyword">class</span>)</span>;</span><br><span class="line">    <span class="comment">//geilongger是获取记录器的东西，获取类的信息</span></span><br><span class="line">    logger.info(<span class="string">"Hello World"</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>&#8195;&#8195;<b>slf4j和logback使用方法：</b><br>&#8195;&#8195;在使用slf4j和logback时，需要在系统中导入slf4j的jar包和logback的实现jar。</p><hr><h2 id="2-日志门面slf4j与其他日志实现方法的使用"><a href="#2-日志门面slf4j与其他日志实现方法的使用" class="headerlink" title="2.日志门面slf4j与其他日志实现方法的使用"></a>2.日志门面slf4j与其他日志实现方法的使用</h2><p>&#8195;&#8195;如果想使用日志门面slf4j与其他日志实现的时候，可以参考官方给出的这张图片。</p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot8_1.png alt=图片来源于slf4j的官方网站 width="70%"></center> <p> </p>&#8195;&#8195;从图中可以看到，第二行绿色方框所代表是为日志门面slf4j，只要是使用使用slf4j，日志门面就一定不会改变。在第三行里，蓝色为日志实现，由于一些日志实现出现的时候比较早，没有考虑到slf4j的出生，所有要使用灰色的日志实现需要淡绿色的适应层来适应。在第四行里，是早于slf4j出现的日志实现。<br>&#8195;&#8195;在第一列中，由于只使用日志门面而没有采用日志方法，则日志记录后输出到一个空的位置。正确的用法应该是第二列，日志使用日志门面后选择不同的日志实现进行输出。第三和第四咧都是使用早于slf4j出现的日志实现，所以需要有适应层的存在。第五列是使用slf4j提供的简单的日志实现。第六列是导入slf4j提供的没有什么操作的日志实现。<br>&#8195;&#8195;每一个日志实现都有不同的配置文件，slf4j根据不同日志实现进行不同的配置。<br><hr><h2 id="3-转换其他日志门面统一为slf4j的方法"><a href="#3-转换其他日志门面统一为slf4j的方法" class="headerlink" title="3.转换其他日志门面统一为slf4j的方法"></a>3.转换其他日志门面统一为slf4j的方法</h2><p>&#8195;&#8195;由于不同的框架在使用日志文件时采用不同的日志门面，类似spring使用commons-logging的日志门面，hibernate使用jboss-logging，mybatis使用不一样的日志门面，所有需要统一为一个指定的日志门面。<br>&#8195;&#8195;这里我们将不同的日志门面转化统一为slf4j。</p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot8_2.png alt=图片来源于slf4j的官方网站 width="70%"></center> <p> </p>&#8195;&#8195;<b>首先先注意左上角的子图，在左边的一个竖列是正常使用的slf4j和logback的方式。在右侧的那些方框是指使用了别的日志门面的方式。如果直接想替换成slf4j的方式的话，需要把依赖删除后，加入方框左下角提醒的jar，尚硅谷的雷丰阳老师称为偷天换日包，狸猫换太子包，也就是两个不同的包，前者有什么类，后者也有相同的类名，这样子就不会出错了。后者也有相同的类指向slf4j，再由slf4j指向日志实现。</b>&#8195;&#8195;<b>右上角的子图和左下角的子图都是在使用优先slf4j出现之前的日志实现时需要要做的事情，其实跟上者没什么区别，只是在日志门面与日志实现之间增加了一个适应层而已。</b><hr><h2 id="4-日志实战使用"><a href="#4-日志实战使用" class="headerlink" title="4.日志实战使用"></a>4.日志实战使用</h2><p>&#8195;&#8195;springboot的日志在项目创建的时候就已经自动配置好了。下列展示日常中常用的日志的使用方式。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.myblog.springboot;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.junit.Test;</span><br><span class="line"><span class="keyword">import</span> org.junit.runner.RunWith;</span><br><span class="line"><span class="keyword">import</span> org.slf4j.Logger;</span><br><span class="line"><span class="keyword">import</span> org.slf4j.LoggerFactory;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.test.context.SpringBootTest;</span><br><span class="line"><span class="keyword">import</span> org.springframework.test.context.junit4.SpringRunner;</span><br><span class="line"></span><br><span class="line"><span class="meta">@RunWith</span>(SpringRunner<span class="class">.<span class="keyword">class</span>)</span></span><br><span class="line"><span class="class">@<span class="title">SpringBootTest</span></span></span><br><span class="line"><span class="class"><span class="title">public</span> <span class="title">class</span> <span class="title">SpringBoot03LoggingApplicationTests</span> </span>&#123;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">Logger logger = LoggerFactory.getLogger(getClass());<span class="comment">//创建日志记录的记录器</span></span><br><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">contextLoads</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="comment">//System.out.println();</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//日志的级别；trace&lt;debug&lt;info&lt;warn&lt;error</span></span><br><span class="line">logger.trace(<span class="string">"我是trace日志..."</span>);<span class="comment">//跟踪信息时使用</span></span><br><span class="line">logger.debug(<span class="string">"我是debug日志..."</span>);<span class="comment">//调试时使用</span></span><br><span class="line">logger.info(<span class="string">"我是info日志..."</span>);<span class="comment">//自己定义的信息</span></span><br><span class="line">logger.warn(<span class="string">"我是warn日志..."</span>);<span class="comment">//警告信息</span></span><br><span class="line">logger.error(<span class="string">"我是error日志..."</span>);<span class="comment">//错误信息</span></span><br><span class="line">        <span class="comment">//SpringBoot默认使用的是info级别的【也称为root级别】，也就是在输出日志的时候，不会输出trace和debug级别的信息。</span></span><br><span class="line">        <span class="comment">//如果想设定级别，则可以在配置文件中使用logging.level来进行设置，类似设置我当前的包的级别为trace，则是如下所示</span></span><br><span class="line">        <span class="comment">//logging.level.com.myblog=trace</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">//技巧：通过设置输入日志的级别，系统就只显示这个级别以上的日志信息，就不会一条条去注释日志语句了。</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="5-日志的配置"><a href="#5-日志的配置" class="headerlink" title="5.日志的配置"></a>5.日志的配置</h2><p>&#8195;&#8195;上一节我们已经使用了日志的配置之一，也就是设置日志的输出等级，接下来说明logging.file和logging.path的区别，同样的，这两个的配置也是在配置文件中进行配置。</p><p> </p><table><thead><tr><th>logging.file</th><th>logging.path</th><th>Example</th><th>Description</th></tr></thead><tbody><tr><td>(none)</td><td>(none)</td><td></td><td>只在控制台输出</td></tr><tr><td>指定文件夹</td><td>(none)</td><td>my.log</td><td>输出日志到my.log文件</td></tr><tr><td>(none)</td><td>指定目录</td><td>my.log</td><td>输出到指定目录的spring.log【名字是官方定义的】文件中</td></tr></tbody></table><p> </p>&#8195;&#8195;如果logging.file和logging.path都没有指定的情况下，指定输出日志在工作台中。&#8195;&#8195;如果是使用logging.file不使用logging.path的话，会在工程路径下生成指定名字的log文件【例如logging.file=springboot.log】,也可以通过指定路径的方式进行生成【例如logging.file=E:/springboot.log】&#8195;&#8195;logging.file和logging.path是互相矛盾的，一般不混合使用，即使同时出现，也只会设置logging.file中的内容。logging.path里指定目录，而不考虑文件名，因为文件名是官方已经给出的名字【例如/spring/log,是指在工程所在的目录下新建spring文件夹，里再新建log文件夹，把日志文件写在spring.log并保存，注意/是绝对路径./是相对路径，在idea的工程里是看不到的，因为是工程同个目录下】]]></content>
    
    
    <summary type="html">&lt;hr&gt;
&lt;p&gt;&amp;#8195;&amp;#8195;日志的使用包括日志门面（抽象层）和日志实现。我们在使用的时候只需要调用日志门面即可。我们这里选用日志门面（抽象层）：slf4j和日志实现：logback来进行讲解。&lt;b&gt;在日志使用的时候不用考虑日志实现，只需要考虑日志的实现就可以了&lt;/b&gt;。&lt;/p&gt;
&lt;hr&gt;</summary>
    
    
    
    <category term="Learning notes" scheme="http://yoursite.com/categories/Learning-notes/"/>
    
    <category term="BackEnd" scheme="http://yoursite.com/categories/Learning-notes/BackEnd/"/>
    
    <category term="Spring Boot" scheme="http://yoursite.com/categories/Learning-notes/BackEnd/Spring-Boot/"/>
    
    
    <category term="Spring Boot" scheme="http://yoursite.com/tags/Spring-Boot/"/>
    
  </entry>
  
  <entry>
    <title>Ⅶ.配置文件的使用方式</title>
    <link href="http://yoursite.com/2020/04/14/LN-springboot7/"/>
    <id>http://yoursite.com/2020/04/14/LN-springboot7/</id>
    <published>2020-04-14T14:21:00.000Z</published>
    <updated>2020-04-16T06:05:41.384Z</updated>
    
    <content type="html"><![CDATA[<hr><h2 id="1-针对不同的应用场景使用不同的配置文件"><a href="#1-针对不同的应用场景使用不同的配置文件" class="headerlink" title="1.针对不同的应用场景使用不同的配置文件"></a>1.针对不同的应用场景使用不同的配置文件</h2><p>&#8195;&#8195;一个实际的工程可能在开发，测试，生产时的环境有所不同，这时可以使用profile来设置不同的配置文件。profile支持properties和yaml两种格式，不过yaml还特殊支持代码块的方式进行调用。</p><p> </p><p>&#8195;&#8195;<strong>在properties格式下或者yaml格式</strong><br>&#8195;&#8195;<strong>格式：application-(profies).properties/yml</strong><br>&#8195;&#8195;eg：application-dev.properties/yml【在开发环境下】<br>&#8195;&#8195;eg：application-prod.properties/yml【生产环境下】<a id="more"></a><br>&#8195;&#8195;ps：可以自己制定profile的标签</p><p> </p><p>&#8195;&#8195;如果在正常情况下，默认使用主配置文件application.properties文件，假如想使用application-dev.properties,就需要在主配置文件下使用spring.profiles.active的方式，这里是spring.profiles.active=dev,就可以使用配置文件application-dev.properties。<br>&#8195;&#8195;如图所示，我在resources文件夹下新建了application-dev.properties和application-prod.properties两个配置文件，并在主配置文件里使用了spring.profiles.active=dev来激活application-dev.properties</p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot7_1.png width="70%"></center> <p> </p>&#8195;&#8195;除此之外，yaml由于自己的语法的特性，还支持多文档块的方式。yaml可以使用---来切分不同的文档块。然后使用spring:profiles的方式来命名profile的标签，类似spring:profiles:dev，如果要激活哪个文档块，可以使用spring:profiles:activate的方式激活制定的profile。&#8195;&#8195;类似spring:profiles:activate:dev。&#8195;&#8195;如图所示，我制定了dev和prod的两个不同的profile，然后激活了prod这个profile。<p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot7_2.png width="70%"></center> <p> </p>&#8195;&#8195;激活方式除了在配置文件中使用的方法之外，还可以使用命令行的方式来激活，类似--spring.profiles.active=dev,命令行的方式会比配置文件中制定的优先级更高，也就是说，即使你在文件夹中制定了一种标签的配置文件，我在命令行运行的时候添加了激活方式，可以命令行的优先级大于前者，这方便了我们的调试运行工作。&#8195;&#8195;在开发过程中可以如图在Run/Debug Configuration的Program arguments下设置命令行，如--spring.profiles.active=dev，如图所示。<p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot7_3.png width="70%"></center> <p> </p>&#8195;&#8195;最后一种激活方式是使用虚拟机的方式同样在Run/Debug Configuration的VM options下设置 ，如-Dspring.profiles.active=dev。<p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot7_4.png width="70%"></center> <p> </p>&#8195;&#8195;<b>总结：不同的激活方式都是在检测到不同的profile标签的基础上去激活的，所有标签的制定不能有错。</b><hr><h2 id="2-配置文件的加载位置"><a href="#2-配置文件的加载位置" class="headerlink" title="2.配置文件的加载位置"></a>2.配置文件的加载位置</h2><p>&#8195;&#8195;spring boot启动的时候会在默认的位置扫描扫描application.properties或者application.yml进行配置。<br>&#8195;&#8195;默认位置扫描的优先顺序为：<br>&#8195;&#8195;&#8195;&#8195;file:./config/<br>&#8195;&#8195;&#8195;&#8195;file:./<br>&#8195;&#8195;&#8195;&#8195;classpath:/config/<br>&#8195;&#8195;&#8195;&#8195;classpath:/<br>&#8195;&#8195;如图所示，我在项目中新建了四个不同路径下的配置文件。</p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot7_5.png width="70%"></center> <p> </p>&#8195;&#8195;spring boot会按照优先顺序加载全部的配置的文件，相同的配置会按优先级覆盖，不同的配置会保存，这也就是<b>互补设置</b>。<hr><h2 id="3-添加外部的配置文件"><a href="#3-添加外部的配置文件" class="headerlink" title="3.添加外部的配置文件"></a>3.添加外部的配置文件</h2><p>&#8195;&#8195;同样的，我们也可以使用spring.config.location来添加外部的配置文件来作为默认的文件位置，不过这种方式是在项目打包之后，在运维时可能运用到的，用这种方式来加载项目以外的制定目录下的配置文件，同样的，这个时候加载进来的文件也会跟之前的文件形成<strong>互补设置</strong>。<br>&#8195;&#8195;<strong>此时指定的外部的配置文件优先级会更高一点。</strong><br>&#8195;&#8195;类似在运行jar包时使用java -jar ***.jar –spring.config.loction=C:/application.properties。</p><hr><h2 id="4-外部配置的加载顺序"><a href="#4-外部配置的加载顺序" class="headerlink" title="4.外部配置的加载顺序"></a>4.外部配置的加载顺序</h2><p>&#8195;&#8195;外部配置的加载在官网多达17种，这里只挑出常见的几种进行描述。<br>&#8195;&#8195;springboot会从下列的位置进行加载配置，优先级从高到低，所有的配置形成互补配置。</p><p> </p>&#8195;&#8195;<b>1.命令行参数</b><br>&#8195;&#8195;2.来自java:comp/env的JNDI属性<br>&#8195;&#8195;3.Java系统属性（System.getProperties()）<br>&#8195;&#8195;4.操作系统环境变量<br>&#8195;&#8195;5.RandomValuePropertySource配置的random.*属性值<br>&#8195;&#8195;<b>6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件</b><br>&#8195;&#8195;<b>7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件</b><br>&#8195;&#8195;<b>8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件</b><br>&#8195;&#8195;<b>9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件</b><br>&#8195;&#8195;10.@Configuration注解类上的@PropertySource<br>&#8195;&#8195;11.通过SpringApplication.setDefaultProperties指定的默认属性<br><p> </p><p>&#8195;&#8195;<strong>使用说明：</strong><br>&#8195;&#8195;1.在使用命令行参数时，为了节省书写配置文件的时间，可以直接命令行赋值。类似在运行jar包时使用java -jar ***.jar –server.port=8081 这样子可以直接设置端口号。使用格式：多个配置用空格分开； –配置项=值。<br>&#8195;&#8195;2.外部的配置文件放在当前路径下一起就可以被调用了。<br>&#8195;&#8195;3.第6到第9点可以总结为优先加载带profile标签的配置文件，再加载不带profile标签的文件，在这里面，由jar包外的配置文件到jar包内的配置文件进行扫描，<b>此处是指打包好的jar包所在目录下，放置在身旁的配置文件，如果有这个文件的话，jar运行后，可以先调用外部的配置文件互补覆盖jar包内的配置文件，有利于运维，</b>如图所示为jar包外的配置文件。<br></p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot7_6.png width="70%"></center> ]]></content>
    
    
    <summary type="html">&lt;hr&gt;
&lt;h2 id=&quot;1-针对不同的应用场景使用不同的配置文件&quot;&gt;&lt;a href=&quot;#1-针对不同的应用场景使用不同的配置文件&quot; class=&quot;headerlink&quot; title=&quot;1.针对不同的应用场景使用不同的配置文件&quot;&gt;&lt;/a&gt;1.针对不同的应用场景使用不同的配置文件&lt;/h2&gt;&lt;p&gt;&amp;#8195;&amp;#8195;一个实际的工程可能在开发，测试，生产时的环境有所不同，这时可以使用profile来设置不同的配置文件。profile支持properties和yaml两种格式，不过yaml还特殊支持代码块的方式进行调用。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&amp;#8195;&amp;#8195;&lt;strong&gt;在properties格式下或者yaml格式&lt;/strong&gt;&lt;br&gt;&amp;#8195;&amp;#8195;&lt;strong&gt;格式：application-(profies).properties/yml&lt;/strong&gt;&lt;br&gt;&amp;#8195;&amp;#8195;eg：application-dev.properties/yml【在开发环境下】&lt;br&gt;&amp;#8195;&amp;#8195;eg：application-prod.properties/yml【生产环境下】</summary>
    
    
    
    <category term="Learning notes" scheme="http://yoursite.com/categories/Learning-notes/"/>
    
    <category term="BackEnd" scheme="http://yoursite.com/categories/Learning-notes/BackEnd/"/>
    
    <category term="Spring Boot" scheme="http://yoursite.com/categories/Learning-notes/BackEnd/Spring-Boot/"/>
    
    
    <category term="Spring Boot" scheme="http://yoursite.com/tags/Spring-Boot/"/>
    
  </entry>
  
  <entry>
    <title>IV.加载指定的配置文件</title>
    <link href="http://yoursite.com/2020/04/14/LN-springboot6/"/>
    <id>http://yoursite.com/2020/04/14/LN-springboot6/</id>
    <published>2020-04-14T04:50:35.000Z</published>
    <updated>2020-04-15T13:04:46.211Z</updated>
    
    <content type="html"><![CDATA[<hr><p>&#8195;&#8195;上一章介绍了使用@ConfigurationProperties和@value，他们从全局配置文件中获取值并映射到实体类中所对应的属性里。但是全部默认值都放在全局配置变量中将非常臃肿功能，所以本章将介绍三种不同的方法来加载外部指定的配置文件来放在环境中。<br>&#8195;&#8195;<strong>再次强调，上一章讲的是从全局配置文件中获取值并映射到实体类中所对应的属性，这一章讲的是加载指定的配置文件来放在环境，两者不是冲突的关系，即你可以不加载外部指定的配置文件来放在文件中，直接使用@ConfigurationProperties或者@value映射，也可以加载外部指定的配置文件再来使用映射功能。</strong></p><hr><a id="more"></a><h2 id="1-PropertySource来加载指定的配置文件"><a href="#1-PropertySource来加载指定的配置文件" class="headerlink" title="1.PropertySource来加载指定的配置文件"></a>1.PropertySource来加载指定的配置文件</h2><p>&#8195;&#8195;在上一章的文件基础上，删除Person所对应的全局配置值后，在resources文件下右键新建【new file】person.properties文件，如下所示。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">person.last-name=路飞</span><br><span class="line">person.age=18</span><br><span class="line">person.birth=2017/12/15</span><br><span class="line">person.boss=false</span><br><span class="line">person.maps.k1=v1</span><br><span class="line">person.maps.k2=14</span><br><span class="line">person.lists=a,b,c</span><br><span class="line">person.dog.name=$&#123;person.hello:hello&#125;_dog</span><br><span class="line">person.dog.age=15</span><br></pre></td></tr></table></figure><p>&#8195;&#8195;将原来的Person.java文件添加为使用PropertySource的方式来加载外部的配置文件。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.myblog.springboot.bean;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.PropertySource;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@PropertySource</span>(value = &#123;<span class="string">"classpath:person.properties"</span>&#125;)<span class="comment">// 告诉springboot加载内路径下的person.properties的内容，并把他们绑定都到Person对象中</span></span><br><span class="line"><span class="comment">//加载指定的属性文件的配置到环境中</span></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="meta">@ConfigurationProperties</span>(prefix = <span class="string">"person"</span>)</span><br><span class="line"><span class="comment">//主配置中的属性映射到实体类中所对应的属性</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Person</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> String lastName;</span><br><span class="line">    <span class="keyword">private</span> Integer age;</span><br><span class="line">    <span class="keyword">private</span> Boolean boss;</span><br><span class="line">    <span class="keyword">private</span> Date birth;</span><br><span class="line">    <span class="keyword">private</span> Map&lt;String,Object&gt; maps;</span><br><span class="line">    <span class="keyword">private</span> List&lt;Object&gt; lists;</span><br><span class="line">    <span class="keyword">private</span> Dog dog;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> String <span class="title">toString</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">"Person&#123;"</span> +</span><br><span class="line">                <span class="string">"lastName='"</span> + lastName + <span class="string">'\''</span> +</span><br><span class="line">                <span class="string">", age="</span> + age +</span><br><span class="line">                <span class="string">", boss="</span> + boss +</span><br><span class="line">                <span class="string">", birth="</span> + birth +</span><br><span class="line">                <span class="string">", maps="</span> + maps +</span><br><span class="line">                <span class="string">", lists="</span> + lists +</span><br><span class="line">                <span class="string">", dog="</span> + dog +</span><br><span class="line">                <span class="string">'&#125;'</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> String <span class="title">getLastName</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> lastName;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setLastName</span><span class="params">(String lastName)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.lastName = lastName;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> Integer <span class="title">getAge</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> age;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setAge</span><span class="params">(Integer age)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.age = age;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> Boolean <span class="title">getBoss</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> boss;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setBoss</span><span class="params">(Boolean boss)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.boss = boss;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> Date <span class="title">getBirth</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> birth;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setBirth</span><span class="params">(Date birth)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.birth = birth;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> Map&lt;String, Object&gt; <span class="title">getMaps</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> maps;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setMaps</span><span class="params">(Map&lt;String, Object&gt; maps)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.maps = maps;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> List&lt;Object&gt; <span class="title">getLists</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> lists;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setLists</span><span class="params">(List&lt;Object&gt; lists)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.lists = lists;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> Dog <span class="title">getDog</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> dog;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setDog</span><span class="params">(Dog dog)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.dog = dog;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>&#8195;&#8195;最后的效果如下。</p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot6_1.png width="70%"></center>  <hr><h2 id="2-ImportResource来加载spring的配置文件"><a href="#2-ImportResource来加载spring的配置文件" class="headerlink" title="2.ImportResource来加载spring的配置文件"></a>2.ImportResource来加载spring的配置文件</h2><p>&#8195;&#8195;Spring Boot里面没有Spring的配置文件，我们自己编写的配置文件，也不能自动识别。如果需要导入spring的配置文件，则需要ImportResource来加载spring的配置文件。想让Spring的配置文件生效且加载进来，需要@ImportResource标注在一个配置类【这里我的主配置类是】上。<br>&#8195;&#8195;右键com.myblog.springboot02新建java class，取名为service.HelloService文件<br>&#8195;&#8195;右键resources如图输入beans来新建beans.xml文件<strong>注意不能输入beans.xml,不然就变成beans.xmll.xml</strong>。</p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot6_1.png width="70%"></center>  <p> </p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">beans</span> <span class="attr">xmlns</span>=<span class="string">"http://www.springframework.org/schema/beans"</span></span></span><br><span class="line"><span class="tag">       <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span></span><br><span class="line"><span class="tag">       <span class="attr">xsi:schemaLocation</span>=<span class="string">"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"helloService"</span> <span class="attr">class</span>=<span class="string">"com.myblog.springboot02.service.HelloService"</span>&gt;</span><span class="tag">&lt;/<span class="name">bean</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">beans</span>&gt;</span></span><br></pre></td></tr></table></figure>&#8195;&#8195;在测试类中添加下列代码。<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Autowired</span></span><br><span class="line">ApplicationContext ioc;  <span class="comment">//注入ioc容器</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">testHelloService</span><span class="params">()</span></span>&#123;   <span class="comment">// 测试容器中有无helloService</span></span><br><span class="line">    <span class="keyword">boolean</span> b = ioc.containsBean(<span class="string">"helloService"</span>);</span><br><span class="line">    System.out.println(b);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>&#8195;&#8195;运行testHelloService，但是显示结果告诉我们不能直接导入spring的配置文件，所以需要使用我们上面说的ImportResource。</p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot6_2.png width="70%"></center>  <p> </p>&#8195;&#8195;想让Spring的配置文件生效且加载进来，需要@ImportResource标注在一个配置类【这里我的主配置类是】上。<p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot6_3.png width="70%"></center>  <p> </p>&#8195;&#8195;可以看到spring的配置文件beans.xml被成功导入。<p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot6_4.png width="70%"></center>  <p> </p>&#8195;&#8195;由于考虑到导入spring配置文件时需要新建再导入，很麻烦，所以springboot提供了一种快捷的导入方式：推荐使用全注解的方式。具体的实现方式是：<br>&#8195;&#8195;@Configuration：指明当前类是一个配置类；就是来替代之前的Spring配置文件【可以新建一个配置类或者使用主配置类】。<br>&#8195;&#8195;@Bean：将方法的返回值添加到容器中；容器中这个组件默认的id就是方法名。<br>&#8195;&#8195;<b>记得在测试这段的时候，需要把上次使用的@ImportResource(locations = {"classpath:beans.xml"})注释掉,</b>在com.myblog.springboot文件夹下新建配置类，类名为config.MyAppConfig。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.myblog.springboot02.config;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.myblog.springboot02.service.HelloService;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Configuration</span>  <span class="comment">//指明当前类是一个配置类；就是来替代之前的Spring配置文件</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MyAppConfig</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Bean</span>  <span class="comment">//将方法的返回值添加到容器中；容器中这个组件默认的id就是方法名</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> HelloService <span class="title">helloService</span><span class="params">()</span></span>&#123;     <span class="comment">//容器中这个组件默认的id为helloService</span></span><br><span class="line">        System.out.println(<span class="string">"配置类@Bean给容器中添加组件了，运行成功！"</span>);</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> HelloService();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>&#8195;&#8195;从运行结果可以知道这种方法是可行且方便的。  </p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot6_5.png width="70%"></center>  <hr><h2 id="3-总结"><a href="#3-总结" class="headerlink" title="3.总结"></a>3.总结</h2><p>&#8195;&#8195;● @PropertySource来加载指定的配置文件<br>&#8195;&#8195;● @ImportResource来加载spring的配置文件<br>&#8195;&#8195;● @Configuration和@Bean组合来加载spring的配置文件【官方推荐】</p>]]></content>
    
    
    <summary type="html">&lt;hr&gt;
&lt;p&gt;&amp;#8195;&amp;#8195;上一章介绍了使用@ConfigurationProperties和@value，他们从全局配置文件中获取值并映射到实体类中所对应的属性里。但是全部默认值都放在全局配置变量中将非常臃肿功能，所以本章将介绍三种不同的方法来加载外部指定的配置文件来放在环境中。&lt;br&gt;&amp;#8195;&amp;#8195;&lt;strong&gt;再次强调，上一章讲的是从全局配置文件中获取值并映射到实体类中所对应的属性，这一章讲的是加载指定的配置文件来放在环境，两者不是冲突的关系，即你可以不加载外部指定的配置文件来放在文件中，直接使用@ConfigurationProperties或者@value映射，也可以加载外部指定的配置文件再来使用映射功能。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;</summary>
    
    
    
    <category term="Learning notes" scheme="http://yoursite.com/categories/Learning-notes/"/>
    
    <category term="BackEnd" scheme="http://yoursite.com/categories/Learning-notes/BackEnd/"/>
    
    <category term="Spring Boot" scheme="http://yoursite.com/categories/Learning-notes/BackEnd/Spring-Boot/"/>
    
    
    <category term="Spring Boot" scheme="http://yoursite.com/tags/Spring-Boot/"/>
    
  </entry>
  
  <entry>
    <title>V.配置文件值注入与自动单元测试</title>
    <link href="http://yoursite.com/2020/04/14/LN-springboot5/"/>
    <id>http://yoursite.com/2020/04/14/LN-springboot5/</id>
    <published>2020-04-14T01:40:18.000Z</published>
    <updated>2020-04-16T14:40:20.226Z</updated>
    
    <content type="html"><![CDATA[<hr><p>&#8195;&#8195;配置文件有分yaml格式和properties和两种格式，可以作为配置文件值注入。映射值的方式有ConfigurationProperties和value两种。同时本章介绍要介绍idea在springboot上的自动单元测试。</p><hr><a id="more"></a><h2 id="1-yaml格式注入文件值"><a href="#1-yaml格式注入文件值" class="headerlink" title="1.yaml格式注入文件值"></a>1.yaml格式注入文件值</h2><p>&#8195;&#8195;新建两个java文件(分别为Person和Dog)，并将yaml的值映射到到java文件属性中。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//Person.java</span></span><br><span class="line"><span class="keyword">package</span> com.myblog.springboot.bean;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.context.properties.ConfigurationProperties;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 将配置文件中配置的每一个属性的值，映射到这个组件中</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@ConfigurationProperties</span>：告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定；</span></span><br><span class="line"><span class="comment"> *      prefix = "person"：配置文件中哪个下面的所有属性进行一一映射</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * 只有这个组件是容器中的组件，才能容器提供的<span class="doctag">@ConfigurationProperties</span>功能；</span></span><br><span class="line"><span class="comment"> *  <span class="doctag">@ConfigurationProperties</span>(prefix = "person")默认从全局配置文件中获取值；</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="meta">@ConfigurationProperties</span>(prefix = <span class="string">"person"</span>)</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Person</span> </span>&#123;</span><br><span class="line">    <span class="keyword">private</span> String lastName;</span><br><span class="line">    <span class="keyword">private</span> Integer age;</span><br><span class="line">    <span class="keyword">private</span> Boolean boss;</span><br><span class="line">    <span class="keyword">private</span> Date birth;</span><br><span class="line">    <span class="keyword">private</span> Map&lt;String,Object&gt; maps;</span><br><span class="line">    <span class="keyword">private</span> List&lt;Object&gt; lists;</span><br><span class="line">    <span class="keyword">private</span> Dog dog;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> String <span class="title">toString</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">"Person&#123;"</span> +</span><br><span class="line">                <span class="string">"lastName='"</span> + lastName + <span class="string">'\''</span> +</span><br><span class="line">                <span class="string">", age="</span> + age +</span><br><span class="line">                <span class="string">", boss="</span> + boss +</span><br><span class="line">                <span class="string">", birth="</span> + birth +</span><br><span class="line">                <span class="string">", maps="</span> + maps +</span><br><span class="line">                <span class="string">", lists="</span> + lists +</span><br><span class="line">                <span class="string">", dog="</span> + dog +</span><br><span class="line">                <span class="string">'&#125;'</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> String <span class="title">getLastName</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> lastName;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setLastName</span><span class="params">(String lastName)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.lastName = lastName;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> Integer <span class="title">getAge</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> age;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setAge</span><span class="params">(Integer age)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.age = age;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> Boolean <span class="title">getBoss</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> boss;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setBoss</span><span class="params">(Boolean boss)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.boss = boss;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> Date <span class="title">getBirth</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> birth;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setBirth</span><span class="params">(Date birth)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.birth = birth;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> Map&lt;String, Object&gt; <span class="title">getMaps</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> maps;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setMaps</span><span class="params">(Map&lt;String, Object&gt; maps)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.maps = maps;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> List&lt;Object&gt; <span class="title">getLists</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> lists;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setLists</span><span class="params">(List&lt;Object&gt; lists)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.lists = lists;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> Dog <span class="title">getDog</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> dog;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setDog</span><span class="params">(Dog dog)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.dog = dog;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//Dog.java</span></span><br><span class="line"><span class="keyword">package</span> com.myblog.springboot.bean;</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Dog</span> </span>&#123;</span><br><span class="line">    <span class="keyword">private</span> String name;</span><br><span class="line">    <span class="keyword">private</span> Integer age;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> String <span class="title">toString</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">"Dog&#123;"</span> +</span><br><span class="line">                <span class="string">"name='"</span> + name + <span class="string">'\''</span> +</span><br><span class="line">                <span class="string">", age="</span> + age +</span><br><span class="line">                <span class="string">'&#125;'</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> String <span class="title">getName</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> name;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setName</span><span class="params">(String name)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.name = name;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> Integer <span class="title">getAge</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> age;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setAge</span><span class="params">(Integer age)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.age = age;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>&#8195;&#8195;右键resources并新建File，输入文件名为application.yml【这里也可以使用yaml作为结尾】。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">person:</span></span><br><span class="line">    <span class="attr">lastName:</span> <span class="string">zhangsan</span></span><br><span class="line">    <span class="attr">age:</span> <span class="number">18</span></span><br><span class="line">    <span class="attr">boss:</span> <span class="literal">false</span></span><br><span class="line">    <span class="attr">birth:</span> <span class="number">2017</span><span class="string">/12/12</span></span><br><span class="line">    <span class="attr">maps:</span></span><br><span class="line">      <span class="attr">k1:</span> <span class="string">v1</span></span><br><span class="line">      <span class="attr">k2:</span> <span class="string">v2</span></span><br><span class="line">    <span class="attr">lists:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">lisi</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">zhaoliu</span></span><br><span class="line">    <span class="attr">Dog:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">小狗</span></span><br><span class="line">      <span class="attr">age:</span> <span class="number">2</span></span><br></pre></td></tr></table></figure><p>&#8195;&#8195;如果在写yaml文件时需要提醒注释，则需要添加下列的依赖。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!--导入配置文件处理器，配置文件进行绑定就会有提示--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-configuration-processor<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">optional</span>&gt;</span>true<span class="tag">&lt;/<span class="name">optional</span>&gt;</span></span><br></pre></td></tr></table></figure><p>&#8195;&#8195;这里提供我的poml文件。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">project</span> <span class="attr">xmlns</span>=<span class="string">"http://maven.apache.org/POM/4.0.0"</span> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xsi:schemaLocation</span>=<span class="string">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">modelVersion</span>&gt;</span>4.0.0<span class="tag">&lt;/<span class="name">modelVersion</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">groupId</span>&gt;</span>com.atguigu<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-02-config<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">version</span>&gt;</span>0.0.1-SNAPSHOT<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">packaging</span>&gt;</span>jar<span class="tag">&lt;/<span class="name">packaging</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">name</span>&gt;</span>spring-boot-02-config<span class="tag">&lt;/<span class="name">name</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">description</span>&gt;</span>Demo project for Spring Boot<span class="tag">&lt;/<span class="name">description</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">parent</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-starter-parent<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">version</span>&gt;</span>1.5.9.RELEASE<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">relativePath</span>/&gt;</span> <span class="comment">&lt;!-- lookup parent from repository --&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">parent</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">properties</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">project.build.sourceEncoding</span>&gt;</span>UTF-8<span class="tag">&lt;/<span class="name">project.build.sourceEncoding</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">project.reporting.outputEncoding</span>&gt;</span>UTF-8<span class="tag">&lt;/<span class="name">project.reporting.outputEncoding</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">java.version</span>&gt;</span>1.8<span class="tag">&lt;/<span class="name">java.version</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">properties</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">dependencies</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-starter-web<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!--导入配置文件处理器，配置文件进行绑定就会有提示--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-configuration-processor<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">optional</span>&gt;</span>true<span class="tag">&lt;/<span class="name">optional</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-starter-test<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">scope</span>&gt;</span>test<span class="tag">&lt;/<span class="name">scope</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.junit.jupiter<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>junit-jupiter-api<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">version</span>&gt;</span>RELEASE<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.testng<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>testng<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">version</span>&gt;</span>RELEASE<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependencies</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">build</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">plugins</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">plugin</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-maven-plugin<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">plugin</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">plugins</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">build</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">repositories</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">repository</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">id</span>&gt;</span>maven-ali<span class="tag">&lt;/<span class="name">id</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">url</span>&gt;</span>http://maven.aliyun.com/nexus/content/repositories/central<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">releases</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">enabled</span>&gt;</span>true<span class="tag">&lt;/<span class="name">enabled</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">releases</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">snapshots</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">enabled</span>&gt;</span>true<span class="tag">&lt;/<span class="name">enabled</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">updatePolicy</span>&gt;</span>always<span class="tag">&lt;/<span class="name">updatePolicy</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">checksumPolicy</span>&gt;</span>fail<span class="tag">&lt;/<span class="name">checksumPolicy</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">snapshots</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">repository</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">repositories</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">project</span>&gt;</span></span><br></pre></td></tr></table></figure><hr><h2 id="2-自动单元测试"><a href="#2-自动单元测试" class="headerlink" title="2.自动单元测试"></a>2.自动单元测试</h2><p>&#8195;&#8195;在src文件夹下的test有提供一个自动单元测试的文件，在我这里是SpingBoot02ConfigApplication<br>Tests.java。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.myblog.springboot;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.myblog.springboot.bean.Person;</span><br><span class="line"><span class="keyword">import</span> org.junit.Test;</span><br><span class="line"><span class="keyword">import</span> org.junit.runner.RunWith;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.test.context.SpringBootTest;</span><br><span class="line"><span class="keyword">import</span> org.springframework.test.context.junit4.SpringRunner;</span><br><span class="line"></span><br><span class="line"><span class="meta">@RunWith</span>(SpringRunner<span class="class">.<span class="keyword">class</span>)   //用<span class="title">SpringRunner</span>驱动器来跑</span></span><br><span class="line"><span class="class">@<span class="title">SpringBootTest</span>    //<span class="title">SpringBoot</span>单元测试</span>;</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">SpringBoot02ConfigApplicationTests</span> </span>&#123;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Autowired</span></span><br><span class="line">Person person;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">contextLoads</span><span class="params">()</span> </span>&#123;</span><br><span class="line">System.out.println(person);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>&#8195;&#8195;然后使用@Test旁边的运行符就可以运行自动单元测试，此时会将yaml里的值赋值给自动单元测试模块，效果如下。</p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot5_1.png width="70%"></center>  <p> </p><hr><h2 id="3-properties格式注入文件值"><a href="#3-properties格式注入文件值" class="headerlink" title="3.properties格式注入文件值"></a>3.properties格式注入文件值</h2><p>&#8195;&#8195;使用上面的文件并将创建的yaml文件删除后，使用properties文件。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">person.last-name=张三$&#123;random.uuid&#125;</span><br><span class="line">person.age=$&#123;random.int&#125;</span><br><span class="line">person.birth=2017/12/15</span><br><span class="line">person.boss=false</span><br><span class="line">person.maps.k1=v1</span><br><span class="line">person.maps.k2=14</span><br><span class="line">person.lists=a,b,c</span><br><span class="line">person.dog.name=$&#123;person.hello:hello&#125;_dog</span><br><span class="line">person.dog.age=15</span><br></pre></td></tr></table></figure><p>&#8195;&#8195;按照前面说明的自动单元测试的方法运行后，可以同样看到文件值的注入，如下所示。</p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot5_2.png width="70%"></center>  <p> </p>&#8195;&#8195;但是我们可以注意到中文出现乱码的情况，需要将properties设置由原本的GBK设置为UTF-8，同时勾选转换为ascill。【在setting中输入file enc可以找到】，记得设置完，要回去把properties文件的乱码修改正常。再运行程序就可以正常运行了。<b>【GBK设置是每次项目生成时都会设置的，如果要使用中文，则需要在项目生成后就进行设置，以免出错】。</b><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot5_3.png width="70%"></center>  <p> </p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot5_4.png width="70%"></center>  <p> </p><hr><h2 id="4-不同的文件获取值的方式"><a href="#4-不同的文件获取值的方式" class="headerlink" title="4.不同的文件获取值的方式"></a>4.不同的文件获取值的方式</h2><p>&#8195;&#8195;上述所用的文件获取值的方式都是基于ConfigurationProperties方式，这里还有一种value的方式可以获取。<br>&#8195;&#8195;value可以获取字面值；从环境变量、配置文件中获取值；还可以获取spring运算值。<br>&#8195;&#8195;将第1小节中的Person.java文件修改为如下。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.myblog.springboot.bean;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.context.properties.ConfigurationProperties;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Value;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Person</span> </span>&#123;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * &lt;bean class="Person"&gt;</span></span><br><span class="line"><span class="comment">     *      &lt;property name="lastName" value="字面量/$&#123;key&#125;从环境变量、配置文件中获取值/#&#123;SpEL&#125;spring的表达式语言"&gt;&lt;/property&gt;</span></span><br><span class="line"><span class="comment">     * &lt;bean/&gt;</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Value</span>(<span class="string">"$&#123;person.last-name&#125;"</span>)   <span class="comment">//从环境变量、配置文件中获取值</span></span><br><span class="line">    <span class="keyword">private</span> String lastName;</span><br><span class="line">    <span class="meta">@Value</span>(<span class="string">"#&#123;11*2&#125;"</span>)    <span class="comment">//表达式文件</span></span><br><span class="line">    <span class="keyword">private</span> Integer age;</span><br><span class="line">    <span class="meta">@Value</span>(<span class="string">"true"</span>)     <span class="comment">//字面量</span></span><br><span class="line">    <span class="keyword">private</span> Boolean boss;</span><br><span class="line">    <span class="keyword">private</span> Date birth;</span><br><span class="line">    <span class="keyword">private</span> Map&lt;String,Object&gt; maps;</span><br><span class="line">    <span class="keyword">private</span> List&lt;Object&gt; lists;</span><br><span class="line">    <span class="keyword">private</span> Dog dog;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> String <span class="title">toString</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">"Person&#123;"</span> +</span><br><span class="line">                <span class="string">"lastName='"</span> + lastName + <span class="string">'\''</span> +</span><br><span class="line">                <span class="string">", age="</span> + age +</span><br><span class="line">                <span class="string">", boss="</span> + boss +</span><br><span class="line">                <span class="string">", birth="</span> + birth +</span><br><span class="line">                <span class="string">", maps="</span> + maps +</span><br><span class="line">                <span class="string">", lists="</span> + lists +</span><br><span class="line">                <span class="string">", dog="</span> + dog +</span><br><span class="line">                <span class="string">'&#125;'</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> String <span class="title">getLastName</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> lastName;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setLastName</span><span class="params">(String lastName)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.lastName = lastName;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> Integer <span class="title">getAge</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> age;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setAge</span><span class="params">(Integer age)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.age = age;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> Boolean <span class="title">getBoss</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> boss;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setBoss</span><span class="params">(Boolean boss)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.boss = boss;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> Date <span class="title">getBirth</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> birth;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setBirth</span><span class="params">(Date birth)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.birth = birth;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> Map&lt;String, Object&gt; <span class="title">getMaps</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> maps;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setMaps</span><span class="params">(Map&lt;String, Object&gt; maps)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.maps = maps;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> List&lt;Object&gt; <span class="title">getLists</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> lists;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setLists</span><span class="params">(List&lt;Object&gt; lists)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.lists = lists;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> Dog <span class="title">getDog</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> dog;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setDog</span><span class="params">(Dog dog)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.dog = dog;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>&#8195;&#8195;此时运行自动测试单元，可以得到如设置值一样的效果。</p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot5_5.png width="70%"></center>  <p> </p>&#8195;&#8195;我们可以注意到ConfigurationProperties和value两种方式的不同之处。<p> </p><table><thead><tr><th></th><th>ConfigurationProperties</th><th>value</th></tr></thead><tbody><tr><td>功能</td><td>批量注入配置文件中的属性</td><td>一个个指定</td></tr><tr><td>松散绑定（松散语法）</td><td>支持</td><td>不支持</td></tr><tr><td>SpEL</td><td>不支持</td><td>支持</td></tr><tr><td>JSR303数据校验</td><td>支持</td><td>不支持</td></tr><tr><td>复杂类型封装</td><td>支持</td><td>不支持</td></tr></tbody></table><p> </p><p>&#8195;&#8195;如果说，我们只是在某个业务逻辑中需要获取一下配置文件中的某项值，使用@Value。<br>&#8195;&#8195;如果说，我们专门编写了一个javaBean来和配置文件进行映射，我们就直接使用@ConfigurationProperties。<br>&#8195;&#8195;<b>这里需要清楚的是ConfigurationProperties和value都是在主配置中的属性映射到实体类中所对应的属性里，下一章才会讲怎么从其他地方加载指定的属性文件的配置到环境中。</b></p>]]></content>
    
    
    <summary type="html">&lt;hr&gt;
&lt;p&gt;&amp;#8195;&amp;#8195;配置文件有分yaml格式和properties和两种格式，可以作为配置文件值注入。映射值的方式有ConfigurationProperties和value两种。同时本章介绍要介绍idea在springboot上的自动单元测试。&lt;/p&gt;
&lt;hr&gt;</summary>
    
    
    
    <category term="Learning notes" scheme="http://yoursite.com/categories/Learning-notes/"/>
    
    <category term="BackEnd" scheme="http://yoursite.com/categories/Learning-notes/BackEnd/"/>
    
    <category term="Spring Boot" scheme="http://yoursite.com/categories/Learning-notes/BackEnd/Spring-Boot/"/>
    
    
    <category term="Spring Boot" scheme="http://yoursite.com/tags/Spring-Boot/"/>
    
  </entry>
  
  <entry>
    <title>IV.导入他人项目的注意事项</title>
    <link href="http://yoursite.com/2020/04/14/LN-springboot4/"/>
    <id>http://yoursite.com/2020/04/14/LN-springboot4/</id>
    <published>2020-04-14T01:25:48.000Z</published>
    <updated>2020-04-17T04:05:06.457Z</updated>
    
    <content type="html"><![CDATA[<hr><p>&#8195;&#8195;有时候我们在网上看到优秀的关于springboot的开源代码，就想着下载下来跑一下尝试一下效果，但是发现项目各处都出现了报错的地方，本节想要尽可能提供一些解决方法。</p><hr><a id="more"></a><h2 id="1-项目配置"><a href="#1-项目配置" class="headerlink" title="1.项目配置"></a>1.项目配置</h2><p>&#8195;&#8195;点击file进入setting-&gt;Build,Execution,Deployment-&gt;Build Tools-&gt;Maven，设置成属于自己原来的值。</p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot4_1.png width="70%"></center>  <p> </p>&#8195;&#8195;使用快捷键ctrl+shift+Alt+s进入下列页面，设置为自己原来的值（+号添加文件），如果这里不知道怎么设置，可以打开原来自己的项目看相关值。<p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot4_2.png width="70%"></center>  <p> </p><hr><h2 id="2-Exrernal-Libraries出现库没下载下来"><a href="#2-Exrernal-Libraries出现库没下载下来" class="headerlink" title="2.Exrernal Libraries出现库没下载下来"></a>2.Exrernal Libraries出现库没下载下来</h2><p>&#8195;&#8195;这种情况是很大程度是因为网络问题，添加一个阿里的镜像就可以自动下载了。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">repositories</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">repository</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">id</span>&gt;</span>maven-ali<span class="tag">&lt;/<span class="name">id</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">url</span>&gt;</span>http://maven.aliyun.com/nexus/content/repositories/central<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">releases</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">enabled</span>&gt;</span>true<span class="tag">&lt;/<span class="name">enabled</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">releases</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">snapshots</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">enabled</span>&gt;</span>true<span class="tag">&lt;/<span class="name">enabled</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">updatePolicy</span>&gt;</span>always<span class="tag">&lt;/<span class="name">updatePolicy</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">checksumPolicy</span>&gt;</span>fail<span class="tag">&lt;/<span class="name">checksumPolicy</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">snapshots</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">repository</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">repositories</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="3-假如出现cannot-resolve-symbol的问题"><a href="#3-假如出现cannot-resolve-symbol的问题" class="headerlink" title="3.假如出现cannot resolve symbol的问题"></a>3.假如出现cannot resolve symbol的问题</h2><p>&#8195;&#8195;在前面的工作已经做完的情况下，还出现此类问题时，将鼠标移至问题上，依照提示进行操作。</p>]]></content>
    
    
    <summary type="html">&lt;hr&gt;
&lt;p&gt;&amp;#8195;&amp;#8195;有时候我们在网上看到优秀的关于springboot的开源代码，就想着下载下来跑一下尝试一下效果，但是发现项目各处都出现了报错的地方，本节想要尽可能提供一些解决方法。&lt;/p&gt;
&lt;hr&gt;</summary>
    
    
    
    <category term="Learning notes" scheme="http://yoursite.com/categories/Learning-notes/"/>
    
    <category term="BackEnd" scheme="http://yoursite.com/categories/Learning-notes/BackEnd/"/>
    
    <category term="Spring Boot" scheme="http://yoursite.com/categories/Learning-notes/BackEnd/Spring-Boot/"/>
    
    
    <category term="Spring Boot" scheme="http://yoursite.com/tags/Spring-Boot/"/>
    
  </entry>
  
  <entry>
    <title>Ⅲ.使用Spring Initializer快速创建Spring Boot项目</title>
    <link href="http://yoursite.com/2020/04/11/LN-springboot3/"/>
    <id>http://yoursite.com/2020/04/11/LN-springboot3/</id>
    <published>2020-04-11T13:16:09.000Z</published>
    <updated>2020-04-11T13:50:17.051Z</updated>
    
    <content type="html"><![CDATA[<hr><p>&#8195;&#8195;相对对前面的spring boot创建hello world的应用的方法，spring boot还支持使用Spring Initializer快速创建Spring Boot项目，会比前者更快捷方便很多。<br>&#8195;&#8195;下面使用IDEA来使用Spring Initializer这个功能，当然官方推荐的STS也支持这个功能。  </p><hr><a id="more"></a><h2 id="1-使用Spring-Initializer创建新的工程"><a href="#1-使用Spring-Initializer创建新的工程" class="headerlink" title="1.使用Spring Initializer创建新的工程"></a>1.使用Spring Initializer创建新的工程</h2><p>&#8195;&#8195;在创建之前需要联网，保证可以自动下载所需要的包。<br>&#8195;&#8195;同样的new一个project，不过选择Spring Initializer。</p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot3_1.png alt="配置一" width="70%"></center>  <p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot3_2.png alt="配置二" width="70%"></center>  <p> </p>&#8195;&#8195;假如版本不同的时候，类似我看其他的教程是使用1.5.9的版本，这里可以提供的选择里面已经没有1.5.9的版本了，但是没有关系，找好依赖就可以了，类似我这里需要一个web的功能，但是左边的Dependencies中并没有这个选项，可以直接搜依赖，然后点击后，右边就会出现你已经选择的依赖。完成后，下一个页面也继续不用改变，直接选择Finish，完成系统的搭建。<p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot3_3.png width="70%"></center>  <p> </p>&#8195;&#8195;类似前面的上一篇文章我是看视频教程里使用1.5.9版本的spring boot，我这里是使用了2.2.6版本，由于之前下载的本地仓库里没有2.2.6的依赖，就会报错，而且没不主动给你下载，是因为网络问题，所以可以<b>参考前一篇文章使用阿里的镜像，然后系统会自动帮你下载好所需要的依赖。</b> 软件右下角有软件下载的进度。下载好之后，会在工程下面的External Libraries下会出现除了jdk1.8（博主使用的版本）以外的maven的依赖包。这个时候检查maven project的视图，会发现Plugins和Dependencies都是没有红色波浪线的，是个良好的工程。<p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot3_4.png width="70%"></center>  <p> </p>&#8195;&#8195;经过第一次使用springboot的1.59版本和2.2.6版本，你可以在本地的仓库看到两个不同的版本都被下载下来了。<p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot3_5.png width="70%"></center><hr><h2 id="2-编写业务逻辑"><a href="#2-编写业务逻辑" class="headerlink" title="2.编写业务逻辑"></a>2.编写业务逻辑</h2><p>&#8195;&#8195;通过点击main下的java文件夹可以发现，工程所需要的主程序已经自动有了，所以接下来只需专注在业务逻辑即可，同样同样按上一章的教程添加controller文件。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.myblog.springboot.controller;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Controller;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.ResponseBody;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RestController;</span><br><span class="line"></span><br><span class="line"><span class="comment">//这个类的所有方法返回的数据直接写给浏览器，（如果是对象转为json数据）</span></span><br><span class="line"><span class="comment">/*@ResponseBody        // 因为很多方法都可能要用到，所以放到前面，说明这这个类的所有方法返回的数据直接写给浏览器，（如果是对象转为json数据）</span></span><br><span class="line"><span class="comment">@Controller*/</span></span><br><span class="line"><span class="meta">@RestController</span>   <span class="comment">//在spring4.2版本以后，已经包含了 ResponseBody 和Controllers</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">HelloController</span> </span>&#123;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="meta">@RequestMapping</span>(<span class="string">"/hello"</span>)  <span class="comment">//收到hello请求</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> String <span class="title">hello</span><span class="params">()</span></span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">"hello world quick!"</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// RESTAPI的方式</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>&#8195;&#8195;按照上一章的方法启动程序，可以看到是正常可以使用的。</p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot3_5.png width="70%"></center><hr><h2 id="3-resources的目录结构说明"><a href="#3-resources的目录结构说明" class="headerlink" title="3.resources的目录结构说明"></a>3.resources的目录结构说明</h2><p>&#8195;&#8195;● static：保存所有的静态资源；类似 js css images。<br>&#8195;&#8195;● templates：保存所有的模板页面（Spring Boot默认jar包使用嵌入式的Tomcat，默认不支持JSP页面）；可以使用模板引擎（freemarker、thymeleaf）。<br>&#8195;&#8195;● application.properties：Spring Boot应用的配置文件；可以修改spring boot自动配置的默认值；类似修改其端口，可以使用server.port=8082,修改后，端口要使用8082才能使用了。</p><p> </p>&#8195;&#8195;ps：application.properties和application.yaml都可以是配置文件，可以在resources下新建application.yaml进行配置。]]></content>
    
    
    <summary type="html">&lt;hr&gt;
&lt;p&gt;&amp;#8195;&amp;#8195;相对对前面的spring boot创建hello world的应用的方法，spring boot还支持使用Spring Initializer快速创建Spring Boot项目，会比前者更快捷方便很多。&lt;br&gt;&amp;#8195;&amp;#8195;下面使用IDEA来使用Spring Initializer这个功能，当然官方推荐的STS也支持这个功能。  &lt;/p&gt;
&lt;hr&gt;</summary>
    
    
    
    <category term="Learning notes" scheme="http://yoursite.com/categories/Learning-notes/"/>
    
    <category term="BackEnd" scheme="http://yoursite.com/categories/Learning-notes/BackEnd/"/>
    
    <category term="Spring Boot" scheme="http://yoursite.com/categories/Learning-notes/BackEnd/Spring-Boot/"/>
    
    
    <category term="Spring Boot" scheme="http://yoursite.com/tags/Spring-Boot/"/>
    
  </entry>
  
  <entry>
    <title>Ⅱ.Spring Boot Hello World!</title>
    <link href="http://yoursite.com/2020/04/10/LN_springboot2/"/>
    <id>http://yoursite.com/2020/04/10/LN_springboot2/</id>
    <published>2020-04-10T05:51:38.000Z</published>
    <updated>2020-04-17T06:57:02.397Z</updated>
    
    <content type="html"><![CDATA[<hr><h2 id="1-实现功能"><a href="#1-实现功能" class="headerlink" title="1. 实现功能　　"></a>1. 实现功能　　</h2><p>&#8195;&#8195;当浏览器发送hello请求，服务器接受请求并处理，响应Hello World字符串。  </p><hr><a id="more"></a><h2 id="2-创建maven工程并导入Spring-Boot相关依赖"><a href="#2-创建maven工程并导入Spring-Boot相关依赖" class="headerlink" title="2. 创建maven工程并导入Spring Boot相关依赖"></a>2. 创建maven工程并导入Spring Boot相关依赖</h2><p>&#8195;&#8195;如图所示，项目名要跟模块名一样，不然可能会报错。</p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot2_1.png alt="设置maven工程指向jdk1.8" width="70%"></center>  <p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot2_2.png.png alt="记得打钩的地方要一样" width="70%"></center>  <p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot2_3.png alt="记得打钩的地方要一样" width="70%"></center><p> </p>&#8195;&#8195;当工程里出现如下图所示时，选<b>Enable Auto-Import</b>，在写入相关依赖后会自动下载依赖包。  <p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot2_4.png width="40%"></center><hr><h2 id="3-导入spring-boot相关的依赖"><a href="#3-导入spring-boot相关的依赖" class="headerlink" title="3.导入spring boot相关的依赖"></a>3.导入spring boot相关的依赖</h2><p>&#8195;&#8195;在springboot官网找到依赖并添加到工程里，复制粘贴后要检查会不会因为<strong>语法</strong>问题报错。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">parent</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-starter-parent<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">version</span>&gt;</span>1.5.9.RELEASE<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">parent</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependencies</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-starter-web<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependencies</span>&gt;</span></span><br></pre></td></tr></table></figure><p>&#8195;&#8195;大概的效果是这样子：  </p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot2_5.png width="70%"></center><p> </p>&#8195;&#8195;加入依赖后要看一下应用下面的<b>External Libraries</b>下除看jdk的依赖包以为还有没有其他包，如Maven开头的包，如果没有的话，需要添加<b>阿里的镜像</b>来进行下载，当你添加完后，会发现系统自动进行下载，这个时候需要等待一段时间。<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">repositories</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">repository</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">id</span>&gt;</span>maven-ali<span class="tag">&lt;/<span class="name">id</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">url</span>&gt;</span>http://maven.aliyun.com/nexus/content/repositories/central<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">releases</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">enabled</span>&gt;</span>true<span class="tag">&lt;/<span class="name">enabled</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">releases</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">snapshots</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">enabled</span>&gt;</span>true<span class="tag">&lt;/<span class="name">enabled</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">updatePolicy</span>&gt;</span>always<span class="tag">&lt;/<span class="name">updatePolicy</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">checksumPolicy</span>&gt;</span>fail<span class="tag">&lt;/<span class="name">checksumPolicy</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">snapshots</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">repository</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">repositories</span>&gt;</span></span><br></pre></td></tr></table></figure><hr><h2 id="4-编写主程序"><a href="#4-编写主程序" class="headerlink" title="4.编写主程序"></a>4.编写主程序</h2><p>&#8195;&#8195;在main下的java下添加新类，我这里添加为com.myblog.HelloWorldMainAppliction。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.myblog;</span><br><span class="line">    <span class="keyword">import</span> org.springframework.boot.SpringApplication;</span><br><span class="line">    <span class="keyword">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> *  <span class="doctag">@SpringBootApplication</span> 标注一个主程序类，说明这是一个Spring Boot应用</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@SpringBootApplication</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">HelloWorldMainApplication</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 启动Spring应用</span></span><br><span class="line">        SpringApplication.run(HelloWorldMainApplication<span class="class">.<span class="keyword">class</span>,<span class="title">args</span>)</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h2 id="5-编写Controller与Service"><a href="#5-编写Controller与Service" class="headerlink" title="5.编写Controller与Service"></a>5.编写Controller与Service</h2><p>&#8195;&#8195;在com.myblog下添加新类，我这里添加为com.myblog.HelloWorldMainAppliction。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.myblog.controller;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Controller;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.ResponseBody;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Controller</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">HelloController</span> </span>&#123;</span><br><span class="line">    <span class="meta">@ResponseBody</span></span><br><span class="line">    <span class="meta">@RequestMapping</span>(<span class="string">"/hello"</span>)   <span class="comment">//接受来自浏览器的hello请求</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> String <span class="title">hello</span><span class="params">()</span></span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">"Hello World!"</span>;  <span class="comment">//返回 Hello World!</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h2 id="6-测试"><a href="#6-测试" class="headerlink" title="6.测试"></a>6.测试</h2><p>&#8195;&#8195;由于spring boot的便捷性，不像ssm中需要整合服务器比较复杂的运行，spring boot在主程序中直接运行main方法就可以了[主函数隔壁的三角符号]。<br>&#8195;&#8195;运行后从终端中显示的 TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 可以知道，端口是8080。<br>&#8195;&#8195;在浏览器中输入localhost：8080后会出现错误，那是因为没有给输入 所以没有返回，在输入localhost：8080/hello时，便成功运行!  </p><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot2_6.png width="70%"></center><hr><h2 id="7-部署"><a href="#7-部署" class="headerlink" title="7.部署"></a>7.部署</h2><p>&#8195;&#8195;由于spring boot的特性，使用在pom.xml文件中插入下列语句可以使用插件将应用打包为一个<strong>可执行的jar包</strong>，从而无需在目标服务器安装tomcat环境等繁琐的东西。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">build</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">plugins</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">plugin</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-maven-plugin<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">plugin</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">plugins</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">build</span>&gt;</span></span><br></pre></td></tr></table></figure><p>&#8195;&#8195;假如IDEA的右边没有附着<strong>maven project的视图</strong>时，可以在setting-&gt;Appearance&amp;Behavio-&gt;Appearance中，勾中Show tool window bars,如图所示：</p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot2_7.png width="70%"></center><p> </p>&#8195;&#8195;或者可以直接点击左下角，类似小电脑的图标，也是可以直接呼出<b>右边栏</b>。<br>&#8195;&#8195;选择maven project，准备生成<b>jar包</b>，假如在打开时看到应用报错，指向Plugins文件夹时（Plugins文件夹下有红色波浪线），因为第一次生成的时候Plugins、Dependengcies这些包还没下载，打开应用下的Lifecycle目录，并双击package，会生成jar包，不过第一次生成前会帮你下载好Plugins这些包,如果还是报红，打开本地仓库的文件夹（在上一节IDEA的设置中有提到），类似如果是org.apache.maven.plugins:maven-clean-plugin:2.6.1报错，则找到文件夹\repository\org\apache\maven\plugins\maven-clean-plugin\2.6.1下删除以LastUPdated为结尾的文件，依次类推删除类似其他报错的文件，然后右击应用选择maven重新reimport，如下图所示。这个过程有点久，取决于你的网速。<b>如果重复删除还是会出现lastUpdated的文件，就退出软件，再载入一次。</b><b>如果实在不行的话，运行maven中生命周期中的clean，这个时候会帮你重新下载一次，不过正常也是下载不了的，你可以按着提醒的错误来找到下载的网址，本地下载jar包后放进去</b><p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot2_8.png width="70%"></center><p> </p>&#8195;&#8195;生成的jar在target文件夹下。<br>&#8195;&#8195;可以在终端使用使用java -jar的指令进行调试，效果如下，同样使用测试环节的方法可以看到Hello World！<p> </p><center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot2_9.png width="70%"></center>]]></content>
    
    
    <summary type="html">&lt;hr&gt;
&lt;h2 id=&quot;1-实现功能&quot;&gt;&lt;a href=&quot;#1-实现功能&quot; class=&quot;headerlink&quot; title=&quot;1. 实现功能　　&quot;&gt;&lt;/a&gt;1. 实现功能　　&lt;/h2&gt;&lt;p&gt;&amp;#8195;&amp;#8195;当浏览器发送hello请求，服务器接受请求并处理，响应Hello World字符串。  &lt;/p&gt;
&lt;hr&gt;</summary>
    
    
    
    <category term="Learning notes" scheme="http://yoursite.com/categories/Learning-notes/"/>
    
    <category term="BackEnd" scheme="http://yoursite.com/categories/Learning-notes/BackEnd/"/>
    
    <category term="Spring Boot" scheme="http://yoursite.com/categories/Learning-notes/BackEnd/Spring-Boot/"/>
    
    
    <category term="Spring Boot" scheme="http://yoursite.com/tags/Spring-Boot/"/>
    
  </entry>
  
  <entry>
    <title>Ⅰ.spring Boot简介与环境搭建</title>
    <link href="http://yoursite.com/2020/04/10/LN_springboot1/"/>
    <id>http://yoursite.com/2020/04/10/LN_springboot1/</id>
    <published>2020-04-10T01:43:13.000Z</published>
    <updated>2020-04-15T10:10:09.550Z</updated>
    
    <content type="html"><![CDATA[<hr><h2 id="1-Spring-Boot简介"><a href="#1-Spring-Boot简介" class="headerlink" title="1. Spring Boot简介　　"></a>1. Spring Boot简介　　</h2><p>&#8195;&#8195;● 简化Spring应用开发的一个框架；<br>&#8195;&#8195;● 整个Spring技术栈的一个大整合；<br>&#8195;&#8195;● J2EE开发的一站式解决方案; </p><hr><a id="more"></a><h2 id="2-使用的环境"><a href="#2-使用的环境" class="headerlink" title="2. 使用的环境"></a>2. 使用的环境</h2><p>&#8195;&#8195;● java version “1.8.0_221”<br>&#8195;&#8195;● Apache Maven 3.3.9<br>&#8195;&#8195;● IntelliJ IDEA 2017.2.2 x64<br>&#8195;&#8195;● SpringBoot 1.5.9. RELEASE</p><hr><h2 id="3-Maven设置"><a href="#3-Maven设置" class="headerlink" title="3. Maven设置"></a>3. Maven设置</h2><p>　给maven 的settings.xml配置文件的profiles标签添加设置语句，将其指向jak-1.8。  </p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">  <span class="tag">&lt;<span class="name">profile</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">id</span>&gt;</span>jdk-1.8<span class="tag">&lt;/<span class="name">id</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">activation</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">activeByDefault</span>&gt;</span>true<span class="tag">&lt;/<span class="name">activeByDefault</span>&gt;</span>&gt;</span><br><span class="line">      <span class="tag">&lt;<span class="name">jdk</span>&gt;</span>1.8<span class="tag">&lt;/<span class="name">jdk</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">activation</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">properties</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">maven.compiler.source</span>&gt;</span>1.8<span class="tag">&lt;/<span class="name">maven.compiler.source</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">maven.compiler.target</span>&gt;</span>1.8<span class="tag">&lt;/<span class="name">maven.compiler.target</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">maven.compiler.compilerVersion</span>&gt;</span>1.8<span class="tag">&lt;/<span class="name">maven.compiler.compilerVersion</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">properties</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">profile</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">profiles</span>&gt;</span></span><br></pre></td></tr></table></figure><hr><h2 id="4-IDEA设置"><a href="#4-IDEA设置" class="headerlink" title="4. IDEA设置"></a>4. IDEA设置</h2><h3 id="将Maven配置进去IDEA中"><a href="#将Maven配置进去IDEA中" class="headerlink" title="将Maven配置进去IDEA中"></a>将Maven配置进去IDEA中</h3><p>&#8195;&#8195;1.在初始页的Configure中选取Settings选项<br>&#8195;&#8195;2.设置如图所示</p></center><img src=https://vincent-blog-photo.oss-cn-shenzhen.aliyuncs.com/LN_springboot/springboot1_1.png></center>]]></content>
    
    
    <summary type="html">&lt;hr&gt;
&lt;h2 id=&quot;1-Spring-Boot简介&quot;&gt;&lt;a href=&quot;#1-Spring-Boot简介&quot; class=&quot;headerlink&quot; title=&quot;1. Spring Boot简介　　&quot;&gt;&lt;/a&gt;1. Spring Boot简介　　&lt;/h2&gt;&lt;p&gt;&amp;#8195;&amp;#8195;● 简化Spring应用开发的一个框架；&lt;br&gt;&amp;#8195;&amp;#8195;● 整个Spring技术栈的一个大整合；&lt;br&gt;&amp;#8195;&amp;#8195;● J2EE开发的一站式解决方案; &lt;/p&gt;
&lt;hr&gt;</summary>
    
    
    
    <category term="Learning notes" scheme="http://yoursite.com/categories/Learning-notes/"/>
    
    <category term="BackEnd" scheme="http://yoursite.com/categories/Learning-notes/BackEnd/"/>
    
    <category term="Spring Boot" scheme="http://yoursite.com/categories/Learning-notes/BackEnd/Spring-Boot/"/>
    
    
    <category term="Spring Boot" scheme="http://yoursite.com/tags/Spring-Boot/"/>
    
  </entry>
  
  <entry>
    <title>First Blog</title>
    <link href="http://yoursite.com/2020/04/09/essay1/"/>
    <id>http://yoursite.com/2020/04/09/essay1/</id>
    <published>2020-04-09T03:08:55.000Z</published>
    <updated>2020-08-02T08:32:36.365Z</updated>
    
    <content type="html"><![CDATA[<center><br>今天，我开始写人生中的第一篇博客  <br>不知道自己会不会半途而废  <br>不知道有多少人能看到这个主页  <br>但不管如何，开始了，就坚持吧  <br>现在的我是深大研二的一个学生  <br>希望能记录我的点点滴滴  <br><br>多年以后的你在做什么呢，旁边又有谁陪伴着你呢<br>家人的人都怎样了  <br>你还坚守初心做一个好人吗  <br>希望未来你能幸福下去  </center>  <center><br>ps:图片拍摄于2020年4月9号傍晚，看到落日下,<br>一家人在空地玩耍，在天空飘满泡泡的时候。</center>]]></content>
    
    
      
      
    <summary type="html">&lt;center&gt;
&lt;br&gt;今天，我开始写人生中的第一篇博客  
&lt;br&gt;不知道自己会不会半途而废  
&lt;br&gt;不知道有多少人能看到这个主页  
&lt;br&gt;但不管如何，开始了，就坚持吧  
&lt;br&gt;现在的我是深大研二的一个学生  
&lt;br&gt;希望能记录我的点点滴滴  
&lt;br&gt;&lt;br&gt;</summary>
      
    
    
    
    <category term="Essay" scheme="http://yoursite.com/categories/Essay/"/>
    
    
  </entry>
  
</feed>
