<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Coding...Coding...</title>
  <icon>https://www.gravatar.com/avatar/186e8a9967ddc3f700ba1e47b6be9b34</icon>
  <subtitle>个人博客</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://blueleer.github.io/"/>
  <updated>2018-10-07T13:31:31.909Z</updated>
  <id>https://blueleer.github.io/</id>
  
  <author>
    <name>KingIsHappy</name>
    <email>251668577@qq.com</email>
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>单点登陆(多系统的复杂性)</title>
    <link href="https://blueleer.github.io/2018/10/07/%E5%8D%95%E7%82%B9%E7%99%BB%E9%99%86-%E5%A4%9A%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%A4%8D%E6%9D%82%E6%80%A7/"/>
    <id>https://blueleer.github.io/2018/10/07/单点登陆-多系统的复杂性/</id>
    <published>2018-10-07T13:30:58.000Z</published>
    <updated>2018-10-07T13:31:31.909Z</updated>
    
    <content type="html"><![CDATA[<h1 id="1-会话机制"><a href="#1-会话机制" class="headerlink" title="1.会话机制"></a>1.会话机制</h1><ol><li>浏览器在第一次访问Tomcat服务器的时候,Tomcat服务器会在服务端创建session对象,并存储到map中.key是session的id,value是session对象本身.</li><li>在响应的时候会把session的id通过cookie的方式写到客户端浏览器中.</li><li>浏览器会在本地的目录中把session的id写入到本地的cookie中.</li><li>在后续的请求中,都会读取本地的cookie中的内容,并在请求的时候带上对应的cookie.</li></ol><p><strong>图解:</strong></p><p><img src="http://p9xlnkn7r.bkt.clouddn.com/%E4%BC%9A%E8%AF%9D%E6%9C%BA%E5%88%B6.png" alt=""></p><h1 id="2-登录机制"><a href="#2-登录机制" class="headerlink" title="2.登录机制"></a>2.登录机制</h1><p>有了会话机制，登录状态就好明白了，我们假设浏览器第一次请求服务器需要输入用户名与密码验证身份，服务器拿到用户名密码去数据库比对，正确的话说明当前持有这个会话的用户是合法用户，应该将这个会话标记为“已授权”或者“已登录”等等之类的状态，既然是会话的状态，自然要保存在会话对象中，Tomcat在会话对象中设置登录状态如下:  </p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">HttpSession session = request.getSession();</span><br><span class="line">session.setAttribute(<span class="string">"isLogin"</span>, <span class="keyword">true</span>);</span><br></pre></td></tr></table></figure><p>用户再次访问时，tomcat在会话对象中查看登录状态:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">HttpSession session = request.getSession();</span><br><span class="line">session.getAttribute(<span class="string">"isLogin"</span>);</span><br></pre></td></tr></table></figure><p>实现了登录状态的浏览器请求服务器模型如下图描述:</p><p><img src="http://p9xlnkn7r.bkt.clouddn.com/%E7%99%BB%E5%BD%95%E6%9C%BA%E5%88%B6.png" alt=""></p><p><strong>每次请求受保护资源时都会检查会话对象中的登录状态，只有 isLogin=true 的会话才能访问，登录机制因此而实现。</strong> </p><h1 id="3-多系统的复杂性"><a href="#3-多系统的复杂性" class="headerlink" title="3.多系统的复杂性"></a>3.多系统的复杂性</h1><p>随着公司的发展,公司内部使用的系统越来越多.但是对于使用系统的员工来说不是个好事情.</p><ol><li><p>每个系统都需要记住对应的账号和密码,很多员工都是每个系统的账户和密码都一样的.</p></li><li><p>如果同时要使用CRM系统(客户关系管理系统),WMS系统(进销存系统),OA系统(办公自动化系统),用户需要登录三次.</p></li><li><p>如果不使用了,还需要分别在三个系统中依次的注销.</p></li></ol><p><img src="http://p9xlnkn7r.bkt.clouddn.com/%E5%A4%9A%E7%B3%BB%E7%BB%9F%E5%A4%8D%E6%9D%82%E6%80%A7.png" alt=""></p><p>有没有这样的功能:我只需要登录一次,公司里面所有的系统都可以使用.只需要注销一次,所有的系统都退出登录了.</p><p>如果能实现这样的功能就非常好了.</p><p><img src="http://p9xlnkn7r.bkt.clouddn.com/%E5%BA%94%E7%94%A8%E7%BE%A4.png" alt=""></p><p>虽然单系统的登录解决方案很完美，但对于多系统应用群已经不再适用了，为什么呢？</p><p>单系统登录解决方案的核心是cookie，cookie携带会话id在浏览器与服务器之间维护会话状态。但cookie是有限制的，这个限制就是cookie的域（通常对应网站的域名），浏览器发送http请求时会自动携带与该域匹配的cookie，而不是所有cookie.</p><p><img src="http://p9xlnkn7r.bkt.clouddn.com/cookie%E5%92%8C%E5%9F%9F%E5%90%8D%E7%9B%B8%E5%85%B3.png" alt=""></p><p>既然这样，为什么不将web应用群中所有子系统的域名统一在一个顶级域名下，例如“*.baidu.com”，然后将它们的cookie域设置为“baidu.com”，这种做法理论上是可以的，甚至早期很多多系统登录就采用这种同域名共享cookie的方式。</p><p>然而，可行并不代表好，共享cookie的方式存在众多局限。首先，应用群域名得统一；其次，应用群各系统使用的技术（至少是web服务器）要相同，不然cookie的key值（tomcat为JSESSIONID）不同，无法维持会话，共享cookie的方式是无法实现跨语言技术平台登录的，比如java、php、.net系统之间；第三，cookie本身不安全。</p><p>因此，我们需要一种全新的登录方式来实现多系统应用群的登录，这就是单点登录.</p><h1 id="4-HttpURLConnection的简单使用"><a href="#4-HttpURLConnection的简单使用" class="headerlink" title="4.HttpURLConnection的简单使用"></a>4.HttpURLConnection的简单使用</h1><p>在JDK的java.net包中已经提供了访问HTTP协议的基本功能的类：HttpURLConnection。</p><p>HttpURLConnection是Java的标准类，它继承自URLConnection，可用于向指定网站发送GET请求、POST请求。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 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;/h1&gt;&lt;ol&gt;
&lt;li&gt;浏览器在第一次访问Tomcat服务器的时候,Tomcat服务器会在服务端创建session对象,
      
    
    </summary>
    
      <category term="单点登录SSO" scheme="https://blueleer.github.io/categories/%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95SSO/"/>
    
    
      <category term="单点登录SSO" scheme="https://blueleer.github.io/tags/%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95SSO/"/>
    
  </entry>
  
  <entry>
    <title>微信公众号开发入门(一)</title>
    <link href="https://blueleer.github.io/2018/08/05/%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8-%E4%B8%80/"/>
    <id>https://blueleer.github.io/2018/08/05/微信公众号开发入门-一/</id>
    <published>2018-08-05T07:18:34.000Z</published>
    <updated>2018-08-05T07:46:12.447Z</updated>
    
    <summary type="html">
    
    </summary>
    
      <category term="微信公众号开发" scheme="https://blueleer.github.io/categories/%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="微信公众号开发" scheme="https://blueleer.github.io/tags/%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>SpringSecurity入门</title>
    <link href="https://blueleer.github.io/2018/06/17/SpringSecurity%E5%85%A5%E9%97%A8/"/>
    <id>https://blueleer.github.io/2018/06/17/SpringSecurity入门/</id>
    <published>2018-06-17T07:01:46.000Z</published>
    <updated>2018-06-17T07:01:46.912Z</updated>
    
    <summary type="html">
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Dubbox使用入门</title>
    <link href="https://blueleer.github.io/2018/06/12/Dubbox%E4%BD%BF%E7%94%A8%E5%85%A5%E9%97%A8/"/>
    <id>https://blueleer.github.io/2018/06/12/Dubbox使用入门/</id>
    <published>2018-06-12T08:11:10.000Z</published>
    <updated>2018-06-12T08:11:10.227Z</updated>
    
    <summary type="html">
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Shiro安全框架之SSM集成（3）</title>
    <link href="https://blueleer.github.io/2018/06/08/Shiro%E5%AE%89%E5%85%A8%E6%A1%86%E6%9E%B6%E4%B9%8BSSM%E9%9B%86%E6%88%90%EF%BC%883%EF%BC%89/"/>
    <id>https://blueleer.github.io/2018/06/08/Shiro安全框架之SSM集成（3）/</id>
    <published>2018-06-08T14:14:12.000Z</published>
    <updated>2018-06-08T14:14:12.377Z</updated>
    
    <summary type="html">
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>SpringBoot全局配置参考</title>
    <link href="https://blueleer.github.io/2018/06/02/SpringBoot%E5%85%A8%E5%B1%80%E9%85%8D%E7%BD%AE%E5%8F%82%E8%80%83/"/>
    <id>https://blueleer.github.io/2018/06/02/SpringBoot全局配置参考/</id>
    <published>2018-06-02T12:28:20.000Z</published>
    <updated>2018-06-02T12:32:05.028Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Spring-Boot-常用应用程序属性"><a href="#Spring-Boot-常用应用程序属性" class="headerlink" title="Spring Boot 常用应用程序属性"></a>Spring Boot 常用应用程序属性</h1><p>详见:<a href="https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#common-application-properties" target="_blank" rel="noopener">Common application properties</a></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><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><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br><span class="line">580</span><br><span class="line">581</span><br><span class="line">582</span><br><span class="line">583</span><br><span class="line">584</span><br><span class="line">585</span><br><span class="line">586</span><br><span class="line">587</span><br><span class="line">588</span><br><span class="line">589</span><br><span class="line">590</span><br><span class="line">591</span><br><span class="line">592</span><br><span class="line">593</span><br><span class="line">594</span><br><span class="line">595</span><br><span class="line">596</span><br><span class="line">597</span><br><span class="line">598</span><br><span class="line">599</span><br><span class="line">600</span><br><span class="line">601</span><br><span class="line">602</span><br><span class="line">603</span><br><span class="line">604</span><br><span class="line">605</span><br><span class="line">606</span><br><span class="line">607</span><br><span class="line">608</span><br><span class="line">609</span><br><span class="line">610</span><br><span class="line">611</span><br><span class="line">612</span><br><span class="line">613</span><br><span class="line">614</span><br><span class="line">615</span><br><span class="line">616</span><br><span class="line">617</span><br><span class="line">618</span><br><span class="line">619</span><br><span class="line">620</span><br><span class="line">621</span><br><span class="line">622</span><br><span class="line">623</span><br><span class="line">624</span><br><span class="line">625</span><br><span class="line">626</span><br><span class="line">627</span><br><span class="line">628</span><br><span class="line">629</span><br><span class="line">630</span><br><span class="line">631</span><br><span class="line">632</span><br><span class="line">633</span><br><span class="line">634</span><br><span class="line">635</span><br><span class="line">636</span><br><span class="line">637</span><br><span class="line">638</span><br><span class="line">639</span><br><span class="line">640</span><br><span class="line">641</span><br><span class="line">642</span><br><span class="line">643</span><br><span class="line">644</span><br><span class="line">645</span><br><span class="line">646</span><br><span class="line">647</span><br><span class="line">648</span><br><span class="line">649</span><br><span class="line">650</span><br><span class="line">651</span><br><span class="line">652</span><br><span class="line">653</span><br><span class="line">654</span><br><span class="line">655</span><br><span class="line">656</span><br><span class="line">657</span><br><span class="line">658</span><br><span class="line">659</span><br><span class="line">660</span><br><span class="line">661</span><br><span class="line">662</span><br><span class="line">663</span><br><span class="line">664</span><br><span class="line">665</span><br><span class="line">666</span><br><span class="line">667</span><br><span class="line">668</span><br><span class="line">669</span><br><span class="line">670</span><br><span class="line">671</span><br><span class="line">672</span><br><span class="line">673</span><br><span class="line">674</span><br><span class="line">675</span><br><span class="line">676</span><br><span class="line">677</span><br><span class="line">678</span><br><span class="line">679</span><br><span class="line">680</span><br><span class="line">681</span><br><span class="line">682</span><br><span class="line">683</span><br><span class="line">684</span><br><span class="line">685</span><br><span class="line">686</span><br><span class="line">687</span><br><span class="line">688</span><br><span class="line">689</span><br><span class="line">690</span><br><span class="line">691</span><br><span class="line">692</span><br><span class="line">693</span><br><span class="line">694</span><br><span class="line">695</span><br><span class="line">696</span><br><span class="line">697</span><br><span class="line">698</span><br><span class="line">699</span><br><span class="line">700</span><br><span class="line">701</span><br><span class="line">702</span><br><span class="line">703</span><br><span class="line">704</span><br><span class="line">705</span><br><span class="line">706</span><br><span class="line">707</span><br><span class="line">708</span><br><span class="line">709</span><br><span class="line">710</span><br><span class="line">711</span><br><span class="line">712</span><br><span class="line">713</span><br><span class="line">714</span><br><span class="line">715</span><br><span class="line">716</span><br><span class="line">717</span><br><span class="line">718</span><br><span class="line">719</span><br><span class="line">720</span><br><span class="line">721</span><br><span class="line">722</span><br><span class="line">723</span><br><span class="line">724</span><br><span class="line">725</span><br><span class="line">726</span><br><span class="line">727</span><br><span class="line">728</span><br><span class="line">729</span><br><span class="line">730</span><br><span class="line">731</span><br><span class="line">732</span><br><span class="line">733</span><br><span class="line">734</span><br><span class="line">735</span><br><span class="line">736</span><br><span class="line">737</span><br><span class="line">738</span><br><span class="line">739</span><br><span class="line">740</span><br><span class="line">741</span><br><span class="line">742</span><br><span class="line">743</span><br><span class="line">744</span><br><span class="line">745</span><br><span class="line">746</span><br><span class="line">747</span><br><span class="line">748</span><br><span class="line">749</span><br><span class="line">750</span><br><span class="line">751</span><br><span class="line">752</span><br><span class="line">753</span><br><span class="line">754</span><br><span class="line">755</span><br><span class="line">756</span><br><span class="line">757</span><br><span class="line">758</span><br><span class="line">759</span><br><span class="line">760</span><br><span class="line">761</span><br><span class="line">762</span><br><span class="line">763</span><br><span class="line">764</span><br><span class="line">765</span><br><span class="line">766</span><br><span class="line">767</span><br><span class="line">768</span><br><span class="line">769</span><br><span class="line">770</span><br><span class="line">771</span><br><span class="line">772</span><br><span class="line">773</span><br><span class="line">774</span><br><span class="line">775</span><br><span class="line">776</span><br><span class="line">777</span><br><span class="line">778</span><br><span class="line">779</span><br><span class="line">780</span><br><span class="line">781</span><br><span class="line">782</span><br><span class="line">783</span><br><span class="line">784</span><br><span class="line">785</span><br><span class="line">786</span><br><span class="line">787</span><br><span class="line">788</span><br><span class="line">789</span><br><span class="line">790</span><br><span class="line">791</span><br><span class="line">792</span><br><span class="line">793</span><br><span class="line">794</span><br><span class="line">795</span><br><span class="line">796</span><br><span class="line">797</span><br><span class="line">798</span><br><span class="line">799</span><br><span class="line">800</span><br><span class="line">801</span><br><span class="line">802</span><br><span class="line">803</span><br><span class="line">804</span><br><span class="line">805</span><br><span class="line">806</span><br><span class="line">807</span><br><span class="line">808</span><br><span class="line">809</span><br><span class="line">810</span><br><span class="line">811</span><br><span class="line">812</span><br><span class="line">813</span><br><span class="line">814</span><br><span class="line">815</span><br><span class="line">816</span><br><span class="line">817</span><br><span class="line">818</span><br><span class="line">819</span><br><span class="line">820</span><br><span class="line">821</span><br><span class="line">822</span><br><span class="line">823</span><br><span class="line">824</span><br><span class="line">825</span><br><span class="line">826</span><br><span class="line">827</span><br><span class="line">828</span><br><span class="line">829</span><br><span class="line">830</span><br><span class="line">831</span><br><span class="line">832</span><br><span class="line">833</span><br><span class="line">834</span><br><span class="line">835</span><br><span class="line">836</span><br><span class="line">837</span><br><span class="line">838</span><br><span class="line">839</span><br><span class="line">840</span><br><span class="line">841</span><br><span class="line">842</span><br><span class="line">843</span><br><span class="line">844</span><br><span class="line">845</span><br><span class="line">846</span><br><span class="line">847</span><br><span class="line">848</span><br><span class="line">849</span><br><span class="line">850</span><br><span class="line">851</span><br><span class="line">852</span><br><span class="line">853</span><br><span class="line">854</span><br><span class="line">855</span><br><span class="line">856</span><br><span class="line">857</span><br><span class="line">858</span><br><span class="line">859</span><br><span class="line">860</span><br><span class="line">861</span><br><span class="line">862</span><br><span class="line">863</span><br><span class="line">864</span><br><span class="line">865</span><br><span class="line">866</span><br><span class="line">867</span><br><span class="line">868</span><br><span class="line">869</span><br><span class="line">870</span><br><span class="line">871</span><br><span class="line">872</span><br><span class="line">873</span><br><span class="line">874</span><br><span class="line">875</span><br><span class="line">876</span><br><span class="line">877</span><br><span class="line">878</span><br><span class="line">879</span><br><span class="line">880</span><br><span class="line">881</span><br><span class="line">882</span><br><span class="line">883</span><br><span class="line">884</span><br><span class="line">885</span><br><span class="line">886</span><br><span class="line">887</span><br><span class="line">888</span><br><span class="line">889</span><br><span class="line">890</span><br><span class="line">891</span><br><span class="line">892</span><br><span class="line">893</span><br><span class="line">894</span><br><span class="line">895</span><br><span class="line">896</span><br><span class="line">897</span><br><span class="line">898</span><br><span class="line">899</span><br><span class="line">900</span><br><span class="line">901</span><br><span class="line">902</span><br><span class="line">903</span><br><span class="line">904</span><br><span class="line">905</span><br><span class="line">906</span><br><span class="line">907</span><br><span class="line">908</span><br><span class="line">909</span><br><span class="line">910</span><br><span class="line">911</span><br><span class="line">912</span><br><span class="line">913</span><br><span class="line">914</span><br><span class="line">915</span><br><span class="line">916</span><br><span class="line">917</span><br><span class="line">918</span><br><span class="line">919</span><br><span class="line">920</span><br><span class="line">921</span><br><span class="line">922</span><br><span class="line">923</span><br><span class="line">924</span><br><span class="line">925</span><br><span class="line">926</span><br><span class="line">927</span><br><span class="line">928</span><br><span class="line">929</span><br><span class="line">930</span><br><span class="line">931</span><br><span class="line">932</span><br><span class="line">933</span><br><span class="line">934</span><br><span class="line">935</span><br><span class="line">936</span><br><span class="line">937</span><br><span class="line">938</span><br><span class="line">939</span><br><span class="line">940</span><br><span class="line">941</span><br><span class="line">942</span><br><span class="line">943</span><br><span class="line">944</span><br><span class="line">945</span><br><span class="line">946</span><br><span class="line">947</span><br><span class="line">948</span><br><span class="line">949</span><br><span class="line">950</span><br><span class="line">951</span><br><span class="line">952</span><br><span class="line">953</span><br><span class="line">954</span><br><span class="line">955</span><br><span class="line">956</span><br><span class="line">957</span><br><span class="line">958</span><br><span class="line">959</span><br><span class="line">960</span><br><span class="line">961</span><br><span class="line">962</span><br><span class="line">963</span><br><span class="line">964</span><br><span class="line">965</span><br><span class="line">966</span><br><span class="line">967</span><br><span class="line">968</span><br><span class="line">969</span><br><span class="line">970</span><br><span class="line">971</span><br><span class="line">972</span><br><span class="line">973</span><br><span class="line">974</span><br><span class="line">975</span><br><span class="line">976</span><br><span class="line">977</span><br><span class="line">978</span><br><span class="line">979</span><br><span class="line">980</span><br><span class="line">981</span><br><span class="line">982</span><br><span class="line">983</span><br><span class="line">984</span><br><span class="line">985</span><br><span class="line">986</span><br><span class="line">987</span><br><span class="line">988</span><br><span class="line">989</span><br><span class="line">990</span><br><span class="line">991</span><br><span class="line">992</span><br><span class="line">993</span><br><span class="line">994</span><br><span class="line">995</span><br><span class="line">996</span><br><span class="line">997</span><br><span class="line">998</span><br><span class="line">999</span><br><span class="line">1000</span><br><span class="line">1001</span><br><span class="line">1002</span><br><span class="line">1003</span><br><span class="line">1004</span><br><span class="line">1005</span><br><span class="line">1006</span><br><span class="line">1007</span><br><span class="line">1008</span><br><span class="line">1009</span><br><span class="line">1010</span><br><span class="line">1011</span><br><span class="line">1012</span><br><span class="line">1013</span><br><span class="line">1014</span><br><span class="line">1015</span><br><span class="line">1016</span><br><span class="line">1017</span><br><span class="line">1018</span><br><span class="line">1019</span><br><span class="line">1020</span><br><span class="line">1021</span><br><span class="line">1022</span><br><span class="line">1023</span><br><span class="line">1024</span><br><span class="line">1025</span><br><span class="line">1026</span><br><span class="line">1027</span><br><span class="line">1028</span><br><span class="line">1029</span><br><span class="line">1030</span><br><span class="line">1031</span><br><span class="line">1032</span><br><span class="line">1033</span><br><span class="line">1034</span><br><span class="line">1035</span><br><span class="line">1036</span><br><span class="line">1037</span><br><span class="line">1038</span><br><span class="line">1039</span><br><span class="line">1040</span><br><span class="line">1041</span><br><span class="line">1042</span><br><span class="line">1043</span><br><span class="line">1044</span><br><span class="line">1045</span><br><span class="line">1046</span><br><span class="line">1047</span><br><span class="line">1048</span><br><span class="line">1049</span><br><span class="line">1050</span><br><span class="line">1051</span><br><span class="line">1052</span><br><span class="line">1053</span><br><span class="line">1054</span><br><span class="line">1055</span><br><span class="line">1056</span><br><span class="line">1057</span><br><span class="line">1058</span><br><span class="line">1059</span><br><span class="line">1060</span><br><span class="line">1061</span><br><span class="line">1062</span><br><span class="line">1063</span><br><span class="line">1064</span><br><span class="line">1065</span><br><span class="line">1066</span><br><span class="line">1067</span><br><span class="line">1068</span><br><span class="line">1069</span><br><span class="line">1070</span><br><span class="line">1071</span><br><span class="line">1072</span><br><span class="line">1073</span><br><span class="line">1074</span><br><span class="line">1075</span><br><span class="line">1076</span><br><span class="line">1077</span><br><span class="line">1078</span><br><span class="line">1079</span><br><span class="line">1080</span><br><span class="line">1081</span><br><span class="line">1082</span><br><span class="line">1083</span><br><span class="line">1084</span><br><span class="line">1085</span><br><span class="line">1086</span><br><span class="line">1087</span><br><span class="line">1088</span><br><span class="line">1089</span><br><span class="line">1090</span><br><span class="line">1091</span><br><span class="line">1092</span><br><span class="line">1093</span><br><span class="line">1094</span><br><span class="line">1095</span><br><span class="line">1096</span><br><span class="line">1097</span><br><span class="line">1098</span><br><span class="line">1099</span><br><span class="line">1100</span><br><span class="line">1101</span><br><span class="line">1102</span><br><span class="line">1103</span><br><span class="line">1104</span><br><span class="line">1105</span><br><span class="line">1106</span><br><span class="line">1107</span><br><span class="line">1108</span><br><span class="line">1109</span><br><span class="line">1110</span><br><span class="line">1111</span><br><span class="line">1112</span><br><span class="line">1113</span><br><span class="line">1114</span><br><span class="line">1115</span><br><span class="line">1116</span><br><span class="line">1117</span><br><span class="line">1118</span><br><span class="line">1119</span><br><span class="line">1120</span><br><span class="line">1121</span><br><span class="line">1122</span><br><span class="line">1123</span><br><span class="line">1124</span><br><span class="line">1125</span><br><span class="line">1126</span><br><span class="line">1127</span><br><span class="line">1128</span><br><span class="line">1129</span><br><span class="line">1130</span><br><span class="line">1131</span><br><span class="line">1132</span><br><span class="line">1133</span><br><span class="line">1134</span><br><span class="line">1135</span><br><span class="line">1136</span><br><span class="line">1137</span><br><span class="line">1138</span><br><span class="line">1139</span><br><span class="line">1140</span><br><span class="line">1141</span><br><span class="line">1142</span><br><span class="line">1143</span><br><span class="line">1144</span><br><span class="line">1145</span><br><span class="line">1146</span><br><span class="line">1147</span><br><span class="line">1148</span><br><span class="line">1149</span><br><span class="line">1150</span><br><span class="line">1151</span><br><span class="line">1152</span><br><span class="line">1153</span><br><span class="line">1154</span><br><span class="line">1155</span><br><span class="line">1156</span><br><span class="line">1157</span><br><span class="line">1158</span><br><span class="line">1159</span><br><span class="line">1160</span><br><span class="line">1161</span><br><span class="line">1162</span><br><span class="line">1163</span><br><span class="line">1164</span><br><span class="line">1165</span><br><span class="line">1166</span><br><span class="line">1167</span><br><span class="line">1168</span><br><span class="line">1169</span><br><span class="line">1170</span><br><span class="line">1171</span><br><span class="line">1172</span><br><span class="line">1173</span><br><span class="line">1174</span><br><span class="line">1175</span><br><span class="line">1176</span><br><span class="line">1177</span><br><span class="line">1178</span><br><span class="line">1179</span><br><span class="line">1180</span><br><span class="line">1181</span><br><span class="line">1182</span><br><span class="line">1183</span><br><span class="line">1184</span><br><span class="line">1185</span><br><span class="line">1186</span><br><span class="line">1187</span><br><span class="line">1188</span><br><span class="line">1189</span><br><span class="line">1190</span><br><span class="line">1191</span><br><span class="line">1192</span><br><span class="line">1193</span><br><span class="line">1194</span><br><span class="line">1195</span><br><span class="line">1196</span><br><span class="line">1197</span><br><span class="line">1198</span><br><span class="line">1199</span><br><span class="line">1200</span><br><span class="line">1201</span><br><span class="line">1202</span><br><span class="line">1203</span><br><span class="line">1204</span><br><span class="line">1205</span><br><span class="line">1206</span><br><span class="line">1207</span><br><span class="line">1208</span><br><span class="line">1209</span><br><span class="line">1210</span><br><span class="line">1211</span><br><span class="line">1212</span><br><span class="line">1213</span><br><span class="line">1214</span><br><span class="line">1215</span><br><span class="line">1216</span><br><span class="line">1217</span><br><span class="line">1218</span><br><span class="line">1219</span><br><span class="line">1220</span><br><span class="line">1221</span><br><span class="line">1222</span><br><span class="line">1223</span><br><span class="line">1224</span><br><span class="line">1225</span><br><span class="line">1226</span><br><span class="line">1227</span><br><span class="line">1228</span><br><span class="line">1229</span><br><span class="line">1230</span><br><span class="line">1231</span><br><span class="line">1232</span><br><span class="line">1233</span><br><span class="line">1234</span><br><span class="line">1235</span><br><span class="line">1236</span><br><span class="line">1237</span><br><span class="line">1238</span><br><span class="line">1239</span><br><span class="line">1240</span><br><span class="line">1241</span><br><span class="line">1242</span><br><span class="line">1243</span><br><span class="line">1244</span><br><span class="line">1245</span><br><span class="line">1246</span><br><span class="line">1247</span><br><span class="line">1248</span><br><span class="line">1249</span><br><span class="line">1250</span><br><span class="line">1251</span><br><span class="line">1252</span><br><span class="line">1253</span><br><span class="line">1254</span><br><span class="line">1255</span><br><span class="line">1256</span><br><span class="line">1257</span><br><span class="line">1258</span><br><span class="line">1259</span><br><span class="line">1260</span><br><span class="line">1261</span><br><span class="line">1262</span><br><span class="line">1263</span><br><span class="line">1264</span><br><span class="line">1265</span><br><span class="line">1266</span><br><span class="line">1267</span><br><span class="line">1268</span><br><span class="line">1269</span><br><span class="line">1270</span><br><span class="line">1271</span><br><span class="line">1272</span><br><span class="line">1273</span><br><span class="line">1274</span><br><span class="line">1275</span><br><span class="line">1276</span><br><span class="line">1277</span><br><span class="line">1278</span><br><span class="line">1279</span><br><span class="line">1280</span><br><span class="line">1281</span><br><span class="line">1282</span><br><span class="line">1283</span><br><span class="line">1284</span><br><span class="line">1285</span><br><span class="line">1286</span><br><span class="line">1287</span><br><span class="line">1288</span><br><span class="line">1289</span><br><span class="line">1290</span><br><span class="line">1291</span><br><span class="line">1292</span><br><span class="line">1293</span><br><span class="line">1294</span><br><span class="line">1295</span><br><span class="line">1296</span><br><span class="line">1297</span><br><span class="line">1298</span><br><span class="line">1299</span><br><span class="line">1300</span><br><span class="line">1301</span><br><span class="line">1302</span><br><span class="line">1303</span><br><span class="line">1304</span><br><span class="line">1305</span><br><span class="line">1306</span><br><span class="line">1307</span><br><span class="line">1308</span><br><span class="line">1309</span><br><span class="line">1310</span><br><span class="line">1311</span><br><span class="line">1312</span><br><span class="line">1313</span><br><span class="line">1314</span><br><span class="line">1315</span><br><span class="line">1316</span><br><span class="line">1317</span><br><span class="line">1318</span><br><span class="line">1319</span><br><span class="line">1320</span><br><span class="line">1321</span><br><span class="line">1322</span><br><span class="line">1323</span><br><span class="line">1324</span><br><span class="line">1325</span><br><span class="line">1326</span><br><span class="line">1327</span><br><span class="line">1328</span><br><span class="line">1329</span><br><span class="line">1330</span><br><span class="line">1331</span><br><span class="line">1332</span><br><span class="line">1333</span><br><span class="line">1334</span><br><span class="line">1335</span><br><span class="line">1336</span><br><span class="line">1337</span><br><span class="line">1338</span><br><span class="line">1339</span><br><span class="line">1340</span><br><span class="line">1341</span><br><span class="line">1342</span><br><span class="line">1343</span><br><span class="line">1344</span><br><span class="line">1345</span><br><span class="line">1346</span><br><span class="line">1347</span><br><span class="line">1348</span><br><span class="line">1349</span><br><span class="line">1350</span><br><span class="line">1351</span><br><span class="line">1352</span><br><span class="line">1353</span><br><span class="line">1354</span><br><span class="line">1355</span><br><span class="line">1356</span><br><span class="line">1357</span><br><span class="line">1358</span><br><span class="line">1359</span><br><span class="line">1360</span><br><span class="line">1361</span><br><span class="line">1362</span><br><span class="line">1363</span><br><span class="line">1364</span><br><span class="line">1365</span><br><span class="line">1366</span><br><span class="line">1367</span><br><span class="line">1368</span><br><span class="line">1369</span><br><span class="line">1370</span><br><span class="line">1371</span><br><span class="line">1372</span><br><span class="line">1373</span><br><span class="line">1374</span><br><span class="line">1375</span><br><span class="line">1376</span><br><span class="line">1377</span><br><span class="line">1378</span><br><span class="line">1379</span><br><span class="line">1380</span><br><span class="line">1381</span><br><span class="line">1382</span><br><span class="line">1383</span><br><span class="line">1384</span><br><span class="line">1385</span><br><span class="line">1386</span><br><span class="line">1387</span><br><span class="line">1388</span><br><span class="line">1389</span><br><span class="line">1390</span><br><span class="line">1391</span><br><span class="line">1392</span><br><span class="line">1393</span><br><span class="line">1394</span><br><span class="line">1395</span><br><span class="line">1396</span><br><span class="line">1397</span><br><span class="line">1398</span><br><span class="line">1399</span><br><span class="line">1400</span><br><span class="line">1401</span><br><span class="line">1402</span><br><span class="line">1403</span><br><span class="line">1404</span><br><span class="line">1405</span><br><span class="line">1406</span><br><span class="line">1407</span><br><span class="line">1408</span><br><span class="line">1409</span><br><span class="line">1410</span><br><span class="line">1411</span><br><span class="line">1412</span><br><span class="line">1413</span><br><span class="line">1414</span><br><span class="line">1415</span><br><span class="line">1416</span><br><span class="line">1417</span><br><span class="line">1418</span><br><span class="line">1419</span><br><span class="line">1420</span><br><span class="line">1421</span><br><span class="line">1422</span><br><span class="line">1423</span><br><span class="line">1424</span><br><span class="line">1425</span><br><span class="line">1426</span><br><span class="line">1427</span><br><span class="line">1428</span><br><span class="line">1429</span><br><span class="line">1430</span><br><span class="line">1431</span><br><span class="line">1432</span><br><span class="line">1433</span><br><span class="line">1434</span><br><span class="line">1435</span><br><span class="line">1436</span><br><span class="line">1437</span><br><span class="line">1438</span><br><span class="line">1439</span><br><span class="line">1440</span><br><span class="line">1441</span><br><span class="line">1442</span><br><span class="line">1443</span><br><span class="line">1444</span><br><span class="line">1445</span><br><span class="line">1446</span><br><span class="line">1447</span><br><span class="line">1448</span><br><span class="line">1449</span><br><span class="line">1450</span><br><span class="line">1451</span><br><span class="line">1452</span><br><span class="line">1453</span><br><span class="line">1454</span><br><span class="line">1455</span><br><span class="line">1456</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"># ===================================================================</span><br><span class="line"># COMMON SPRING BOOT PROPERTIES</span><br><span class="line">#</span><br><span class="line"># This sample file is provided as a guideline. Do NOT copy it in its</span><br><span class="line"># entirety to your own application.               ^^^</span><br><span class="line"># ===================================================================</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># ----------------------------------------</span><br><span class="line"># CORE PROPERTIES</span><br><span class="line"># ----------------------------------------</span><br><span class="line">debug=false # Enable debug logs.</span><br><span class="line">trace=false # Enable trace logs.</span><br><span class="line"></span><br><span class="line"># LOGGING</span><br><span class="line">logging.config= # Location of the logging configuration file. For instance, `classpath:logback.xml` for Logback.</span><br><span class="line">logging.exception-conversion-word=%wEx # Conversion word used when logging exceptions.</span><br><span class="line">logging.file= # Log file name (for instance, `myapp.log`). Names can be an exact location or relative to the current directory.</span><br><span class="line">logging.file.max-history=0 # Maximum of archive log files to keep. Only supported with the default logback setup.</span><br><span class="line">logging.file.max-size=10MB # Maximum log file size. Only supported with the default logback setup.</span><br><span class="line">logging.level.*= # Log levels severity mapping. For instance, `logging.level.org.springframework=DEBUG`.</span><br><span class="line">logging.path= # Location of the log file. For instance, `/var/log`.</span><br><span class="line">logging.pattern.console= # Appender pattern for output to the console. Supported only with the default Logback setup.</span><br><span class="line">logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS # Appender pattern for log date format. Supported only with the default Logback setup.</span><br><span class="line">logging.pattern.file= # Appender pattern for output to a file. Supported only with the default Logback setup.</span><br><span class="line">logging.pattern.level=%5p # Appender pattern for log level. Supported only with the default Logback setup.</span><br><span class="line">logging.register-shutdown-hook=false # Register a shutdown hook for the logging system when it is initialized.</span><br><span class="line"></span><br><span class="line"># AOP</span><br><span class="line">spring.aop.auto=true # Add @EnableAspectJAutoProxy.</span><br><span class="line">spring.aop.proxy-target-class=true # Whether subclass-based (CGLIB) proxies are to be created (true), as opposed to standard Java interface-based proxies (false).</span><br><span class="line"></span><br><span class="line"># IDENTITY (ContextIdApplicationContextInitializer)</span><br><span class="line">spring.application.name= # Application name.</span><br><span class="line"></span><br><span class="line"># ADMIN (SpringApplicationAdminJmxAutoConfiguration)</span><br><span class="line">spring.application.admin.enabled=false # Whether to enable admin features for the application.</span><br><span class="line">spring.application.admin.jmx-name=org.springframework.boot:type=Admin,name=SpringApplication # JMX name of the application admin MBean.</span><br><span class="line"></span><br><span class="line"># AUTO-CONFIGURATION</span><br><span class="line">spring.autoconfigure.exclude= # Auto-configuration classes to exclude.</span><br><span class="line"></span><br><span class="line"># BANNER</span><br><span class="line">spring.banner.charset=UTF-8 # Banner file encoding.</span><br><span class="line">spring.banner.location=classpath:banner.txt # Banner text resource location.</span><br><span class="line">spring.banner.image.location=classpath:banner.gif # Banner image file location (jpg or png can also be used).</span><br><span class="line">spring.banner.image.width=76 # Width of the banner image in chars.</span><br><span class="line">spring.banner.image.height= # Height of the banner image in chars (default based on image height).</span><br><span class="line">spring.banner.image.margin=2 # Left hand image margin in chars.</span><br><span class="line">spring.banner.image.invert=false # Whether images should be inverted for dark terminal themes.</span><br><span class="line"></span><br><span class="line"># SPRING CORE</span><br><span class="line">spring.beaninfo.ignore=true # Whether to skip search of BeanInfo classes.</span><br><span class="line"></span><br><span class="line"># SPRING CACHE (CacheProperties)</span><br><span class="line">spring.cache.cache-names= # Comma-separated list of cache names to create if supported by the underlying cache manager.</span><br><span class="line">spring.cache.caffeine.spec= # The spec to use to create caches. See CaffeineSpec for more details on the spec format.</span><br><span class="line">spring.cache.couchbase.expiration=0ms # Entry expiration. By default the entries never expire. Note that this value is ultimately converted to seconds.</span><br><span class="line">spring.cache.ehcache.config= # The location of the configuration file to use to initialize EhCache.</span><br><span class="line">spring.cache.infinispan.config= # The location of the configuration file to use to initialize Infinispan.</span><br><span class="line">spring.cache.jcache.config= # The location of the configuration file to use to initialize the cache manager.</span><br><span class="line">spring.cache.jcache.provider= # Fully qualified name of the CachingProvider implementation to use to retrieve the JSR-107 compliant cache manager. Needed only if more than one JSR-107 implementation is available on the classpath.</span><br><span class="line">spring.cache.redis.cache-null-values=true # Allow caching null values.</span><br><span class="line">spring.cache.redis.key-prefix= # Key prefix.</span><br><span class="line">spring.cache.redis.time-to-live=0ms # Entry expiration. By default the entries never expire.</span><br><span class="line">spring.cache.redis.use-key-prefix=true # Whether to use the key prefix when writing to Redis.</span><br><span class="line">spring.cache.type= # Cache type. By default, auto-detected according to the environment.</span><br><span class="line"></span><br><span class="line"># SPRING CONFIG - using environment property only (ConfigFileApplicationListener)</span><br><span class="line">spring.config.additional-location= # Config file locations used in addition to the defaults.</span><br><span class="line">spring.config.location= # Config file locations that replace the defaults.</span><br><span class="line">spring.config.name=application # Config file name.</span><br><span class="line"></span><br><span class="line"># HAZELCAST (HazelcastProperties)</span><br><span class="line">spring.hazelcast.config= # The location of the configuration file to use to initialize Hazelcast.</span><br><span class="line"></span><br><span class="line"># PROJECT INFORMATION (ProjectInfoProperties)</span><br><span class="line">spring.info.build.location=classpath:META-INF/build-info.properties # Location of the generated build-info.properties file.</span><br><span class="line">spring.info.git.location=classpath:git.properties # Location of the generated git.properties file.</span><br><span class="line"></span><br><span class="line"># JMX</span><br><span class="line">spring.jmx.default-domain= # JMX domain name.</span><br><span class="line">spring.jmx.enabled=true # Expose management beans to the JMX domain.</span><br><span class="line">spring.jmx.server=mbeanServer # MBeanServer bean name.</span><br><span class="line"></span><br><span class="line"># Email (MailProperties)</span><br><span class="line">spring.mail.default-encoding=UTF-8 # Default MimeMessage encoding.</span><br><span class="line">spring.mail.host= # SMTP server host. For instance, `smtp.example.com`.</span><br><span class="line">spring.mail.jndi-name= # Session JNDI name. When set, takes precedence over other Session settings.</span><br><span class="line">spring.mail.password= # Login password of the SMTP server.</span><br><span class="line">spring.mail.port= # SMTP server port.</span><br><span class="line">spring.mail.properties.*= # Additional JavaMail Session properties.</span><br><span class="line">spring.mail.protocol=smtp # Protocol used by the SMTP server.</span><br><span class="line">spring.mail.test-connection=false # Whether to test that the mail server is available on startup.</span><br><span class="line">spring.mail.username= # Login user of the SMTP server.</span><br><span class="line"></span><br><span class="line"># APPLICATION SETTINGS (SpringApplication)</span><br><span class="line">spring.main.banner-mode=console # Mode used to display the banner when the application runs.</span><br><span class="line">spring.main.sources= # Sources (class names, package names, or XML resource locations) to include in the ApplicationContext.</span><br><span class="line">spring.main.web-application-type= # Flag to explicitly request a specific type of web application. If not set, auto-detected based on the classpath.</span><br><span class="line"></span><br><span class="line"># FILE ENCODING (FileEncodingApplicationListener)</span><br><span class="line">spring.mandatory-file-encoding= # Expected character encoding the application must use.</span><br><span class="line"></span><br><span class="line"># INTERNATIONALIZATION (MessageSourceProperties)</span><br><span class="line">spring.messages.always-use-message-format=false # Whether to always apply the MessageFormat rules, parsing even messages without arguments.</span><br><span class="line">spring.messages.basename=messages # Comma-separated list of basenames (essentially a fully-qualified classpath location), each following the ResourceBundle convention with relaxed support for slash based locations.</span><br><span class="line">spring.messages.cache-duration= # Loaded resource bundle files cache duration. When not set, bundles are cached forever. If a duration suffix is not specified, seconds will be used.</span><br><span class="line">spring.messages.encoding=UTF-8 # Message bundles encoding.</span><br><span class="line">spring.messages.fallback-to-system-locale=true # Whether to fall back to the system Locale if no files for a specific Locale have been found.</span><br><span class="line">spring.messages.use-code-as-default-message=false # Whether to use the message code as the default message instead of throwing a "NoSuchMessageException". Recommended during development only.</span><br><span class="line"></span><br><span class="line"># OUTPUT</span><br><span class="line">spring.output.ansi.enabled=detect # Configures the ANSI output.</span><br><span class="line"></span><br><span class="line"># PID FILE (ApplicationPidFileWriter)</span><br><span class="line">spring.pid.fail-on-write-error= # Fails if ApplicationPidFileWriter is used but it cannot write the PID file.</span><br><span class="line">spring.pid.file= # Location of the PID file to write (if ApplicationPidFileWriter is used).</span><br><span class="line"></span><br><span class="line"># PROFILES</span><br><span class="line">spring.profiles.active= # Comma-separated list of active profiles. Can be overridden by a command line switch.</span><br><span class="line">spring.profiles.include= # Unconditionally activate the specified comma-separated list of profiles (or list of profiles if using YAML).</span><br><span class="line"></span><br><span class="line"># QUARTZ SCHEDULER (QuartzProperties)</span><br><span class="line">spring.quartz.jdbc.comment-prefix=-- # Prefix for single-line comments in SQL initialization scripts.</span><br><span class="line">spring.quartz.jdbc.initialize-schema=embedded # Database schema initialization mode.</span><br><span class="line">spring.quartz.jdbc.schema=classpath:org/quartz/impl/jdbcjobstore/tables_@@platform@@.sql # Path to the SQL file to use to initialize the database schema.</span><br><span class="line">spring.quartz.job-store-type=memory # Quartz job store type.</span><br><span class="line">spring.quartz.properties.*= # Additional Quartz Scheduler properties.</span><br><span class="line"></span><br><span class="line"># REACTOR (ReactorCoreProperties)</span><br><span class="line">spring.reactor.stacktrace-mode.enabled=false # Whether Reactor should collect stacktrace information at runtime.</span><br><span class="line"></span><br><span class="line"># SENDGRID (SendGridAutoConfiguration)</span><br><span class="line">spring.sendgrid.api-key= # SendGrid API key.</span><br><span class="line">spring.sendgrid.proxy.host= # SendGrid proxy host.</span><br><span class="line">spring.sendgrid.proxy.port= # SendGrid proxy port.</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># ----------------------------------------</span><br><span class="line"># WEB PROPERTIES</span><br><span class="line"># ----------------------------------------</span><br><span class="line"></span><br><span class="line"># EMBEDDED SERVER CONFIGURATION (ServerProperties)</span><br><span class="line">server.address= # Network address to which the server should bind.</span><br><span class="line">server.compression.enabled=false # Whether response compression is enabled.</span><br><span class="line">server.compression.excluded-user-agents= # List of user-agents to exclude from compression.</span><br><span class="line">server.compression.mime-types=text/html,text/xml,text/plain,text/css,text/javascript,application/javascript # Comma-separated list of MIME types that should be compressed.</span><br><span class="line">server.compression.min-response-size=2048 # Minimum "Content-Length" value that is required for compression to be performed.</span><br><span class="line">server.connection-timeout= # Time that connectors wait for another HTTP request before closing the connection. When not set, the connector's container-specific default is used. Use a value of -1 to indicate no (that is, an infinite) timeout.</span><br><span class="line">server.error.include-exception=false # Include the "exception" attribute.</span><br><span class="line">server.error.include-stacktrace=never # When to include a "stacktrace" attribute.</span><br><span class="line">server.error.path=/error # Path of the error controller.</span><br><span class="line">server.error.whitelabel.enabled=true # Whether to enable the default error page displayed in browsers in case of a server error.</span><br><span class="line">server.http2.enabled=false # Whether to enable HTTP/2 support, if the current environment supports it.</span><br><span class="line">server.jetty.acceptors= # Number of acceptor threads to use.</span><br><span class="line">server.jetty.accesslog.append=false # Append to log.</span><br><span class="line">server.jetty.accesslog.date-format=dd/MMM/yyyy:HH:mm:ss Z # Timestamp format of the request log.</span><br><span class="line">server.jetty.accesslog.enabled=false # Enable access log.</span><br><span class="line">server.jetty.accesslog.extended-format=false # Enable extended NCSA format.</span><br><span class="line">server.jetty.accesslog.file-date-format= # Date format to place in log file name.</span><br><span class="line">server.jetty.accesslog.filename= # Log filename. If not specified, logs redirect to "System.err".</span><br><span class="line">server.jetty.accesslog.locale= # Locale of the request log.</span><br><span class="line">server.jetty.accesslog.log-cookies=false # Enable logging of the request cookies.</span><br><span class="line">server.jetty.accesslog.log-latency=false # Enable logging of request processing time.</span><br><span class="line">server.jetty.accesslog.log-server=false # Enable logging of the request hostname.</span><br><span class="line">server.jetty.accesslog.retention-period=31 # Number of days before rotated log files are deleted.</span><br><span class="line">server.jetty.accesslog.time-zone=GMT # Timezone of the request log.</span><br><span class="line">server.jetty.max-http-post-size=0 # Maximum size, in bytes, of the HTTP post or put content.</span><br><span class="line">server.jetty.selectors= # Number of selector threads to use.</span><br><span class="line">server.max-http-header-size=0 # Maximum size, in bytes, of the HTTP message header.</span><br><span class="line">server.port=8080 # Server HTTP port.</span><br><span class="line">server.server-header= # Value to use for the Server response header (if empty, no header is sent).</span><br><span class="line">server.use-forward-headers= # Whether X-Forwarded-* headers should be applied to the HttpRequest.</span><br><span class="line">server.servlet.context-parameters.*= # Servlet context init parameters.</span><br><span class="line">server.servlet.context-path= # Context path of the application.</span><br><span class="line">server.servlet.application-display-name=application # Display name of the application.</span><br><span class="line">server.servlet.jsp.class-name=org.apache.jasper.servlet.JspServlet # The class name of the JSP servlet.</span><br><span class="line">server.servlet.jsp.init-parameters.*= # Init parameters used to configure the JSP servlet.</span><br><span class="line">server.servlet.jsp.registered=true # Whether the JSP servlet is registered.</span><br><span class="line">server.servlet.session.cookie.comment= # Comment for the session cookie.</span><br><span class="line">server.servlet.session.cookie.domain= # Domain for the session cookie.</span><br><span class="line">server.servlet.session.cookie.http-only= # "HttpOnly" flag for the session cookie.</span><br><span class="line">server.servlet.session.cookie.max-age= # Maximum age of the session cookie. If a duration suffix is not specified, seconds will be used.</span><br><span class="line">server.servlet.session.cookie.name= # Session cookie name.</span><br><span class="line">server.servlet.session.cookie.path= # Path of the session cookie.</span><br><span class="line">server.servlet.session.cookie.secure= # "Secure" flag for the session cookie.</span><br><span class="line">server.servlet.session.persistent=false # Whether to persist session data between restarts.</span><br><span class="line">server.servlet.session.store-dir= # Directory used to store session data.</span><br><span class="line">server.servlet.session.timeout= # Session timeout. If a duration suffix is not specified, seconds will be used.</span><br><span class="line">server.servlet.session.tracking-modes= # Session tracking modes (one or more of the following: "cookie", "url", "ssl").</span><br><span class="line">server.ssl.ciphers= # Supported SSL ciphers.</span><br><span class="line">server.ssl.client-auth= # Whether client authentication is wanted ("want") or needed ("need"). Requires a trust store.</span><br><span class="line">server.ssl.enabled= # Enable SSL support.</span><br><span class="line">server.ssl.enabled-protocols= # Enabled SSL protocols.</span><br><span class="line">server.ssl.key-alias= # Alias that identifies the key in the key store.</span><br><span class="line">server.ssl.key-password= # Password used to access the key in the key store.</span><br><span class="line">server.ssl.key-store= # Path to the key store that holds the SSL certificate (typically a jks file).</span><br><span class="line">server.ssl.key-store-password= # Password used to access the key store.</span><br><span class="line">server.ssl.key-store-provider= # Provider for the key store.</span><br><span class="line">server.ssl.key-store-type= # Type of the key store.</span><br><span class="line">server.ssl.protocol=TLS # SSL protocol to use.</span><br><span class="line">server.ssl.trust-store= # Trust store that holds SSL certificates.</span><br><span class="line">server.ssl.trust-store-password= # Password used to access the trust store.</span><br><span class="line">server.ssl.trust-store-provider= # Provider for the trust store.</span><br><span class="line">server.ssl.trust-store-type= # Type of the trust store.</span><br><span class="line">server.tomcat.accept-count=0 # Maximum queue length for incoming connection requests when all possible request processing threads are in use.</span><br><span class="line">server.tomcat.accesslog.buffered=true # Whether to buffer output such that it is flushed only periodically.</span><br><span class="line">server.tomcat.accesslog.directory=logs # Directory in which log files are created. Can be absolute or relative to the Tomcat base dir.</span><br><span class="line">server.tomcat.accesslog.enabled=false # Enable access log.</span><br><span class="line">server.tomcat.accesslog.file-date-format=.yyyy-MM-dd # Date format to place in the log file name.</span><br><span class="line">server.tomcat.accesslog.pattern=common # Format pattern for access logs.</span><br><span class="line">server.tomcat.accesslog.prefix=access_log # Log file name prefix.</span><br><span class="line">server.tomcat.accesslog.rename-on-rotate=false # Whether to defer inclusion of the date stamp in the file name until rotate time.</span><br><span class="line">server.tomcat.accesslog.request-attributes-enabled=false # Set request attributes for the IP address, Hostname, protocol, and port used for the request.</span><br><span class="line">server.tomcat.accesslog.rotate=true # Whether to enable access log rotation.</span><br><span class="line">server.tomcat.accesslog.suffix=.log # Log file name suffix.</span><br><span class="line">server.tomcat.additional-tld-skip-patterns= # Comma-separated list of additional patterns that match jars to ignore for TLD scanning.</span><br><span class="line">server.tomcat.background-processor-delay=30s # Delay between the invocation of backgroundProcess methods. If a duration suffix is not specified, seconds will be used.</span><br><span class="line">server.tomcat.basedir= # Tomcat base directory. If not specified, a temporary directory is used.</span><br><span class="line">server.tomcat.internal-proxies=10\\.\\d&#123;1,3&#125;\\.\\d&#123;1,3&#125;\\.\\d&#123;1,3&#125;|\\</span><br><span class="line">192\\.168\\.\\d&#123;1,3&#125;\\.\\d&#123;1,3&#125;|\\</span><br><span class="line">169\\.254\\.\\d&#123;1,3&#125;\\.\\d&#123;1,3&#125;|\\</span><br><span class="line">127\\.\\d&#123;1,3&#125;\\.\\d&#123;1,3&#125;\\.\\d&#123;1,3&#125;|\\</span><br><span class="line">172\\.1[6-9]&#123;1&#125;\\.\\d&#123;1,3&#125;\\.\\d&#123;1,3&#125;|\\</span><br><span class="line">172\\.2[0-9]&#123;1&#125;\\.\\d&#123;1,3&#125;\\.\\d&#123;1,3&#125;|\\</span><br><span class="line">172\\.3[0-1]&#123;1&#125;\\.\\d&#123;1,3&#125;\\.\\d&#123;1,3&#125; # Regular expression matching trusted IP addresses.</span><br><span class="line">server.tomcat.max-connections=0 # Maximum number of connections that the server accepts and processes at any given time.</span><br><span class="line">server.tomcat.max-http-header-size=0 # Maximum size, in bytes, of the HTTP message header.</span><br><span class="line">server.tomcat.max-http-post-size=0 # Maximum size, in bytes, of the HTTP post content.</span><br><span class="line">server.tomcat.max-threads=0 # Maximum number of worker threads.</span><br><span class="line">server.tomcat.min-spare-threads=0 # Minimum number of worker threads.</span><br><span class="line">server.tomcat.port-header=X-Forwarded-Port # Name of the HTTP header used to override the original port value.</span><br><span class="line">server.tomcat.protocol-header= # Header that holds the incoming protocol, usually named "X-Forwarded-Proto".</span><br><span class="line">server.tomcat.protocol-header-https-value=https # Value of the protocol header indicating whether the incoming request uses SSL.</span><br><span class="line">server.tomcat.redirect-context-root= # Whether requests to the context root should be redirected by appending a / to the path.</span><br><span class="line">server.tomcat.remote-ip-header= # Name of the HTTP header from which the remote IP is extracted. For instance, `X-FORWARDED-FOR`.</span><br><span class="line">server.tomcat.resource.cache-ttl= # Time-to-live of the static resource cache.</span><br><span class="line">server.tomcat.uri-encoding=UTF-8 # Character encoding to use to decode the URI.</span><br><span class="line">server.tomcat.use-relative-redirects= # Whether HTTP 1.1 and later location headers generated by a call to sendRedirect will use relative or absolute redirects.</span><br><span class="line">server.undertow.accesslog.dir= # Undertow access log directory.</span><br><span class="line">server.undertow.accesslog.enabled=false # Whether to enable the access log.</span><br><span class="line">server.undertow.accesslog.pattern=common # Format pattern for access logs.</span><br><span class="line">server.undertow.accesslog.prefix=access_log. # Log file name prefix.</span><br><span class="line">server.undertow.accesslog.rotate=true # Whether to enable access log rotation.</span><br><span class="line">server.undertow.accesslog.suffix=log # Log file name suffix.</span><br><span class="line">server.undertow.buffer-size= # Size of each buffer, in bytes.</span><br><span class="line">server.undertow.direct-buffers= # Whether to allocate buffers outside the Java heap.</span><br><span class="line">server.undertow.io-threads= # Number of I/O threads to create for the worker.</span><br><span class="line">server.undertow.eager-filter-init=true # Whether servlet filters should be initialized on startup.</span><br><span class="line">server.undertow.max-http-post-size=0 # Maximum size, in bytes, of the HTTP post content.</span><br><span class="line">server.undertow.worker-threads= # Number of worker threads.</span><br><span class="line"></span><br><span class="line"># FREEMARKER (FreeMarkerProperties)</span><br><span class="line">spring.freemarker.allow-request-override=false # Whether HttpServletRequest attributes are allowed to override (hide) controller generated model attributes of the same name.</span><br><span class="line">spring.freemarker.allow-session-override=false # Whether HttpSession attributes are allowed to override (hide) controller generated model attributes of the same name.</span><br><span class="line">spring.freemarker.cache=false # Whether to enable template caching.</span><br><span class="line">spring.freemarker.charset=UTF-8 # Template encoding.</span><br><span class="line">spring.freemarker.check-template-location=true # Whether to check that the templates location exists.</span><br><span class="line">spring.freemarker.content-type=text/html # Content-Type value.</span><br><span class="line">spring.freemarker.enabled=true # Whether to enable MVC view resolution for this technology.</span><br><span class="line">spring.freemarker.expose-request-attributes=false # Whether all request attributes should be added to the model prior to merging with the template.</span><br><span class="line">spring.freemarker.expose-session-attributes=false # Whether all HttpSession attributes should be added to the model prior to merging with the template.</span><br><span class="line">spring.freemarker.expose-spring-macro-helpers=true # Whether to expose a RequestContext for use by Spring's macro library, under the name "springMacroRequestContext".</span><br><span class="line">spring.freemarker.prefer-file-system-access=true # Whether to prefer file system access for template loading. File system access enables hot detection of template changes.</span><br><span class="line">spring.freemarker.prefix= # Prefix that gets prepended to view names when building a URL.</span><br><span class="line">spring.freemarker.request-context-attribute= # Name of the RequestContext attribute for all views.</span><br><span class="line">spring.freemarker.settings.*= # Well-known FreeMarker keys which are passed to FreeMarker's Configuration.</span><br><span class="line">spring.freemarker.suffix=.ftl # Suffix that gets appended to view names when building a URL.</span><br><span class="line">spring.freemarker.template-loader-path=classpath:/templates/ # Comma-separated list of template paths.</span><br><span class="line">spring.freemarker.view-names= # White list of view names that can be resolved.</span><br><span class="line"></span><br><span class="line"># GROOVY TEMPLATES (GroovyTemplateProperties)</span><br><span class="line">spring.groovy.template.allow-request-override=false # Whether HttpServletRequest attributes are allowed to override (hide) controller generated model attributes of the same name.</span><br><span class="line">spring.groovy.template.allow-session-override=false # Whether HttpSession attributes are allowed to override (hide) controller generated model attributes of the same name.</span><br><span class="line">spring.groovy.template.cache=false # Whether to enable template caching.</span><br><span class="line">spring.groovy.template.charset=UTF-8 # Template encoding.</span><br><span class="line">spring.groovy.template.check-template-location=true # Whether to check that the templates location exists.</span><br><span class="line">spring.groovy.template.configuration.*= # See GroovyMarkupConfigurer</span><br><span class="line">spring.groovy.template.content-type=text/html # Content-Type value.</span><br><span class="line">spring.groovy.template.enabled=true # Whether to enable MVC view resolution for this technology.</span><br><span class="line">spring.groovy.template.expose-request-attributes=false # Whether all request attributes should be added to the model prior to merging with the template.</span><br><span class="line">spring.groovy.template.expose-session-attributes=false # Whether all HttpSession attributes should be added to the model prior to merging with the template.</span><br><span class="line">spring.groovy.template.expose-spring-macro-helpers=true # Whether to expose a RequestContext for use by Spring's macro library, under the name "springMacroRequestContext".</span><br><span class="line">spring.groovy.template.prefix= # Prefix that gets prepended to view names when building a URL.</span><br><span class="line">spring.groovy.template.request-context-attribute= # Name of the RequestContext attribute for all views.</span><br><span class="line">spring.groovy.template.resource-loader-path=classpath:/templates/ # Template path.</span><br><span class="line">spring.groovy.template.suffix=.tpl # Suffix that gets appended to view names when building a URL.</span><br><span class="line">spring.groovy.template.view-names= # White list of view names that can be resolved.</span><br><span class="line"></span><br><span class="line"># SPRING HATEOAS (HateoasProperties)</span><br><span class="line">spring.hateoas.use-hal-as-default-json-media-type=true # Whether application/hal+json responses should be sent to requests that accept application/json.</span><br><span class="line"></span><br><span class="line"># HTTP message conversion</span><br><span class="line">spring.http.converters.preferred-json-mapper= # Preferred JSON mapper to use for HTTP message conversion. By default, auto-detected according to the environment.</span><br><span class="line"></span><br><span class="line"># HTTP encoding (HttpEncodingProperties)</span><br><span class="line">spring.http.encoding.charset=UTF-8 # Charset of HTTP requests and responses. Added to the "Content-Type" header if not set explicitly.</span><br><span class="line">spring.http.encoding.enabled=true # Whether to enable http encoding support.</span><br><span class="line">spring.http.encoding.force= # Whether to force the encoding to the configured charset on HTTP requests and responses.</span><br><span class="line">spring.http.encoding.force-request= # Whether to force the encoding to the configured charset on HTTP requests. Defaults to true when "force" has not been specified.</span><br><span class="line">spring.http.encoding.force-response= # Whether to force the encoding to the configured charset on HTTP responses.</span><br><span class="line">spring.http.encoding.mapping= # Locale in which to encode mapping.</span><br><span class="line"></span><br><span class="line"># MULTIPART (MultipartProperties)</span><br><span class="line">spring.servlet.multipart.enabled=true # Whether to enable support of multipart uploads.</span><br><span class="line">spring.servlet.multipart.file-size-threshold=0 # Threshold after which files are written to disk. Values can use the suffixes "MB" or "KB" to indicate megabytes or kilobytes, respectively.</span><br><span class="line">spring.servlet.multipart.location= # Intermediate location of uploaded files.</span><br><span class="line">spring.servlet.multipart.max-file-size=1MB # Max file size. Values can use the suffixes "MB" or "KB" to indicate megabytes or kilobytes, respectively.</span><br><span class="line">spring.servlet.multipart.max-request-size=10MB # Max request size. Values can use the suffixes "MB" or "KB" to indicate megabytes or kilobytes, respectively.</span><br><span class="line">spring.servlet.multipart.resolve-lazily=false # Whether to resolve the multipart request lazily at the time of file or parameter access.</span><br><span class="line"></span><br><span class="line"># JACKSON (JacksonProperties)</span><br><span class="line">spring.jackson.date-format= # Date format string or a fully-qualified date format class name. For instance, `yyyy-MM-dd HH:mm:ss`.</span><br><span class="line">spring.jackson.default-property-inclusion= # Controls the inclusion of properties during serialization. Configured with one of the values in Jackson's JsonInclude.Include enumeration.</span><br><span class="line">spring.jackson.deserialization.*= # Jackson on/off features that affect the way Java objects are deserialized.</span><br><span class="line">spring.jackson.generator.*= # Jackson on/off features for generators.</span><br><span class="line">spring.jackson.joda-date-time-format= # Joda date time format string. If not configured, "date-format" is used as a fallback if it is configured with a format string.</span><br><span class="line">spring.jackson.locale= # Locale used for formatting.</span><br><span class="line">spring.jackson.mapper.*= # Jackson general purpose on/off features.</span><br><span class="line">spring.jackson.parser.*= # Jackson on/off features for parsers.</span><br><span class="line">spring.jackson.property-naming-strategy= # One of the constants on Jackson's PropertyNamingStrategy. Can also be a fully-qualified class name of a PropertyNamingStrategy subclass.</span><br><span class="line">spring.jackson.serialization.*= # Jackson on/off features that affect the way Java objects are serialized.</span><br><span class="line">spring.jackson.time-zone= #  Time zone used when formatting dates. For instance, "America/Los_Angeles" or "GMT+10".</span><br><span class="line"></span><br><span class="line"># GSON (GsonProperties)</span><br><span class="line">spring.gson.date-format= # Format to use when serializing Date objects.</span><br><span class="line">spring.gson.disable-html-escaping= # Whether to disable the escaping of HTML characters such as '<span class="tag">&lt;<span class="name">',</span> '&gt;</span>', etc.</span><br><span class="line">spring.gson.disable-inner-class-serialization= # Whether to exclude inner classes during serialization.</span><br><span class="line">spring.gson.enable-complex-map-key-serialization= # Whether to enable serialization of complex map keys (i.e. non-primitives).</span><br><span class="line">spring.gson.exclude-fields-without-expose-annotation= # Whether to exclude all fields from consideration for serialization or deserialization that do not have the "Expose" annotation.</span><br><span class="line">spring.gson.field-naming-policy= # Naming policy that should be applied to an object's field during serialization and deserialization.</span><br><span class="line">spring.gson.generate-non-executable-json= # Whether to generate non executable JSON by prefixing the output with some special text.</span><br><span class="line">spring.gson.lenient= # Whether to be lenient about parsing JSON that doesn't conform to RFC 4627.</span><br><span class="line">spring.gson.long-serialization-policy= # Serialization policy for Long and long types.</span><br><span class="line">spring.gson.pretty-printing= # Whether to output serialized JSON that fits in a page for pretty printing.</span><br><span class="line">spring.gson.serialize-nulls= # Whether to serialize null fields.</span><br><span class="line"></span><br><span class="line"># JERSEY (JerseyProperties)</span><br><span class="line">spring.jersey.application-path= # Path that serves as the base URI for the application. If specified, overrides the value of "@ApplicationPath".</span><br><span class="line">spring.jersey.filter.order=0 # Jersey filter chain order.</span><br><span class="line">spring.jersey.init.*= # Init parameters to pass to Jersey through the servlet or filter.</span><br><span class="line">spring.jersey.servlet.load-on-startup=-1 # Load on startup priority of the Jersey servlet.</span><br><span class="line">spring.jersey.type=servlet # Jersey integration type.</span><br><span class="line"></span><br><span class="line"># SPRING LDAP (LdapProperties)</span><br><span class="line">spring.ldap.anonymous-read-only=false # Whether read-only operations should use an anonymous environment.</span><br><span class="line">spring.ldap.base= # Base suffix from which all operations should originate.</span><br><span class="line">spring.ldap.base-environment.*= # LDAP specification settings.</span><br><span class="line">spring.ldap.password= # Login password of the server.</span><br><span class="line">spring.ldap.urls= # LDAP URLs of the server.</span><br><span class="line">spring.ldap.username= # Login username of the server.</span><br><span class="line"></span><br><span class="line"># EMBEDDED LDAP (EmbeddedLdapProperties)</span><br><span class="line">spring.ldap.embedded.base-dn= # List of base DNs.</span><br><span class="line">spring.ldap.embedded.credential.username= # Embedded LDAP username.</span><br><span class="line">spring.ldap.embedded.credential.password= # Embedded LDAP password.</span><br><span class="line">spring.ldap.embedded.ldif=classpath:schema.ldif # Schema (LDIF) script resource reference.</span><br><span class="line">spring.ldap.embedded.port=0 # Embedded LDAP port.</span><br><span class="line">spring.ldap.embedded.validation.enabled=true # Whether to enable LDAP schema validation.</span><br><span class="line">spring.ldap.embedded.validation.schema= # Path to the custom schema.</span><br><span class="line"></span><br><span class="line"># MUSTACHE TEMPLATES (MustacheAutoConfiguration)</span><br><span class="line">spring.mustache.allow-request-override=false # Whether HttpServletRequest attributes are allowed to override (hide) controller generated model attributes of the same name.</span><br><span class="line">spring.mustache.allow-session-override=false # Whether HttpSession attributes are allowed to override (hide) controller generated model attributes of the same name.</span><br><span class="line">spring.mustache.cache=false # Whether to enable template caching.</span><br><span class="line">spring.mustache.charset=UTF-8 # Template encoding.</span><br><span class="line">spring.mustache.check-template-location=true # Whether to check that the templates location exists.</span><br><span class="line">spring.mustache.content-type=text/html # Content-Type value.</span><br><span class="line">spring.mustache.enabled=true # Whether to enable MVC view resolution for this technology.</span><br><span class="line">spring.mustache.expose-request-attributes=false # Whether all request attributes should be added to the model prior to merging with the template.</span><br><span class="line">spring.mustache.expose-session-attributes=false # Whether all HttpSession attributes should be added to the model prior to merging with the template.</span><br><span class="line">spring.mustache.expose-spring-macro-helpers=true # Whether to expose a RequestContext for use by Spring's macro library, under the name "springMacroRequestContext".</span><br><span class="line">spring.mustache.prefix=classpath:/templates/ # Prefix to apply to template names.</span><br><span class="line">spring.mustache.request-context-attribute= # Name of the RequestContext attribute for all views.</span><br><span class="line">spring.mustache.suffix=.mustache # Suffix to apply to template names.</span><br><span class="line">spring.mustache.view-names= # White list of view names that can be resolved.</span><br><span class="line"></span><br><span class="line"># SPRING MVC (WebMvcProperties)</span><br><span class="line">spring.mvc.async.request-timeout= # Amount of time before asynchronous request handling times out.</span><br><span class="line">spring.mvc.contentnegotiation.favor-parameter=false # Whether a request parameter ("format" by default) should be used to determine the requested media type.</span><br><span class="line">spring.mvc.contentnegotiation.favor-path-extension=false # Whether the path extension in the URL path should be used to determine the requested media type.</span><br><span class="line">spring.mvc.contentnegotiation.media-types.*= # Map file extensions to media types for content negotiation. For instance, yml to text/yaml.</span><br><span class="line">spring.mvc.contentnegotiation.parameter-name= # Query parameter name to use when "favor-parameter" is enabled.</span><br><span class="line">spring.mvc.date-format= # Date format to use. For instance, `dd/MM/yyyy`.</span><br><span class="line">spring.mvc.dispatch-trace-request=false # Whether to dispatch TRACE requests to the FrameworkServlet doService method.</span><br><span class="line">spring.mvc.dispatch-options-request=true # Whether to dispatch OPTIONS requests to the FrameworkServlet doService method.</span><br><span class="line">spring.mvc.favicon.enabled=true # Whether to enable resolution of favicon.ico.</span><br><span class="line">spring.mvc.formcontent.putfilter.enabled=true # Whether to enable Spring's HttpPutFormContentFilter.</span><br><span class="line">spring.mvc.ignore-default-model-on-redirect=true # Whether the content of the "default" model should be ignored during redirect scenarios.</span><br><span class="line">spring.mvc.locale= # Locale to use. By default, this locale is overridden by the "Accept-Language" header.</span><br><span class="line">spring.mvc.locale-resolver=accept-header # Define how the locale should be resolved.</span><br><span class="line">spring.mvc.log-resolved-exception=false # Whether to enable warn logging of exceptions resolved by a "HandlerExceptionResolver".</span><br><span class="line">spring.mvc.message-codes-resolver-format= # Formatting strategy for message codes. For instance, `PREFIX_ERROR_CODE`.</span><br><span class="line">spring.mvc.pathmatch.use-registered-suffix-pattern=false # Whether suffix pattern matching should work only against extensions registered with "spring.mvc.contentnegotiation.media-types.*".</span><br><span class="line">spring.mvc.pathmatch.use-suffix-pattern=false # Whether to use suffix pattern match (".*") when matching patterns to requests.</span><br><span class="line">spring.mvc.servlet.load-on-startup=-1 # Load on startup priority of the dispatcher servlet.</span><br><span class="line">spring.mvc.servlet.path=/ # Path of the dispatcher servlet.</span><br><span class="line">spring.mvc.static-path-pattern=/** # Path pattern used for static resources.</span><br><span class="line">spring.mvc.throw-exception-if-no-handler-found=false # Whether a "NoHandlerFoundException" should be thrown if no Handler was found to process a request.</span><br><span class="line">spring.mvc.view.prefix= # Spring MVC view prefix.</span><br><span class="line">spring.mvc.view.suffix= # Spring MVC view suffix.</span><br><span class="line"></span><br><span class="line"># SPRING RESOURCES HANDLING (ResourceProperties)</span><br><span class="line">spring.resources.add-mappings=true # Whether to enable default resource handling.</span><br><span class="line">spring.resources.cache.cachecontrol.cache-private= # Indicate that the response message is intended for a single user and must not be stored by a shared cache.</span><br><span class="line">spring.resources.cache.cachecontrol.cache-public= # Indicate that any cache may store the response.</span><br><span class="line">spring.resources.cache.cachecontrol.max-age= # Maximum time the response should be cached, in seconds if no duration suffix is not specified.</span><br><span class="line">spring.resources.cache.cachecontrol.must-revalidate= # Indicate that once it has become stale, a cache must not use the response without re-validating it with the server.</span><br><span class="line">spring.resources.cache.cachecontrol.no-cache= # Indicate that the cached response can be reused only if re-validated with the server.</span><br><span class="line">spring.resources.cache.cachecontrol.no-store= # Indicate to not cache the response in any case.</span><br><span class="line">spring.resources.cache.cachecontrol.no-transform= # Indicate intermediaries (caches and others) that they should not transform the response content.</span><br><span class="line">spring.resources.cache.cachecontrol.proxy-revalidate= # Same meaning as the "must-revalidate" directive, except that it does not apply to private caches.</span><br><span class="line">spring.resources.cache.cachecontrol.s-max-age= # Maximum time the response should be cached by shared caches, in seconds if no duration suffix is not specified.</span><br><span class="line">spring.resources.cache.cachecontrol.stale-if-error= # Maximum time the response may be used when errors are encountered, in seconds if no duration suffix is not specified.</span><br><span class="line">spring.resources.cache.cachecontrol.stale-while-revalidate= # Maximum time the response can be served after it becomes stale, in seconds if no duration suffix is not specified.</span><br><span class="line">spring.resources.cache.period= # Cache period for the resources served by the resource handler. If a duration suffix is not specified, seconds will be used.</span><br><span class="line">spring.resources.chain.cache=true # Whether to enable caching in the Resource chain.</span><br><span class="line">spring.resources.chain.enabled= # Whether to enable the Spring Resource Handling chain. By default, disabled unless at least one strategy has been enabled.</span><br><span class="line">spring.resources.chain.gzipped=false # Whether to enable resolution of already gzipped resources.</span><br><span class="line">spring.resources.chain.html-application-cache=false # Whether to enable HTML5 application cache manifest rewriting.</span><br><span class="line">spring.resources.chain.strategy.content.enabled=false # Whether to enable the content Version Strategy.</span><br><span class="line">spring.resources.chain.strategy.content.paths=/** # Comma-separated list of patterns to apply to the content Version Strategy.</span><br><span class="line">spring.resources.chain.strategy.fixed.enabled=false # Whether to enable the fixed Version Strategy.</span><br><span class="line">spring.resources.chain.strategy.fixed.paths=/** # Comma-separated list of patterns to apply to the fixed Version Strategy.</span><br><span class="line">spring.resources.chain.strategy.fixed.version= # Version string to use for the fixed Version Strategy.</span><br><span class="line">spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ # Locations of static resources.</span><br><span class="line"></span><br><span class="line"># SPRING SESSION (SessionProperties)</span><br><span class="line">spring.session.store-type= # Session store type.</span><br><span class="line">spring.session.timeout= # Session timeout. If a duration suffix is not specified, seconds will be used.</span><br><span class="line">spring.session.servlet.filter-order=-2147483598 # Session repository filter order.</span><br><span class="line">spring.session.servlet.filter-dispatcher-types=async,error,request # Session repository filter dispatcher types.</span><br><span class="line"></span><br><span class="line"># SPRING SESSION HAZELCAST (HazelcastSessionProperties)</span><br><span class="line">spring.session.hazelcast.flush-mode=on-save # Sessions flush mode.</span><br><span class="line">spring.session.hazelcast.map-name=spring:session:sessions # Name of the map used to store sessions.</span><br><span class="line"></span><br><span class="line"># SPRING SESSION JDBC (JdbcSessionProperties)</span><br><span class="line">spring.session.jdbc.cleanup-cron=0 * * * * * # Cron expression for expired session cleanup job.</span><br><span class="line">spring.session.jdbc.initialize-schema=embedded # Database schema initialization mode.</span><br><span class="line">spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema.</span><br><span class="line">spring.session.jdbc.table-name=SPRING_SESSION # Name of the database table used to store sessions.</span><br><span class="line"></span><br><span class="line"># SPRING SESSION MONGODB (MongoSessionProperties)</span><br><span class="line">spring.session.mongodb.collection-name=sessions # Collection name used to store sessions.</span><br><span class="line"></span><br><span class="line"># SPRING SESSION REDIS (RedisSessionProperties)</span><br><span class="line">spring.session.redis.cleanup-cron=0 * * * * * # Cron expression for expired session cleanup job.</span><br><span class="line">spring.session.redis.flush-mode=on-save # Sessions flush mode.</span><br><span class="line">spring.session.redis.namespace=spring:session # Namespace for keys used to store sessions.</span><br><span class="line"></span><br><span class="line"># THYMELEAF (ThymeleafAutoConfiguration)</span><br><span class="line">spring.thymeleaf.cache=true # Whether to enable template caching.</span><br><span class="line">spring.thymeleaf.check-template=true # Whether to check that the template exists before rendering it.</span><br><span class="line">spring.thymeleaf.check-template-location=true # Whether to check that the templates location exists.</span><br><span class="line">spring.thymeleaf.enabled=true # Whether to enable Thymeleaf view resolution for Web frameworks.</span><br><span class="line">spring.thymeleaf.enable-spring-el-compiler=false # Enable the SpringEL compiler in SpringEL expressions.</span><br><span class="line">spring.thymeleaf.encoding=UTF-8 # Template files encoding.</span><br><span class="line">spring.thymeleaf.excluded-view-names= # Comma-separated list of view names (patterns allowed) that should be excluded from resolution.</span><br><span class="line">spring.thymeleaf.mode=HTML # Template mode to be applied to templates. See also Thymeleaf's TemplateMode enum.</span><br><span class="line">spring.thymeleaf.prefix=classpath:/templates/ # Prefix that gets prepended to view names when building a URL.</span><br><span class="line">spring.thymeleaf.reactive.chunked-mode-view-names= # Comma-separated list of view names (patterns allowed) that should be the only ones executed in CHUNKED mode when a max chunk size is set.</span><br><span class="line">spring.thymeleaf.reactive.full-mode-view-names= # Comma-separated list of view names (patterns allowed) that should be executed in FULL mode even if a max chunk size is set.</span><br><span class="line">spring.thymeleaf.reactive.max-chunk-size=0 # Maximum size of data buffers used for writing to the response, in bytes.</span><br><span class="line">spring.thymeleaf.reactive.media-types= # Media types supported by the view technology.</span><br><span class="line">spring.thymeleaf.servlet.content-type=text/html # Content-Type value written to HTTP responses.</span><br><span class="line">spring.thymeleaf.suffix=.html # Suffix that gets appended to view names when building a URL.</span><br><span class="line">spring.thymeleaf.template-resolver-order= # Order of the template resolver in the chain.</span><br><span class="line">spring.thymeleaf.view-names= # Comma-separated list of view names (patterns allowed) that can be resolved.</span><br><span class="line"></span><br><span class="line"># SPRING WEBFLUX (WebFluxProperties)</span><br><span class="line">spring.webflux.date-format= # Date format to use. For instance, `dd/MM/yyyy`.</span><br><span class="line">spring.webflux.static-path-pattern=/** # Path pattern used for static resources.</span><br><span class="line"></span><br><span class="line"># SPRING WEB SERVICES (WebServicesProperties)</span><br><span class="line">spring.webservices.path=/services # Path that serves as the base URI for the services.</span><br><span class="line">spring.webservices.servlet.init= # Servlet init parameters to pass to Spring Web Services.</span><br><span class="line">spring.webservices.servlet.load-on-startup=-1 # Load on startup priority of the Spring Web Services servlet.</span><br><span class="line">spring.webservices.wsdl-locations= # Comma-separated list of locations of WSDLs and accompanying XSDs to be exposed as beans.</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># ----------------------------------------</span><br><span class="line"># SECURITY PROPERTIES</span><br><span class="line"># ----------------------------------------</span><br><span class="line"># SECURITY (SecurityProperties)</span><br><span class="line">spring.security.filter.order=-100 # Security filter chain order.</span><br><span class="line">spring.security.filter.dispatcher-types=async,error,request # Security filter chain dispatcher types.</span><br><span class="line">spring.security.user.name=user # Default user name.</span><br><span class="line">spring.security.user.password= # Password for the default user name.</span><br><span class="line">spring.security.user.roles= # Granted roles for the default user name.</span><br><span class="line"></span><br><span class="line"># SECURITY OAUTH2 CLIENT (OAuth2ClientProperties)</span><br><span class="line">spring.security.oauth2.client.provider.*= # OAuth provider details.</span><br><span class="line">spring.security.oauth2.client.registration.*= # OAuth client registrations.</span><br><span class="line"></span><br><span class="line"># ----------------------------------------</span><br><span class="line"># DATA PROPERTIES</span><br><span class="line"># ----------------------------------------</span><br><span class="line"></span><br><span class="line"># FLYWAY (FlywayProperties)</span><br><span class="line">spring.flyway.baseline-description= #</span><br><span class="line">spring.flyway.baseline-on-migrate= #</span><br><span class="line">spring.flyway.baseline-version=1 # Version to start migration</span><br><span class="line">spring.flyway.check-location=true # Whether to check that migration scripts location exists.</span><br><span class="line">spring.flyway.clean-disabled= #</span><br><span class="line">spring.flyway.clean-on-validation-error= #</span><br><span class="line">spring.flyway.dry-run-output= #</span><br><span class="line">spring.flyway.enabled=true # Whether to enable flyway.</span><br><span class="line">spring.flyway.encoding= #</span><br><span class="line">spring.flyway.error-handlers= #</span><br><span class="line">spring.flyway.group= #</span><br><span class="line">spring.flyway.ignore-future-migrations= #</span><br><span class="line">spring.flyway.ignore-missing-migrations= #</span><br><span class="line">spring.flyway.init-sqls= # SQL statements to execute to initialize a connection immediately after obtaining it.</span><br><span class="line">spring.flyway.installed-by= #</span><br><span class="line">spring.flyway.locations=classpath:db/migration # The locations of migrations scripts.</span><br><span class="line">spring.flyway.mixed= #</span><br><span class="line">spring.flyway.out-of-order= #</span><br><span class="line">spring.flyway.password= # JDBC password to use if you want Flyway to create its own DataSource.</span><br><span class="line">spring.flyway.placeholder-prefix= #</span><br><span class="line">spring.flyway.placeholder-replacement= #</span><br><span class="line">spring.flyway.placeholder-suffix= #</span><br><span class="line">spring.flyway.placeholders.*= #</span><br><span class="line">spring.flyway.repeatable-sql-migration-prefix= #</span><br><span class="line">spring.flyway.schemas= # schemas to update</span><br><span class="line">spring.flyway.skip-default-callbacks= #</span><br><span class="line">spring.flyway.skip-default-resolvers= #</span><br><span class="line">spring.flyway.sql-migration-prefix=V #</span><br><span class="line">spring.flyway.sql-migration-separator= #</span><br><span class="line">spring.flyway.sql-migration-suffix=.sql #</span><br><span class="line">spring.flyway.sql-migration-suffixes= #</span><br><span class="line">spring.flyway.table= #</span><br><span class="line">spring.flyway.target= #</span><br><span class="line">spring.flyway.undo-sql-migration-prefix= #</span><br><span class="line">spring.flyway.url= # JDBC url of the database to migrate. If not set, the primary configured data source is used.</span><br><span class="line">spring.flyway.user= # Login user of the database to migrate.</span><br><span class="line">spring.flyway.validate-on-migrate= #</span><br><span class="line"></span><br><span class="line"># LIQUIBASE (LiquibaseProperties)</span><br><span class="line">spring.liquibase.change-log=classpath:/db/changelog/db.changelog-master.yaml # Change log configuration path.</span><br><span class="line">spring.liquibase.check-change-log-location=true # Whether to check that the change log location exists.</span><br><span class="line">spring.liquibase.contexts= # Comma-separated list of runtime contexts to use.</span><br><span class="line">spring.liquibase.default-schema= # Default database schema.</span><br><span class="line">spring.liquibase.drop-first=false # Whether to first drop the database schema.</span><br><span class="line">spring.liquibase.enabled=true # Whether to enable Liquibase support.</span><br><span class="line">spring.liquibase.labels= # Comma-separated list of runtime labels to use.</span><br><span class="line">spring.liquibase.parameters.*= # Change log parameters.</span><br><span class="line">spring.liquibase.password= # Login password of the database to migrate.</span><br><span class="line">spring.liquibase.rollback-file= # File to which rollback SQL is written when an update is performed.</span><br><span class="line">spring.liquibase.test-rollback-on-update=false # Whether rollback should be tested before update is performed.</span><br><span class="line">spring.liquibase.url= # JDBC URL of the database to migrate. If not set, the primary configured data source is used.</span><br><span class="line">spring.liquibase.user= # Login user of the database to migrate.</span><br><span class="line"></span><br><span class="line"># COUCHBASE (CouchbaseProperties)</span><br><span class="line">spring.couchbase.bootstrap-hosts= # Couchbase nodes (host or IP address) to bootstrap from.</span><br><span class="line">spring.couchbase.bucket.name=default # Name of the bucket to connect to.</span><br><span class="line">spring.couchbase.bucket.password=  # Password of the bucket.</span><br><span class="line">spring.couchbase.env.endpoints.key-value=1 # Number of sockets per node against the key/value service.</span><br><span class="line">spring.couchbase.env.endpoints.queryservice.min-endpoints=1 # Minimum number of sockets per node.</span><br><span class="line">spring.couchbase.env.endpoints.queryservice.max-endpoints=1 # Maximum number of sockets per node.</span><br><span class="line">spring.couchbase.env.endpoints.viewservice.min-endpoints=1 # Minimum number of sockets per node.</span><br><span class="line">spring.couchbase.env.endpoints.viewservice.max-endpoints=1 # Maximum number of sockets per node.</span><br><span class="line">spring.couchbase.env.ssl.enabled= # Whether to enable SSL support. Enabled automatically if a "keyStore" is provided unless specified otherwise.</span><br><span class="line">spring.couchbase.env.ssl.key-store= # Path to the JVM key store that holds the certificates.</span><br><span class="line">spring.couchbase.env.ssl.key-store-password= # Password used to access the key store.</span><br><span class="line">spring.couchbase.env.timeouts.connect=5000ms # Bucket connections timeouts.</span><br><span class="line">spring.couchbase.env.timeouts.key-value=2500ms # Blocking operations performed on a specific key timeout.</span><br><span class="line">spring.couchbase.env.timeouts.query=7500ms # N1QL query operations timeout.</span><br><span class="line">spring.couchbase.env.timeouts.socket-connect=1000ms # Socket connect connections timeout.</span><br><span class="line">spring.couchbase.env.timeouts.view=7500ms # Regular and geospatial view operations timeout.</span><br><span class="line"></span><br><span class="line"># DAO (PersistenceExceptionTranslationAutoConfiguration)</span><br><span class="line">spring.dao.exceptiontranslation.enabled=true # Whether to enable the PersistenceExceptionTranslationPostProcessor.</span><br><span class="line"></span><br><span class="line"># CASSANDRA (CassandraProperties)</span><br><span class="line">spring.data.cassandra.cluster-name= # Name of the Cassandra cluster.</span><br><span class="line">spring.data.cassandra.compression=none # Compression supported by the Cassandra binary protocol.</span><br><span class="line">spring.data.cassandra.connect-timeout= # Socket option: connection time out.</span><br><span class="line">spring.data.cassandra.consistency-level= # Queries consistency level.</span><br><span class="line">spring.data.cassandra.contact-points=localhost # Cluster node addresses.</span><br><span class="line">spring.data.cassandra.fetch-size= # Queries default fetch size.</span><br><span class="line">spring.data.cassandra.keyspace-name= # Keyspace name to use.</span><br><span class="line">spring.data.cassandra.load-balancing-policy= # Class name of the load balancing policy.</span><br><span class="line">spring.data.cassandra.port= # Port of the Cassandra server.</span><br><span class="line">spring.data.cassandra.password= # Login password of the server.</span><br><span class="line">spring.data.cassandra.pool.heartbeat-interval=30s # Heartbeat interval after which a message is sent on an idle connection to make sure it's still alive. If a duration suffix is not specified, seconds will be used.</span><br><span class="line">spring.data.cassandra.pool.idle-timeout=120s # Idle timeout before an idle connection is removed. If a duration suffix is not specified, seconds will be used.</span><br><span class="line">spring.data.cassandra.pool.max-queue-size=256 # Maximum number of requests that get queued if no connection is available.</span><br><span class="line">spring.data.cassandra.pool.pool-timeout=5000ms # Pool timeout when trying to acquire a connection from a host's pool.</span><br><span class="line">spring.data.cassandra.read-timeout= # Socket option: read time out.</span><br><span class="line">spring.data.cassandra.reconnection-policy= # Reconnection policy class.</span><br><span class="line">spring.data.cassandra.repositories.type=auto # Type of Cassandra repositories to enable.</span><br><span class="line">spring.data.cassandra.retry-policy= # Class name of the retry policy.</span><br><span class="line">spring.data.cassandra.serial-consistency-level= # Queries serial consistency level.</span><br><span class="line">spring.data.cassandra.schema-action=none # Schema action to take at startup.</span><br><span class="line">spring.data.cassandra.ssl=false # Enable SSL support.</span><br><span class="line">spring.data.cassandra.username= # Login user of the server.</span><br><span class="line"></span><br><span class="line"># DATA COUCHBASE (CouchbaseDataProperties)</span><br><span class="line">spring.data.couchbase.auto-index=false # Automatically create views and indexes.</span><br><span class="line">spring.data.couchbase.consistency=read-your-own-writes # Consistency to apply by default on generated queries.</span><br><span class="line">spring.data.couchbase.repositories.type=auto # Type of Couchbase repositories to enable.</span><br><span class="line"></span><br><span class="line"># ELASTICSEARCH (ElasticsearchProperties)</span><br><span class="line">spring.data.elasticsearch.cluster-name=elasticsearch # Elasticsearch cluster name.</span><br><span class="line">spring.data.elasticsearch.cluster-nodes= # Comma-separated list of cluster node addresses.</span><br><span class="line">spring.data.elasticsearch.properties.*= # Additional properties used to configure the client.</span><br><span class="line">spring.data.elasticsearch.repositories.enabled=true # Whether to enable Elasticsearch repositories.</span><br><span class="line"></span><br><span class="line"># DATA LDAP</span><br><span class="line">spring.data.ldap.repositories.enabled=true # Whether to enable LDAP repositories.</span><br><span class="line"></span><br><span class="line"># MONGODB (MongoProperties)</span><br><span class="line">spring.data.mongodb.authentication-database= # Authentication database name.</span><br><span class="line">spring.data.mongodb.database= # Database name.</span><br><span class="line">spring.data.mongodb.field-naming-strategy= # Fully qualified name of the FieldNamingStrategy to use.</span><br><span class="line">spring.data.mongodb.grid-fs-database= # GridFS database name.</span><br><span class="line">spring.data.mongodb.host= # Mongo server host. Cannot be set with URI.</span><br><span class="line">spring.data.mongodb.password= # Login password of the mongo server. Cannot be set with URI.</span><br><span class="line">spring.data.mongodb.port= # Mongo server port. Cannot be set with URI.</span><br><span class="line">spring.data.mongodb.repositories.type=auto # Type of Mongo repositories to enable.</span><br><span class="line">spring.data.mongodb.uri=mongodb://localhost/test # Mongo database URI. Cannot be set with host, port and credentials.</span><br><span class="line">spring.data.mongodb.username= # Login user of the mongo server. Cannot be set with URI.</span><br><span class="line"></span><br><span class="line"># DATA REDIS</span><br><span class="line">spring.data.redis.repositories.enabled=true # Whether to enable Redis repositories.</span><br><span class="line"></span><br><span class="line"># NEO4J (Neo4jProperties)</span><br><span class="line">spring.data.neo4j.auto-index=none # Auto index mode.</span><br><span class="line">spring.data.neo4j.embedded.enabled=true # Whether to enable embedded mode if the embedded driver is available.</span><br><span class="line">spring.data.neo4j.open-in-view=true # Register OpenSessionInViewInterceptor. Binds a Neo4j Session to the thread for the entire processing of the request.</span><br><span class="line">spring.data.neo4j.password= # Login password of the server.</span><br><span class="line">spring.data.neo4j.repositories.enabled=true # Whether to enable Neo4j repositories.</span><br><span class="line">spring.data.neo4j.uri= # URI used by the driver. Auto-detected by default.</span><br><span class="line">spring.data.neo4j.username= # Login user of the server.</span><br><span class="line"></span><br><span class="line"># DATA REST (RepositoryRestProperties)</span><br><span class="line">spring.data.rest.base-path= # Base path to be used by Spring Data REST to expose repository resources.</span><br><span class="line">spring.data.rest.default-media-type= # Content type to use as a default when none is specified.</span><br><span class="line">spring.data.rest.default-page-size= # Default size of pages.</span><br><span class="line">spring.data.rest.detection-strategy=default # Strategy to use to determine which repositories get exposed.</span><br><span class="line">spring.data.rest.enable-enum-translation= # Whether to enable enum value translation through the Spring Data REST default resource bundle.</span><br><span class="line">spring.data.rest.limit-param-name= # Name of the URL query string parameter that indicates how many results to return at once.</span><br><span class="line">spring.data.rest.max-page-size= # Maximum size of pages.</span><br><span class="line">spring.data.rest.page-param-name= # Name of the URL query string parameter that indicates what page to return.</span><br><span class="line">spring.data.rest.return-body-on-create= # Whether to return a response body after creating an entity.</span><br><span class="line">spring.data.rest.return-body-on-update= # Whether to return a response body after updating an entity.</span><br><span class="line">spring.data.rest.sort-param-name= # Name of the URL query string parameter that indicates what direction to sort results.</span><br><span class="line"></span><br><span class="line"># SOLR (SolrProperties)</span><br><span class="line">spring.data.solr.host=http://127.0.0.1:8983/solr # Solr host. Ignored if "zk-host" is set.</span><br><span class="line">spring.data.solr.repositories.enabled=true # Whether to enable Solr repositories.</span><br><span class="line">spring.data.solr.zk-host= # ZooKeeper host address in the form HOST:PORT.</span><br><span class="line"></span><br><span class="line"># DATA WEB (SpringDataWebProperties)</span><br><span class="line">spring.data.web.pageable.default-page-size=20 # Default page size.</span><br><span class="line">spring.data.web.pageable.max-page-size=2000 # Maximum page size to be accepted.</span><br><span class="line">spring.data.web.pageable.one-indexed-parameters=false # Whether to expose and assume 1-based page number indexes.</span><br><span class="line">spring.data.web.pageable.page-parameter=page # Page index parameter name.</span><br><span class="line">spring.data.web.pageable.prefix= # General prefix to be prepended to the page number and page size parameters.</span><br><span class="line">spring.data.web.pageable.qualifier-delimiter=_ # Delimiter to be used between the qualifier and the actual page number and size properties.</span><br><span class="line">spring.data.web.pageable.size-parameter=size # Page size parameter name.</span><br><span class="line">spring.data.web.sort.sort-parameter=sort # Sort parameter name.</span><br><span class="line"></span><br><span class="line"># DATASOURCE (DataSourceAutoConfiguration &amp; DataSourceProperties)</span><br><span class="line">spring.datasource.continue-on-error=false # Whether to stop if an error occurs while initializing the database.</span><br><span class="line">spring.datasource.data= # Data (DML) script resource references.</span><br><span class="line">spring.datasource.data-username= # Username of the database to execute DML scripts (if different).</span><br><span class="line">spring.datasource.data-password= # Password of the database to execute DML scripts (if different).</span><br><span class="line">spring.datasource.dbcp2.*= # Commons DBCP2 specific settings</span><br><span class="line">spring.datasource.driver-class-name= # Fully qualified name of the JDBC driver. Auto-detected based on the URL by default.</span><br><span class="line">spring.datasource.generate-unique-name=false # Whether to generate a random datasource name.</span><br><span class="line">spring.datasource.hikari.*= # Hikari specific settings</span><br><span class="line">spring.datasource.initialization-mode=embedded # Initialize the datasource with available DDL and DML scripts.</span><br><span class="line">spring.datasource.jmx-enabled=false # Whether to enable JMX support (if provided by the underlying pool).</span><br><span class="line">spring.datasource.jndi-name= # JNDI location of the datasource. Class, url, username &amp; password are ignored when set.</span><br><span class="line">spring.datasource.name= # Name of the datasource. Default to "testdb" when using an embedded database.</span><br><span class="line">spring.datasource.password= # Login password of the database.</span><br><span class="line">spring.datasource.platform=all # Platform to use in the DDL or DML scripts (such as schema-$&#123;platform&#125;.sql or data-$&#123;platform&#125;.sql).</span><br><span class="line">spring.datasource.schema= # Schema (DDL) script resource references.</span><br><span class="line">spring.datasource.schema-username= # Username of the database to execute DDL scripts (if different).</span><br><span class="line">spring.datasource.schema-password= # Password of the database to execute DDL scripts (if different).</span><br><span class="line">spring.datasource.separator=; # Statement separator in SQL initialization scripts.</span><br><span class="line">spring.datasource.sql-script-encoding= # SQL scripts encoding.</span><br><span class="line">spring.datasource.tomcat.*= # Tomcat datasource specific settings</span><br><span class="line">spring.datasource.type= # Fully qualified name of the connection pool implementation to use. By default, it is auto-detected from the classpath.</span><br><span class="line">spring.datasource.url= # JDBC URL of the database.</span><br><span class="line">spring.datasource.username= # Login username of the database.</span><br><span class="line">spring.datasource.xa.data-source-class-name= # XA datasource fully qualified name.</span><br><span class="line">spring.datasource.xa.properties= # Properties to pass to the XA data source.</span><br><span class="line"></span><br><span class="line"># JEST (Elasticsearch HTTP client) (JestProperties)</span><br><span class="line">spring.elasticsearch.jest.connection-timeout=3s # Connection timeout.</span><br><span class="line">spring.elasticsearch.jest.multi-threaded=true # Whether to enable connection requests from multiple execution threads.</span><br><span class="line">spring.elasticsearch.jest.password= # Login password.</span><br><span class="line">spring.elasticsearch.jest.proxy.host= # Proxy host the HTTP client should use.</span><br><span class="line">spring.elasticsearch.jest.proxy.port= # Proxy port the HTTP client should use.</span><br><span class="line">spring.elasticsearch.jest.read-timeout=3s # Read timeout.</span><br><span class="line">spring.elasticsearch.jest.uris=http://localhost:9200 # Comma-separated list of the Elasticsearch instances to use.</span><br><span class="line">spring.elasticsearch.jest.username= # Login username.</span><br><span class="line"></span><br><span class="line"># Elasticsearch REST clients (RestClientProperties)</span><br><span class="line">spring.elasticsearch.rest.password= # Credentials username.</span><br><span class="line">   spring.elasticsearch.rest.uris=http://localhost:9200 # Comma-separated list of the Elasticsearch instances to use.</span><br><span class="line">   spring.elasticsearch.rest.username= # Credentials password.</span><br><span class="line"></span><br><span class="line"># H2 Web Console (H2ConsoleProperties)</span><br><span class="line">spring.h2.console.enabled=false # Whether to enable the console.</span><br><span class="line">spring.h2.console.path=/h2-console # Path at which the console is available.</span><br><span class="line">spring.h2.console.settings.trace=false # Whether to enable trace output.</span><br><span class="line">spring.h2.console.settings.web-allow-others=false # Whether to enable remote access.</span><br><span class="line"></span><br><span class="line"># InfluxDB (InfluxDbProperties)</span><br><span class="line">spring.influx.password= # Login password.</span><br><span class="line">spring.influx.url= # URL of the InfluxDB instance to which to connect.</span><br><span class="line">spring.influx.user= # Login user.</span><br><span class="line"></span><br><span class="line"># JOOQ (JooqProperties)</span><br><span class="line">spring.jooq.sql-dialect= # SQL dialect to use. Auto-detected by default.</span><br><span class="line"></span><br><span class="line"># JDBC (JdbcProperties)</span><br><span class="line">spring.jdbc.template.fetch-size=-1 # Number of rows that should be fetched from the database when more rows are needed.</span><br><span class="line">spring.jdbc.template.max-rows=-1 # Maximum number of rows.</span><br><span class="line">spring.jdbc.template.query-timeout= # Query timeout. Default is to use the JDBC driver's default configuration. If a duration suffix is not specified, seconds will be used.</span><br><span class="line"></span><br><span class="line"># JPA (JpaBaseConfiguration, HibernateJpaAutoConfiguration)</span><br><span class="line">spring.data.jpa.repositories.enabled=true # Whether to enable JPA repositories.</span><br><span class="line">spring.jpa.database= # Target database to operate on, auto-detected by default. Can be alternatively set using the "databasePlatform" property.</span><br><span class="line">spring.jpa.database-platform= # Name of the target database to operate on, auto-detected by default. Can be alternatively set using the "Database" enum.</span><br><span class="line">spring.jpa.generate-ddl=false # Whether to initialize the schema on startup.</span><br><span class="line">spring.jpa.hibernate.ddl-auto= # DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto" property. Defaults to "create-drop" when using an embedded database and no schema manager was detected. Otherwise, defaults to "none".</span><br><span class="line">spring.jpa.hibernate.naming.implicit-strategy= # Fully qualified name of the implicit naming strategy.</span><br><span class="line">spring.jpa.hibernate.naming.physical-strategy= # Fully qualified name of the physical naming strategy.</span><br><span class="line">spring.jpa.hibernate.use-new-id-generator-mappings= # Whether to use Hibernate's newer IdentifierGenerator for AUTO, TABLE and SEQUENCE.</span><br><span class="line">spring.jpa.mapping-resources= # Mapping resources (equivalent to "mapping-file" entries in persistence.xml).</span><br><span class="line">spring.jpa.open-in-view=true # Register OpenEntityManagerInViewInterceptor. Binds a JPA EntityManager to the thread for the entire processing of the request.</span><br><span class="line">spring.jpa.properties.*= # Additional native properties to set on the JPA provider.</span><br><span class="line">spring.jpa.show-sql=false # Whether to enable logging of SQL statements.</span><br><span class="line"></span><br><span class="line"># JTA (JtaAutoConfiguration)</span><br><span class="line">spring.jta.enabled=true # Whether to enable JTA support.</span><br><span class="line">spring.jta.log-dir= # Transaction logs directory.</span><br><span class="line">spring.jta.transaction-manager-id= # Transaction manager unique identifier.</span><br><span class="line"></span><br><span class="line"># ATOMIKOS (AtomikosProperties)</span><br><span class="line">spring.jta.atomikos.connectionfactory.borrow-connection-timeout=30 # Timeout, in seconds, for borrowing connections from the pool.</span><br><span class="line">spring.jta.atomikos.connectionfactory.ignore-session-transacted-flag=true # Whether to ignore the transacted flag when creating session.</span><br><span class="line">spring.jta.atomikos.connectionfactory.local-transaction-mode=false # Whether local transactions are desired.</span><br><span class="line">spring.jta.atomikos.connectionfactory.maintenance-interval=60 # The time, in seconds, between runs of the pool's maintenance thread.</span><br><span class="line">spring.jta.atomikos.connectionfactory.max-idle-time=60 # The time, in seconds, after which connections are cleaned up from the pool.</span><br><span class="line">spring.jta.atomikos.connectionfactory.max-lifetime=0 # The time, in seconds, that a connection can be pooled for before being destroyed. 0 denotes no limit.</span><br><span class="line">spring.jta.atomikos.connectionfactory.max-pool-size=1 # The maximum size of the pool.</span><br><span class="line">spring.jta.atomikos.connectionfactory.min-pool-size=1 # The minimum size of the pool.</span><br><span class="line">spring.jta.atomikos.connectionfactory.reap-timeout=0 # The reap timeout, in seconds, for borrowed connections. 0 denotes no limit.</span><br><span class="line">spring.jta.atomikos.connectionfactory.unique-resource-name=jmsConnectionFactory # The unique name used to identify the resource during recovery.</span><br><span class="line">spring.jta.atomikos.connectionfactory.xa-connection-factory-class-name= # Vendor-specific implementation of XAConnectionFactory.</span><br><span class="line">spring.jta.atomikos.connectionfactory.xa-properties= # Vendor-specific XA properties.</span><br><span class="line">spring.jta.atomikos.datasource.borrow-connection-timeout=30 # Timeout, in seconds, for borrowing connections from the pool.</span><br><span class="line">spring.jta.atomikos.datasource.concurrent-connection-validation= # Whether to use concurrent connection validation.</span><br><span class="line">spring.jta.atomikos.datasource.default-isolation-level= # Default isolation level of connections provided by the pool.</span><br><span class="line">spring.jta.atomikos.datasource.login-timeout= # Timeout, in seconds, for establishing a database connection.</span><br><span class="line">spring.jta.atomikos.datasource.maintenance-interval=60 # The time, in seconds, between runs of the pool's maintenance thread.</span><br><span class="line">spring.jta.atomikos.datasource.max-idle-time=60 # The time, in seconds, after which connections are cleaned up from the pool.</span><br><span class="line">spring.jta.atomikos.datasource.max-lifetime=0 # The time, in seconds, that a connection can be pooled for before being destroyed. 0 denotes no limit.</span><br><span class="line">spring.jta.atomikos.datasource.max-pool-size=1 # The maximum size of the pool.</span><br><span class="line">spring.jta.atomikos.datasource.min-pool-size=1 # The minimum size of the pool.</span><br><span class="line">spring.jta.atomikos.datasource.reap-timeout=0 # The reap timeout, in seconds, for borrowed connections. 0 denotes no limit.</span><br><span class="line">spring.jta.atomikos.datasource.test-query= # SQL query or statement used to validate a connection before returning it.</span><br><span class="line">spring.jta.atomikos.datasource.unique-resource-name=dataSource # The unique name used to identify the resource during recovery.</span><br><span class="line">spring.jta.atomikos.datasource.xa-data-source-class-name= # Vendor-specific implementation of XAConnectionFactory.</span><br><span class="line">spring.jta.atomikos.datasource.xa-properties= # Vendor-specific XA properties.</span><br><span class="line">spring.jta.atomikos.properties.allow-sub-transactions=true # Specify whether sub-transactions are allowed.</span><br><span class="line">spring.jta.atomikos.properties.checkpoint-interval=500 # Interval between checkpoints, expressed as the number of log writes between two checkpoints.</span><br><span class="line">spring.jta.atomikos.properties.default-jta-timeout=10000ms # Default timeout for JTA transactions.</span><br><span class="line">spring.jta.atomikos.properties.default-max-wait-time-on-shutdown=9223372036854775807 # How long should normal shutdown (no-force) wait for transactions to complete.</span><br><span class="line">spring.jta.atomikos.properties.enable-logging=true # Whether to enable disk logging.</span><br><span class="line">spring.jta.atomikos.properties.force-shutdown-on-vm-exit=false # Whether a VM shutdown should trigger forced shutdown of the transaction core.</span><br><span class="line">spring.jta.atomikos.properties.log-base-dir= # Directory in which the log files should be stored.</span><br><span class="line">spring.jta.atomikos.properties.log-base-name=tmlog # Transactions log file base name.</span><br><span class="line">spring.jta.atomikos.properties.max-actives=50 # Maximum number of active transactions.</span><br><span class="line">spring.jta.atomikos.properties.max-timeout=300000ms # Maximum timeout that can be allowed for transactions.</span><br><span class="line">spring.jta.atomikos.properties.recovery.delay=10000ms # Delay between two recovery scans.</span><br><span class="line">spring.jta.atomikos.properties.recovery.forget-orphaned-log-entries-delay=86400000ms # Delay after which recovery can cleanup pending ('orphaned') log entries.</span><br><span class="line">spring.jta.atomikos.properties.recovery.max-retries=5 # Number of retry attempts to commit the transaction before throwing an exception.</span><br><span class="line">spring.jta.atomikos.properties.recovery.retry-interval=10000ms # Delay between retry attempts.</span><br><span class="line">spring.jta.atomikos.properties.serial-jta-transactions=true # Whether sub-transactions should be joined when possible.</span><br><span class="line">spring.jta.atomikos.properties.service= # Transaction manager implementation that should be started.</span><br><span class="line">spring.jta.atomikos.properties.threaded-two-phase-commit=false # Whether to use different (and concurrent) threads for two-phase commit on the participating resources.</span><br><span class="line">spring.jta.atomikos.properties.transaction-manager-unique-name= # The transaction manager's unique name.</span><br><span class="line"></span><br><span class="line"># BITRONIX</span><br><span class="line">spring.jta.bitronix.connectionfactory.acquire-increment=1 # Number of connections to create when growing the pool.</span><br><span class="line">spring.jta.bitronix.connectionfactory.acquisition-interval=1 # Time, in seconds, to wait before trying to acquire a connection again after an invalid connection was acquired.</span><br><span class="line">spring.jta.bitronix.connectionfactory.acquisition-timeout=30 # Timeout, in seconds, for acquiring connections from the pool.</span><br><span class="line">spring.jta.bitronix.connectionfactory.allow-local-transactions=true # Whether the transaction manager should allow mixing XA and non-XA transactions.</span><br><span class="line">spring.jta.bitronix.connectionfactory.apply-transaction-timeout=false # Whether the transaction timeout should be set on the XAResource when it is enlisted.</span><br><span class="line">spring.jta.bitronix.connectionfactory.automatic-enlisting-enabled=true # Whether resources should be enlisted and delisted automatically.</span><br><span class="line">spring.jta.bitronix.connectionfactory.cache-producers-consumers=true # Whether producers and consumers should be cached.</span><br><span class="line">spring.jta.bitronix.connectionfactory.class-name= # Underlying implementation class name of the XA resource.</span><br><span class="line">spring.jta.bitronix.connectionfactory.defer-connection-release=true # Whether the provider can run many transactions on the same connection and supports transaction interleaving.</span><br><span class="line">spring.jta.bitronix.connectionfactory.disabled= # Whether this resource is disabled, meaning it's temporarily forbidden to acquire a connection from its pool.</span><br><span class="line">spring.jta.bitronix.connectionfactory.driver-properties= # Properties that should be set on the underlying implementation.</span><br><span class="line">spring.jta.bitronix.connectionfactory.failed= # Mark this resource producer as failed.</span><br><span class="line">spring.jta.bitronix.connectionfactory.ignore-recovery-failures=false # Whether recovery failures should be ignored.</span><br><span class="line">spring.jta.bitronix.connectionfactory.max-idle-time=60 # The time, in seconds, after which connections are cleaned up from the pool.</span><br><span class="line">spring.jta.bitronix.connectionfactory.max-pool-size=10 # The maximum size of the pool. 0 denotes no limit.</span><br><span class="line">spring.jta.bitronix.connectionfactory.min-pool-size=0 # The minimum size of the pool.</span><br><span class="line">spring.jta.bitronix.connectionfactory.password= # The password to use to connect to the JMS provider.</span><br><span class="line">spring.jta.bitronix.connectionfactory.share-transaction-connections=false #  Whether connections in the ACCESSIBLE state can be shared within the context of a transaction.</span><br><span class="line">spring.jta.bitronix.connectionfactory.test-connections=true # Whether connections should be tested when acquired from the pool.</span><br><span class="line">spring.jta.bitronix.connectionfactory.two-pc-ordering-position=1 # The position that this resource should take during two-phase commit (always first is Integer.MIN_VALUE, always last is Integer.MAX_VALUE).</span><br><span class="line">spring.jta.bitronix.connectionfactory.unique-name=jmsConnectionFactory # The unique name used to identify the resource during recovery.</span><br><span class="line">spring.jta.bitronix.connectionfactory.use-tm-join=true # Whether TMJOIN should be used when starting XAResources.</span><br><span class="line">spring.jta.bitronix.connectionfactory.user= # The user to use to connect to the JMS provider.</span><br><span class="line">spring.jta.bitronix.datasource.acquire-increment=1 # Number of connections to create when growing the pool.</span><br><span class="line">spring.jta.bitronix.datasource.acquisition-interval=1 # Time, in seconds, to wait before trying to acquire a connection again after an invalid connection was acquired.</span><br><span class="line">spring.jta.bitronix.datasource.acquisition-timeout=30 # Timeout, in seconds, for acquiring connections from the pool.</span><br><span class="line">spring.jta.bitronix.datasource.allow-local-transactions=true # Whether the transaction manager should allow mixing XA and non-XA transactions.</span><br><span class="line">spring.jta.bitronix.datasource.apply-transaction-timeout=false # Whether the transaction timeout should be set on the XAResource when it is enlisted.</span><br><span class="line">spring.jta.bitronix.datasource.automatic-enlisting-enabled=true # Whether resources should be enlisted and delisted automatically.</span><br><span class="line">spring.jta.bitronix.datasource.class-name= # Underlying implementation class name of the XA resource.</span><br><span class="line">spring.jta.bitronix.datasource.cursor-holdability= # The default cursor holdability for connections.</span><br><span class="line">spring.jta.bitronix.datasource.defer-connection-release=true # Whether the database can run many transactions on the same connection and supports transaction interleaving.</span><br><span class="line">spring.jta.bitronix.datasource.disabled= # Whether this resource is disabled, meaning it's temporarily forbidden to acquire a connection from its pool.</span><br><span class="line">spring.jta.bitronix.datasource.driver-properties= # Properties that should be set on the underlying implementation.</span><br><span class="line">spring.jta.bitronix.datasource.enable-jdbc4-connection-test= # Whether Connection.isValid() is called when acquiring a connection from the pool.</span><br><span class="line">spring.jta.bitronix.datasource.failed= # Mark this resource producer as failed.</span><br><span class="line">spring.jta.bitronix.datasource.ignore-recovery-failures=false # Whether recovery failures should be ignored.</span><br><span class="line">spring.jta.bitronix.datasource.isolation-level= # The default isolation level for connections.</span><br><span class="line">spring.jta.bitronix.datasource.local-auto-commit= # The default auto-commit mode for local transactions.</span><br><span class="line">spring.jta.bitronix.datasource.login-timeout= # Timeout, in seconds, for establishing a database connection.</span><br><span class="line">spring.jta.bitronix.datasource.max-idle-time=60 # The time, in seconds, after which connections are cleaned up from the pool.</span><br><span class="line">spring.jta.bitronix.datasource.max-pool-size=10 # The maximum size of the pool. 0 denotes no limit.</span><br><span class="line">spring.jta.bitronix.datasource.min-pool-size=0 # The minimum size of the pool.</span><br><span class="line">spring.jta.bitronix.datasource.prepared-statement-cache-size=0 # The target size of the prepared statement cache. 0 disables the cache.</span><br><span class="line">spring.jta.bitronix.datasource.share-transaction-connections=false #  Whether connections in the ACCESSIBLE state can be shared within the context of a transaction.</span><br><span class="line">spring.jta.bitronix.datasource.test-query= # SQL query or statement used to validate a connection before returning it.</span><br><span class="line">spring.jta.bitronix.datasource.two-pc-ordering-position=1 # The position that this resource should take during two-phase commit (always first is Integer.MIN_VALUE, and always last is Integer.MAX_VALUE).</span><br><span class="line">spring.jta.bitronix.datasource.unique-name=dataSource # The unique name used to identify the resource during recovery.</span><br><span class="line">spring.jta.bitronix.datasource.use-tm-join=true # Whether TMJOIN should be used when starting XAResources.</span><br><span class="line">spring.jta.bitronix.properties.allow-multiple-lrc=false # Whether to allow multiple LRC resources to be enlisted into the same transaction.</span><br><span class="line">spring.jta.bitronix.properties.asynchronous2-pc=false # Whether to enable asynchronously execution of two phase commit.</span><br><span class="line">spring.jta.bitronix.properties.background-recovery-interval-seconds=60 # Interval in seconds at which to run the recovery process in the background.</span><br><span class="line">spring.jta.bitronix.properties.current-node-only-recovery=true # Whether to recover only the current node.</span><br><span class="line">spring.jta.bitronix.properties.debug-zero-resource-transaction=false # Whether to log the creation and commit call stacks of transactions executed without a single enlisted resource.</span><br><span class="line">spring.jta.bitronix.properties.default-transaction-timeout=60 # Default transaction timeout, in seconds.</span><br><span class="line">spring.jta.bitronix.properties.disable-jmx=false # Whether to enable JMX support.</span><br><span class="line">spring.jta.bitronix.properties.exception-analyzer= # Set the fully qualified name of the exception analyzer implementation to use.</span><br><span class="line">spring.jta.bitronix.properties.filter-log-status=false # Whether to enable filtering of logs so that only mandatory logs are written.</span><br><span class="line">spring.jta.bitronix.properties.force-batching-enabled=true #  Whether disk forces are batched.</span><br><span class="line">spring.jta.bitronix.properties.forced-write-enabled=true # Whether logs are forced to disk.</span><br><span class="line">spring.jta.bitronix.properties.graceful-shutdown-interval=60 # Maximum amount of seconds the TM waits for transactions to get done before aborting them at shutdown time.</span><br><span class="line">spring.jta.bitronix.properties.jndi-transaction-synchronization-registry-name= # JNDI name of the TransactionSynchronizationRegistry.</span><br><span class="line">spring.jta.bitronix.properties.jndi-user-transaction-name= # JNDI name of the UserTransaction.</span><br><span class="line">spring.jta.bitronix.properties.journal=disk # Name of the journal. Can be 'disk', 'null', or a class name.</span><br><span class="line">spring.jta.bitronix.properties.log-part1-filename=btm1.tlog # Name of the first fragment of the journal.</span><br><span class="line">spring.jta.bitronix.properties.log-part2-filename=btm2.tlog # Name of the second fragment of the journal.</span><br><span class="line">spring.jta.bitronix.properties.max-log-size-in-mb=2 # Maximum size in megabytes of the journal fragments.</span><br><span class="line">spring.jta.bitronix.properties.resource-configuration-filename= # ResourceLoader configuration file name.</span><br><span class="line">spring.jta.bitronix.properties.server-id= # ASCII ID that must uniquely identify this TM instance. Defaults to the machine's IP address.</span><br><span class="line">spring.jta.bitronix.properties.skip-corrupted-logs=false # Skip corrupted transactions log entries.</span><br><span class="line">spring.jta.bitronix.properties.warn-about-zero-resource-transaction=true # Whether to log a warning for transactions executed without a single enlisted resource.</span><br><span class="line"></span><br><span class="line"># NARAYANA (NarayanaProperties)</span><br><span class="line">spring.jta.narayana.default-timeout=60s # Transaction timeout. If a duration suffix is not specified, seconds will be used.</span><br><span class="line">spring.jta.narayana.expiry-scanners=com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner # Comma-separated list of expiry scanners.</span><br><span class="line">spring.jta.narayana.log-dir= # Transaction object store directory.</span><br><span class="line">spring.jta.narayana.one-phase-commit=true # Whether to enable one phase commit optimization.</span><br><span class="line">spring.jta.narayana.periodic-recovery-period=120s # Interval in which periodic recovery scans are performed. If a duration suffix is not specified, seconds will be used.</span><br><span class="line">spring.jta.narayana.recovery-backoff-period=10s # Back off period between first and second phases of the recovery scan. If a duration suffix is not specified, seconds will be used.</span><br><span class="line">spring.jta.narayana.recovery-db-pass= # Database password to be used by the recovery manager.</span><br><span class="line">spring.jta.narayana.recovery-db-user= # Database username to be used by the recovery manager.</span><br><span class="line">spring.jta.narayana.recovery-jms-pass= # JMS password to be used by the recovery manager.</span><br><span class="line">spring.jta.narayana.recovery-jms-user= # JMS username to be used by the recovery manager.</span><br><span class="line">spring.jta.narayana.recovery-modules= # Comma-separated list of recovery modules.</span><br><span class="line">spring.jta.narayana.transaction-manager-id=1 # Unique transaction manager id.</span><br><span class="line">spring.jta.narayana.xa-resource-orphan-filters= # Comma-separated list of orphan filters.</span><br><span class="line"></span><br><span class="line"># EMBEDDED MONGODB (EmbeddedMongoProperties)</span><br><span class="line">spring.mongodb.embedded.features=sync_delay # Comma-separated list of features to enable.</span><br><span class="line">spring.mongodb.embedded.storage.database-dir= # Directory used for data storage.</span><br><span class="line">spring.mongodb.embedded.storage.oplog-size= # Maximum size of the oplog, in megabytes.</span><br><span class="line">spring.mongodb.embedded.storage.repl-set-name= # Name of the replica set.</span><br><span class="line">spring.mongodb.embedded.version=3.2.2 # Version of Mongo to use.</span><br><span class="line"></span><br><span class="line"># REDIS (RedisProperties)</span><br><span class="line">spring.redis.cluster.max-redirects= # Maximum number of redirects to follow when executing commands across the cluster.</span><br><span class="line">spring.redis.cluster.nodes= # Comma-separated list of "host:port" pairs to bootstrap from.</span><br><span class="line">spring.redis.database=0 # Database index used by the connection factory.</span><br><span class="line">spring.redis.url= # Connection URL. Overrides host, port, and password. User is ignored. Example: redis://user:password@example.com:6379</span><br><span class="line">spring.redis.host=localhost # Redis server host.</span><br><span class="line">spring.redis.jedis.pool.max-active=8 # Maximum number of connections that can be allocated by the pool at a given time. Use a negative value for no limit.</span><br><span class="line">spring.redis.jedis.pool.max-idle=8 # Maximum number of "idle" connections in the pool. Use a negative value to indicate an unlimited number of idle connections.</span><br><span class="line">spring.redis.jedis.pool.max-wait=-1ms # Maximum amount of time a connection allocation should block before throwing an exception when the pool is exhausted. Use a negative value to block indefinitely.</span><br><span class="line">spring.redis.jedis.pool.min-idle=0 # Target for the minimum number of idle connections to maintain in the pool. This setting only has an effect if it is positive.</span><br><span class="line">spring.redis.lettuce.pool.max-active=8 # Maximum number of connections that can be allocated by the pool at a given time. Use a negative value for no limit.</span><br><span class="line">spring.redis.lettuce.pool.max-idle=8 # Maximum number of "idle" connections in the pool. Use a negative value to indicate an unlimited number of idle connections.</span><br><span class="line">spring.redis.lettuce.pool.max-wait=-1ms # Maximum amount of time a connection allocation should block before throwing an exception when the pool is exhausted. Use a negative value to block indefinitely.</span><br><span class="line">spring.redis.lettuce.pool.min-idle=0 # Target for the minimum number of idle connections to maintain in the pool. This setting only has an effect if it is positive.</span><br><span class="line">spring.redis.lettuce.shutdown-timeout=100ms # Shutdown timeout.</span><br><span class="line">spring.redis.password= # Login password of the redis server.</span><br><span class="line">spring.redis.port=6379 # Redis server port.</span><br><span class="line">spring.redis.sentinel.master= # Name of the Redis server.</span><br><span class="line">spring.redis.sentinel.nodes= # Comma-separated list of "host:port" pairs.</span><br><span class="line">spring.redis.ssl=false # Whether to enable SSL support.</span><br><span class="line">spring.redis.timeout= # Connection timeout.</span><br><span class="line"></span><br><span class="line"># TRANSACTION (TransactionProperties)</span><br><span class="line">spring.transaction.default-timeout= # Default transaction timeout. If a duration suffix is not specified, seconds will be used.</span><br><span class="line">spring.transaction.rollback-on-commit-failure= # Whether to roll back on commit failures.</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># ----------------------------------------</span><br><span class="line"># INTEGRATION PROPERTIES</span><br><span class="line"># ----------------------------------------</span><br><span class="line"></span><br><span class="line"># ACTIVEMQ (ActiveMQProperties)</span><br><span class="line">spring.activemq.broker-url= # URL of the ActiveMQ broker. Auto-generated by default.</span><br><span class="line">spring.activemq.close-timeout=15s # Time to wait before considering a close complete.</span><br><span class="line">spring.activemq.in-memory=true # Whether the default broker URL should be in memory. Ignored if an explicit broker has been specified.</span><br><span class="line">spring.activemq.non-blocking-redelivery=false # Whether to stop message delivery before re-delivering messages from a rolled back transaction. This implies that message order is not preserved when this is enabled.</span><br><span class="line">spring.activemq.password= # Login password of the broker.</span><br><span class="line">spring.activemq.send-timeout=0ms # Time to wait on message sends for a response. Set it to 0 to wait forever.</span><br><span class="line">spring.activemq.user= # Login user of the broker.</span><br><span class="line">spring.activemq.packages.trust-all= # Whether to trust all packages.</span><br><span class="line">spring.activemq.packages.trusted= # Comma-separated list of specific packages to trust (when not trusting all packages).</span><br><span class="line">spring.activemq.pool.block-if-full=true # Whether to block when a connection is requested and the pool is full. Set it to false to throw a "JMSException" instead.</span><br><span class="line">spring.activemq.pool.block-if-full-timeout=-1ms # Blocking period before throwing an exception if the pool is still full.</span><br><span class="line">spring.activemq.pool.create-connection-on-startup=true # Whether to create a connection on startup. Can be used to warm up the pool on startup.</span><br><span class="line">spring.activemq.pool.enabled=false # Whether a PooledConnectionFactory should be created, instead of a regular ConnectionFactory.</span><br><span class="line">spring.activemq.pool.expiry-timeout=0ms # Connection expiration timeout.</span><br><span class="line">spring.activemq.pool.idle-timeout=30s # Connection idle timeout.</span><br><span class="line">spring.activemq.pool.max-connections=1 # Maximum number of pooled connections.</span><br><span class="line">spring.activemq.pool.maximum-active-session-per-connection=500 # Maximum number of active sessions per connection.</span><br><span class="line">spring.activemq.pool.reconnect-on-exception=true # Reset the connection when a "JMSException" occurs.</span><br><span class="line">spring.activemq.pool.time-between-expiration-check=-1ms # Time to sleep between runs of the idle connection eviction thread. When negative, no idle connection eviction thread runs.</span><br><span class="line">spring.activemq.pool.use-anonymous-producers=true # Whether to use only one anonymous "MessageProducer" instance. Set it to false to create one "MessageProducer" every time one is required.</span><br><span class="line"></span><br><span class="line"># ARTEMIS (ArtemisProperties)</span><br><span class="line">spring.artemis.embedded.cluster-password= # Cluster password. Randomly generated on startup by default.</span><br><span class="line">spring.artemis.embedded.data-directory= # Journal file directory. Not necessary if persistence is turned off.</span><br><span class="line">spring.artemis.embedded.enabled=true # Whether to enable embedded mode if the Artemis server APIs are available.</span><br><span class="line">spring.artemis.embedded.persistent=false # Whether to enable persistent store.</span><br><span class="line">spring.artemis.embedded.queues= # Comma-separated list of queues to create on startup.</span><br><span class="line">spring.artemis.embedded.server-id= # Server ID. By default, an auto-incremented counter is used.</span><br><span class="line">spring.artemis.embedded.topics= # Comma-separated list of topics to create on startup.</span><br><span class="line">spring.artemis.host=localhost # Artemis broker host.</span><br><span class="line">spring.artemis.mode= # Artemis deployment mode, auto-detected by default.</span><br><span class="line">spring.artemis.password= # Login password of the broker.</span><br><span class="line">spring.artemis.port=61616 # Artemis broker port.</span><br><span class="line">spring.artemis.user= # Login user of the broker.</span><br><span class="line"></span><br><span class="line"># SPRING BATCH (BatchProperties)</span><br><span class="line">spring.batch.initialize-schema=embedded # Database schema initialization mode.</span><br><span class="line">spring.batch.job.enabled=true # Execute all Spring Batch jobs in the context on startup.</span><br><span class="line">spring.batch.job.names= # Comma-separated list of job names to execute on startup (for instance, `job1,job2`). By default, all Jobs found in the context are executed.</span><br><span class="line">spring.batch.schema=classpath:org/springframework/batch/core/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema.</span><br><span class="line">spring.batch.table-prefix= # Table prefix for all the batch meta-data tables.</span><br><span class="line"></span><br><span class="line"># SPRING INTEGRATION (IntegrationProperties)</span><br><span class="line">spring.integration.jdbc.initialize-schema=embedded # Database schema initialization mode.</span><br><span class="line">spring.integration.jdbc.schema=classpath:org/springframework/integration/jdbc/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema.</span><br><span class="line"></span><br><span class="line"># JMS (JmsProperties)</span><br><span class="line">spring.jms.jndi-name= # Connection factory JNDI name. When set, takes precedence to others connection factory auto-configurations.</span><br><span class="line">spring.jms.listener.acknowledge-mode= # Acknowledge mode of the container. By default, the listener is transacted with automatic acknowledgment.</span><br><span class="line">spring.jms.listener.auto-startup=true # Start the container automatically on startup.</span><br><span class="line">spring.jms.listener.concurrency= # Minimum number of concurrent consumers.</span><br><span class="line">spring.jms.listener.max-concurrency= # Maximum number of concurrent consumers.</span><br><span class="line">spring.jms.pub-sub-domain=false # Whether the default destination type is topic.</span><br><span class="line">spring.jms.template.default-destination= # Default destination to use on send and receive operations that do not have a destination parameter.</span><br><span class="line">spring.jms.template.delivery-delay= # Delivery delay to use for send calls.</span><br><span class="line">spring.jms.template.delivery-mode= # Delivery mode. Enables QoS (Quality of Service) when set.</span><br><span class="line">spring.jms.template.priority= # Priority of a message when sending. Enables QoS (Quality of Service) when set.</span><br><span class="line">spring.jms.template.qos-enabled= # Whether to enable explicit QoS (Quality of Service) when sending a message.</span><br><span class="line">spring.jms.template.receive-timeout= # Timeout to use for receive calls.</span><br><span class="line">spring.jms.template.time-to-live= # Time-to-live of a message when sending. Enables QoS (Quality of Service) when set.</span><br><span class="line"></span><br><span class="line"># APACHE KAFKA (KafkaProperties)</span><br><span class="line">spring.kafka.admin.client-id= # ID to pass to the server when making requests. Used for server-side logging.</span><br><span class="line">spring.kafka.admin.fail-fast=false # Whether to fail fast if the broker is not available on startup.</span><br><span class="line">spring.kafka.admin.properties.*= # Additional admin-specific properties used to configure the client.</span><br><span class="line">spring.kafka.admin.ssl.key-password= # Password of the private key in the key store file.</span><br><span class="line">spring.kafka.admin.ssl.key-store-location= # Location of the key store file.</span><br><span class="line">spring.kafka.admin.ssl.key-store-password= # Store password for the key store file.</span><br><span class="line">spring.kafka.admin.ssl.key-store-type= # Type of the key store.</span><br><span class="line">spring.kafka.admin.ssl.protocol= # SSL protocol to use.</span><br><span class="line">spring.kafka.admin.ssl.trust-store-location= # Location of the trust store file.</span><br><span class="line">spring.kafka.admin.ssl.trust-store-password= # Store password for the trust store file.</span><br><span class="line">spring.kafka.admin.ssl.trust-store-type= # Type of the trust store.</span><br><span class="line">spring.kafka.bootstrap-servers= # Comma-delimited list of host:port pairs to use for establishing the initial connection to the Kafka cluster.</span><br><span class="line">spring.kafka.client-id= # ID to pass to the server when making requests. Used for server-side logging.</span><br><span class="line">spring.kafka.consumer.auto-commit-interval= # Frequency with which the consumer offsets are auto-committed to Kafka if 'enable.auto.commit' is set to true.</span><br><span class="line">spring.kafka.consumer.auto-offset-reset= # What to do when there is no initial offset in Kafka or if the current offset no longer exists on the server.</span><br><span class="line">spring.kafka.consumer.bootstrap-servers= # Comma-delimited list of host:port pairs to use for establishing the initial connection to the Kafka cluster.</span><br><span class="line">spring.kafka.consumer.client-id= # ID to pass to the server when making requests. Used for server-side logging.</span><br><span class="line">spring.kafka.consumer.enable-auto-commit= # Whether the consumer's offset is periodically committed in the background.</span><br><span class="line">spring.kafka.consumer.fetch-max-wait= # Maximum amount of time the server blocks before answering the fetch request if there isn't sufficient data to immediately satisfy the requirement given by "fetch.min.bytes".</span><br><span class="line">spring.kafka.consumer.fetch-min-size= # Minimum amount of data, in bytes, the server should return for a fetch request.</span><br><span class="line">spring.kafka.consumer.group-id= # Unique string that identifies the consumer group to which this consumer belongs.</span><br><span class="line">spring.kafka.consumer.heartbeat-interval= # Expected time between heartbeats to the consumer coordinator.</span><br><span class="line">spring.kafka.consumer.key-deserializer= # Deserializer class for keys.</span><br><span class="line">spring.kafka.consumer.max-poll-records= # Maximum number of records returned in a single call to poll().</span><br><span class="line">spring.kafka.consumer.properties.*= # Additional consumer-specific properties used to configure the client.</span><br><span class="line">spring.kafka.consumer.ssl.key-password= # Password of the private key in the key store file.</span><br><span class="line">spring.kafka.consumer.ssl.key-store-location= # Location of the key store file.</span><br><span class="line">spring.kafka.consumer.ssl.key-store-password= # Store password for the key store file.</span><br><span class="line">spring.kafka.consumer.ssl.key-store-type= # Type of the key store.</span><br><span class="line">spring.kafka.consumer.ssl.protocol= # SSL protocol to use.</span><br><span class="line">spring.kafka.consumer.ssl.trust-store-location= # Location of the trust store file.</span><br><span class="line">spring.kafka.consumer.ssl.trust-store-password= # Store password for the trust store file.</span><br><span class="line">spring.kafka.consumer.ssl.trust-store-type= # Type of the trust store.</span><br><span class="line">spring.kafka.consumer.value-deserializer= # Deserializer class for values.</span><br><span class="line">spring.kafka.jaas.control-flag=required # Control flag for login configuration.</span><br><span class="line">spring.kafka.jaas.enabled=false # Whether to enable JAAS configuration.</span><br><span class="line">spring.kafka.jaas.login-module=com.sun.security.auth.module.Krb5LoginModule # Login module.</span><br><span class="line">spring.kafka.jaas.options= # Additional JAAS options.</span><br><span class="line">spring.kafka.listener.ack-count= # Number of records between offset commits when ackMode is "COUNT" or "COUNT_TIME".</span><br><span class="line">spring.kafka.listener.ack-mode= # Listener AckMode. See the spring-kafka documentation.</span><br><span class="line">spring.kafka.listener.ack-time= # Time between offset commits when ackMode is "TIME" or "COUNT_TIME".</span><br><span class="line">spring.kafka.listener.client-id= # Prefix for the listener's consumer client.id property.</span><br><span class="line">spring.kafka.listener.concurrency= # Number of threads to run in the listener containers.</span><br><span class="line">spring.kafka.listener.idle-event-interval= # Time between publishing idle consumer events (no data received).</span><br><span class="line">spring.kafka.listener.log-container-config= # Whether to log the container configuration during initialization (INFO level).</span><br><span class="line">spring.kafka.listener.monitor-interval= # Time between checks for non-responsive consumers. If a duration suffix is not specified, seconds will be used.</span><br><span class="line">spring.kafka.listener.no-poll-threshold= # Multiplier applied to "pollTimeout" to determine if a consumer is non-responsive.</span><br><span class="line">spring.kafka.listener.poll-timeout= # Timeout to use when polling the consumer.</span><br><span class="line">spring.kafka.listener.type=single # Listener type.</span><br><span class="line">spring.kafka.producer.acks= # Number of acknowledgments the producer requires the leader to have received before considering a request complete.</span><br><span class="line">spring.kafka.producer.batch-size= # Default batch size in bytes.</span><br><span class="line">spring.kafka.producer.bootstrap-servers= # Comma-delimited list of host:port pairs to use for establishing the initial connection to the Kafka cluster.</span><br><span class="line">spring.kafka.producer.buffer-memory= # Total bytes of memory the producer can use to buffer records waiting to be sent to the server.</span><br><span class="line">spring.kafka.producer.client-id= # ID to pass to the server when making requests. Used for server-side logging.</span><br><span class="line">spring.kafka.producer.compression-type= # Compression type for all data generated by the producer.</span><br><span class="line">spring.kafka.producer.key-serializer= # Serializer class for keys.</span><br><span class="line">spring.kafka.producer.properties.*= # Additional producer-specific properties used to configure the client.</span><br><span class="line">spring.kafka.producer.retries= # When greater than zero, enables retrying of failed sends.</span><br><span class="line">spring.kafka.producer.ssl.key-password= # Password of the private key in the key store file.</span><br><span class="line">spring.kafka.producer.ssl.key-store-location= # Location of the key store file.</span><br><span class="line">spring.kafka.producer.ssl.key-store-password= # Store password for the key store file.</span><br><span class="line">spring.kafka.producer.ssl.key-store-type= # Type of the key store.</span><br><span class="line">spring.kafka.producer.ssl.protocol= # SSL protocol to use.</span><br><span class="line">spring.kafka.producer.ssl.trust-store-location= # Location of the trust store file.</span><br><span class="line">spring.kafka.producer.ssl.trust-store-password= # Store password for the trust store file.</span><br><span class="line">spring.kafka.producer.ssl.trust-store-type= # Type of the trust store.</span><br><span class="line">spring.kafka.producer.transaction-id-prefix= # When non empty, enables transaction support for producer.</span><br><span class="line">spring.kafka.producer.value-serializer= # Serializer class for values.</span><br><span class="line">spring.kafka.properties.*= # Additional properties, common to producers and consumers, used to configure the client.</span><br><span class="line">spring.kafka.ssl.key-password= # Password of the private key in the key store file.</span><br><span class="line">spring.kafka.ssl.key-store-location= # Location of the key store file.</span><br><span class="line">spring.kafka.ssl.key-store-password= # Store password for the key store file.</span><br><span class="line">spring.kafka.ssl.key-store-type= # Type of the key store.</span><br><span class="line">spring.kafka.ssl.protocol= # SSL protocol to use.</span><br><span class="line">spring.kafka.ssl.trust-store-location= # Location of the trust store file.</span><br><span class="line">spring.kafka.ssl.trust-store-password= # Store password for the trust store file.</span><br><span class="line">spring.kafka.ssl.trust-store-type= # Type of the trust store.</span><br><span class="line">spring.kafka.template.default-topic= # Default topic to which messages are sent.</span><br><span class="line"></span><br><span class="line"># RABBIT (RabbitProperties)</span><br><span class="line">spring.rabbitmq.addresses= # Comma-separated list of addresses to which the client should connect.</span><br><span class="line">spring.rabbitmq.cache.channel.checkout-timeout= # Duration to wait to obtain a channel if the cache size has been reached.</span><br><span class="line">spring.rabbitmq.cache.channel.size= # Number of channels to retain in the cache.</span><br><span class="line">spring.rabbitmq.cache.connection.mode=channel # Connection factory cache mode.</span><br><span class="line">spring.rabbitmq.cache.connection.size= # Number of connections to cache.</span><br><span class="line">spring.rabbitmq.connection-timeout= # Connection timeout. Set it to zero to wait forever.</span><br><span class="line">spring.rabbitmq.dynamic=true # Whether to create an AmqpAdmin bean.</span><br><span class="line">spring.rabbitmq.host=localhost # RabbitMQ host.</span><br><span class="line">spring.rabbitmq.listener.direct.acknowledge-mode= # Acknowledge mode of container.</span><br><span class="line">spring.rabbitmq.listener.direct.auto-startup=true # Whether to start the container automatically on startup.</span><br><span class="line">spring.rabbitmq.listener.direct.consumers-per-queue= # Number of consumers per queue.</span><br><span class="line">spring.rabbitmq.listener.direct.default-requeue-rejected= # Whether rejected deliveries are re-queued by default.</span><br><span class="line">spring.rabbitmq.listener.direct.idle-event-interval= # How often idle container events should be published.</span><br><span class="line">spring.rabbitmq.listener.direct.prefetch= # Number of messages to be handled in a single request. It should be greater than or equal to the transaction size (if used).</span><br><span class="line">spring.rabbitmq.listener.direct.retry.enabled=false # Whether publishing retries are enabled.</span><br><span class="line">spring.rabbitmq.listener.direct.retry.initial-interval=1000ms # Duration between the first and second attempt to deliver a message.</span><br><span class="line">spring.rabbitmq.listener.direct.retry.max-attempts=3 # Maximum number of attempts to deliver a message.</span><br><span class="line">spring.rabbitmq.listener.direct.retry.max-interval=10000ms # Maximum duration between attempts.</span><br><span class="line">spring.rabbitmq.listener.direct.retry.multiplier=1 # Multiplier to apply to the previous retry interval.</span><br><span class="line">spring.rabbitmq.listener.direct.retry.stateless=true # Whether retries are stateless or stateful.</span><br><span class="line">spring.rabbitmq.listener.simple.acknowledge-mode= # Acknowledge mode of container.</span><br><span class="line">spring.rabbitmq.listener.simple.auto-startup=true # Whether to start the container automatically on startup.</span><br><span class="line">spring.rabbitmq.listener.simple.concurrency= # Minimum number of listener invoker threads.</span><br><span class="line">spring.rabbitmq.listener.simple.default-requeue-rejected= # Whether rejected deliveries are re-queued by default.</span><br><span class="line">spring.rabbitmq.listener.simple.idle-event-interval= # How often idle container events should be published.</span><br><span class="line">spring.rabbitmq.listener.simple.max-concurrency= # Maximum number of listener invoker threads.</span><br><span class="line">spring.rabbitmq.listener.simple.prefetch= # Number of messages to be handled in a single request. It should be greater than or equal to the transaction size (if used).</span><br><span class="line">spring.rabbitmq.listener.simple.retry.enabled=false # Whether publishing retries are enabled.</span><br><span class="line">spring.rabbitmq.listener.simple.retry.initial-interval=1000ms # Duration between the first and second attempt to deliver a message.</span><br><span class="line">spring.rabbitmq.listener.simple.retry.max-attempts=3 # Maximum number of attempts to deliver a message.</span><br><span class="line">spring.rabbitmq.listener.simple.retry.max-interval=10000ms # Maximum duration between attempts.</span><br><span class="line">spring.rabbitmq.listener.simple.retry.multiplier=1 # Multiplier to apply to the previous retry interval.</span><br><span class="line">spring.rabbitmq.listener.simple.retry.stateless=true # Whether retries are stateless or stateful.</span><br><span class="line">spring.rabbitmq.listener.simple.transaction-size= # Number of messages to be processed in a transaction. That is, the number of messages between acks. For best results, it should be less than or equal to the prefetch count.</span><br><span class="line">spring.rabbitmq.listener.type=simple # Listener container type.</span><br><span class="line">spring.rabbitmq.password=guest # Login to authenticate against the broker.</span><br><span class="line">spring.rabbitmq.port=5672 # RabbitMQ port.</span><br><span class="line">spring.rabbitmq.publisher-confirms=false # Whether to enable publisher confirms.</span><br><span class="line">spring.rabbitmq.publisher-returns=false # Whether to enable publisher returns.</span><br><span class="line">spring.rabbitmq.requested-heartbeat= # Requested heartbeat timeout; zero for none. If a duration suffix is not specified, seconds will be used.</span><br><span class="line">spring.rabbitmq.ssl.enabled=false # Whether to enable SSL support.</span><br><span class="line">spring.rabbitmq.ssl.key-store= # Path to the key store that holds the SSL certificate.</span><br><span class="line">spring.rabbitmq.ssl.key-store-password= # Password used to access the key store.</span><br><span class="line">spring.rabbitmq.ssl.key-store-type=PKCS12 # Key store type.</span><br><span class="line">spring.rabbitmq.ssl.trust-store= # Trust store that holds SSL certificates.</span><br><span class="line">spring.rabbitmq.ssl.trust-store-password= # Password used to access the trust store.</span><br><span class="line">spring.rabbitmq.ssl.trust-store-type=JKS # Trust store type.</span><br><span class="line">spring.rabbitmq.ssl.algorithm= # SSL algorithm to use. By default, configured by the Rabbit client library.</span><br><span class="line">spring.rabbitmq.template.exchange= # Name of the default exchange to use for send operations.</span><br><span class="line">spring.rabbitmq.template.mandatory= # Whether to enable mandatory messages.</span><br><span class="line">spring.rabbitmq.template.receive-timeout= # Timeout for `receive()` operations.</span><br><span class="line">spring.rabbitmq.template.reply-timeout= # Timeout for `sendAndReceive()` operations.</span><br><span class="line">spring.rabbitmq.template.retry.enabled=false # Whether publishing retries are enabled.</span><br><span class="line">spring.rabbitmq.template.retry.initial-interval=1000ms # Duration between the first and second attempt to deliver a message.</span><br><span class="line">spring.rabbitmq.template.retry.max-attempts=3 # Maximum number of attempts to deliver a message.</span><br><span class="line">spring.rabbitmq.template.retry.max-interval=10000ms # Maximum duration between attempts.</span><br><span class="line">spring.rabbitmq.template.retry.multiplier=1 # Multiplier to apply to the previous retry interval.</span><br><span class="line">spring.rabbitmq.template.routing-key= # Value of a default routing key to use for send operations.</span><br><span class="line">spring.rabbitmq.username=guest # Login user to authenticate to the broker.</span><br><span class="line">spring.rabbitmq.virtual-host= # Virtual host to use when connecting to the broker.</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># ----------------------------------------</span><br><span class="line"># ACTUATOR PROPERTIES</span><br><span class="line"># ----------------------------------------</span><br><span class="line"></span><br><span class="line"># MANAGEMENT HTTP SERVER (ManagementServerProperties)</span><br><span class="line">management.server.add-application-context-header=false # Add the "X-Application-Context" HTTP header in each response.</span><br><span class="line">management.server.address= # Network address to which the management endpoints should bind. Requires a custom management.server.port.</span><br><span class="line">management.server.port= # Management endpoint HTTP port (uses the same port as the application by default). Configure a different port to use management-specific SSL.</span><br><span class="line">management.server.servlet.context-path= # Management endpoint context-path (for instance, `/management`). Requires a custom management.server.port.</span><br><span class="line">management.server.ssl.ciphers= # Supported SSL ciphers. Requires a custom management.port.</span><br><span class="line">management.server.ssl.client-auth= # Whether client authentication is wanted ("want") or needed ("need"). Requires a trust store. Requires a custom management.server.port.</span><br><span class="line">management.server.ssl.enabled= # Whether to enable SSL support. Requires a custom management.server.port.</span><br><span class="line">management.server.ssl.enabled-protocols= # Enabled SSL protocols. Requires a custom management.server.port.</span><br><span class="line">management.server.ssl.key-alias= # Alias that identifies the key in the key store. Requires a custom management.server.port.</span><br><span class="line">management.server.ssl.key-password= # Password used to access the key in the key store. Requires a custom management.server.port.</span><br><span class="line">management.server.ssl.key-store= # Path to the key store that holds the SSL certificate (typically a jks file). Requires a custom management.server.port.</span><br><span class="line">management.server.ssl.key-store-password= # Password used to access the key store. Requires a custom management.server.port.</span><br><span class="line">management.server.ssl.key-store-provider= # Provider for the key store. Requires a custom management.server.port.</span><br><span class="line">management.server.ssl.key-store-type= # Type of the key store. Requires a custom management.server.port.</span><br><span class="line">management.server.ssl.protocol=TLS # SSL protocol to use. Requires a custom management.server.port.</span><br><span class="line">management.server.ssl.trust-store= # Trust store that holds SSL certificates. Requires a custom management.server.port.</span><br><span class="line">management.server.ssl.trust-store-password= # Password used to access the trust store. Requires a custom management.server.port.</span><br><span class="line">management.server.ssl.trust-store-provider= # Provider for the trust store. Requires a custom management.server.port.</span><br><span class="line">management.server.ssl.trust-store-type= # Type of the trust store. Requires a custom management.server.port.</span><br><span class="line"></span><br><span class="line"># CLOUDFOUNDRY</span><br><span class="line">management.cloudfoundry.enabled=true # Whether to enable extended Cloud Foundry actuator endpoints.</span><br><span class="line">management.cloudfoundry.skip-ssl-validation=false # Whether to skip SSL verification for Cloud Foundry actuator endpoint security calls.</span><br><span class="line"></span><br><span class="line"># ENDPOINTS GENERAL CONFIGURATION</span><br><span class="line">management.endpoints.enabled-by-default= # Whether to enable or disable all endpoints by default.</span><br><span class="line"></span><br><span class="line"># ENDPOINTS JMX CONFIGURATION (JmxEndpointProperties)</span><br><span class="line">management.endpoints.jmx.domain=org.springframework.boot # Endpoints JMX domain name. Fallback to 'spring.jmx.default-domain' if set.</span><br><span class="line">management.endpoints.jmx.exposure.include=* # Endpoint IDs that should be included or '*' for all.</span><br><span class="line">management.endpoints.jmx.exposure.exclude= # Endpoint IDs that should be excluded.</span><br><span class="line">management.endpoints.jmx.static-names= # Additional static properties to append to all ObjectNames of MBeans representing Endpoints.</span><br><span class="line">management.endpoints.jmx.unique-names=false # Whether to ensure that ObjectNames are modified in case of conflict.</span><br><span class="line"></span><br><span class="line"># ENDPOINTS WEB CONFIGURATION (WebEndpointProperties)</span><br><span class="line">management.endpoints.web.exposure.include=health,info # Endpoint IDs that should be included or '*' for all.</span><br><span class="line">management.endpoints.web.exposure.exclude= # Endpoint IDs that should be excluded.</span><br><span class="line">management.endpoints.web.base-path=/actuator # Base path for Web endpoints. Relative to server.servlet.context-path or management.server.servlet.context-path if management.server.port is configured.</span><br><span class="line">management.endpoints.web.path-mapping= # Mapping between endpoint IDs and the path that should expose them.</span><br><span class="line"></span><br><span class="line"># ENDPOINTS CORS CONFIGURATION (CorsEndpointProperties)</span><br><span class="line">management.endpoints.web.cors.allow-credentials= # Whether credentials are supported. When not set, credentials are not supported.</span><br><span class="line">management.endpoints.web.cors.allowed-headers= # Comma-separated list of headers to allow in a request. '*' allows all headers.</span><br><span class="line">management.endpoints.web.cors.allowed-methods= # Comma-separated list of methods to allow. '*' allows all methods. When not set, defaults to GET.</span><br><span class="line">management.endpoints.web.cors.allowed-origins= # Comma-separated list of origins to allow. '*' allows all origins. When not set, CORS support is disabled.</span><br><span class="line">management.endpoints.web.cors.exposed-headers= # Comma-separated list of headers to include in a response.</span><br><span class="line">management.endpoints.web.cors.max-age=1800s # How long the response from a pre-flight request can be cached by clients. If a duration suffix is not specified, seconds will be used.</span><br><span class="line"></span><br><span class="line"># AUDIT EVENTS ENDPOINT (AuditEventsEndpoint)</span><br><span class="line">management.endpoint.auditevents.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.auditevents.enabled=true # Whether to enable the auditevents endpoint.</span><br><span class="line"></span><br><span class="line"># BEANS ENDPOINT (BeansEndpoint)</span><br><span class="line">management.endpoint.beans.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.beans.enabled=true # Whether to enable the beans endpoint.</span><br><span class="line"></span><br><span class="line"># CACHES ENDPOINT (CachesEndpoint)</span><br><span class="line">management.endpoint.caches.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.caches.enabled=true # Whether to enable the caches endpoint.</span><br><span class="line"></span><br><span class="line"># CONDITIONS REPORT ENDPOINT (ConditionsReportEndpoint)</span><br><span class="line">management.endpoint.conditions.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.conditions.enabled=true # Whether to enable the conditions endpoint.</span><br><span class="line"></span><br><span class="line"># CONFIGURATION PROPERTIES REPORT ENDPOINT (ConfigurationPropertiesReportEndpoint, ConfigurationPropertiesReportEndpointProperties)</span><br><span class="line">management.endpoint.configprops.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.configprops.enabled=true # Whether to enable the configprops endpoint.</span><br><span class="line">management.endpoint.configprops.keys-to-sanitize=password,secret,key,token,.*credentials.*,vcap_services,sun.java.command # Keys that should be sanitized. Keys can be simple strings that the property ends with or regular expressions.</span><br><span class="line"></span><br><span class="line"># ENVIRONMENT ENDPOINT (EnvironmentEndpoint, EnvironmentEndpointProperties)</span><br><span class="line">management.endpoint.env.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.env.enabled=true # Whether to enable the env endpoint.</span><br><span class="line">management.endpoint.env.keys-to-sanitize=password,secret,key,token,.*credentials.*,vcap_services,sun.java.command # Keys that should be sanitized. Keys can be simple strings that the property ends with or regular expressions.</span><br><span class="line"></span><br><span class="line"># FLYWAY ENDPOINT (FlywayEndpoint)</span><br><span class="line">management.endpoint.flyway.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.flyway.enabled=true # Whether to enable the flyway endpoint.</span><br><span class="line"></span><br><span class="line"># HEALTH ENDPOINT (HealthEndpoint, HealthEndpointProperties)</span><br><span class="line">management.endpoint.health.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.health.enabled=true # Whether to enable the health endpoint.</span><br><span class="line">management.endpoint.health.roles= # Roles used to determine whether or not a user is authorized to be shown details. When empty, all authenticated users are authorized.</span><br><span class="line">management.endpoint.health.show-details=never # When to show full health details.</span><br><span class="line"></span><br><span class="line"># HEAP DUMP ENDPOINT (HeapDumpWebEndpoint)</span><br><span class="line">management.endpoint.heapdump.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.heapdump.enabled=true # Whether to enable the heapdump endpoint.</span><br><span class="line"></span><br><span class="line"># HTTP TRACE ENDPOINT (HttpTraceEndpoint)</span><br><span class="line">management.endpoint.httptrace.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.httptrace.enabled=true # Whether to enable the httptrace endpoint.</span><br><span class="line"></span><br><span class="line"># INFO ENDPOINT (InfoEndpoint)</span><br><span class="line">info= # Arbitrary properties to add to the info endpoint.</span><br><span class="line">management.endpoint.info.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.info.enabled=true # Whether to enable the info endpoint.</span><br><span class="line"></span><br><span class="line"># INTEGRATION GRAPH ENDPOINT (IntegrationGraphEndpoint)</span><br><span class="line">management.endpoint.integrationgraph.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.integrationgraph.enabled=true # Whether to enable the integrationgraph endpoint.</span><br><span class="line"></span><br><span class="line"># JOLOKIA ENDPOINT (JolokiaProperties)</span><br><span class="line">management.endpoint.jolokia.config.*= # Jolokia settings. Refer to the documentation of Jolokia for more details.</span><br><span class="line">management.endpoint.jolokia.enabled=true # Whether to enable the jolokia endpoint.</span><br><span class="line"></span><br><span class="line"># LIQUIBASE ENDPOINT (LiquibaseEndpoint)</span><br><span class="line">management.endpoint.liquibase.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.liquibase.enabled=true # Whether to enable the liquibase endpoint.</span><br><span class="line"></span><br><span class="line"># LOG FILE ENDPOINT (LogFileWebEndpoint, LogFileWebEndpointProperties)</span><br><span class="line">management.endpoint.logfile.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.logfile.enabled=true # Whether to enable the logfile endpoint.</span><br><span class="line">management.endpoint.logfile.external-file= # External Logfile to be accessed. Can be used if the logfile is written by output redirect and not by the logging system itself.</span><br><span class="line"></span><br><span class="line"># LOGGERS ENDPOINT (LoggersEndpoint)</span><br><span class="line">management.endpoint.loggers.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.loggers.enabled=true # Whether to enable the loggers endpoint.</span><br><span class="line"></span><br><span class="line"># REQUEST MAPPING ENDPOINT  (MappingsEndpoint)</span><br><span class="line">management.endpoint.mappings.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.mappings.enabled=true # Whether to enable the mappings endpoint.</span><br><span class="line"></span><br><span class="line"># METRICS ENDPOINT (MetricsEndpoint)</span><br><span class="line">management.endpoint.metrics.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.metrics.enabled=true # Whether to enable the metrics endpoint.</span><br><span class="line"></span><br><span class="line"># PROMETHEUS ENDPOINT (PrometheusScrapeEndpoint)</span><br><span class="line">management.endpoint.prometheus.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.prometheus.enabled=true # Whether to enable the prometheus endpoint.</span><br><span class="line"></span><br><span class="line"># SCHEDULED TASKS ENDPOINT (ScheduledTasksEndpoint)</span><br><span class="line">management.endpoint.scheduledtasks.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.scheduledtasks.enabled=true # Whether to enable the scheduledtasks endpoint.</span><br><span class="line"></span><br><span class="line"># SESSIONS ENDPOINT (SessionsEndpoint)</span><br><span class="line">management.endpoint.sessions.enabled=true # Whether to enable the sessions endpoint.</span><br><span class="line"></span><br><span class="line"># SHUTDOWN ENDPOINT (ShutdownEndpoint)</span><br><span class="line">management.endpoint.shutdown.enabled=false # Whether to enable the shutdown endpoint.</span><br><span class="line"></span><br><span class="line"># THREAD DUMP ENDPOINT (ThreadDumpEndpoint)</span><br><span class="line">management.endpoint.threaddump.cache.time-to-live=0ms # Maximum time that a response can be cached.</span><br><span class="line">management.endpoint.threaddump.enabled=true # Whether to enable the threaddump endpoint.</span><br><span class="line"></span><br><span class="line"># HEALTH INDICATORS</span><br><span class="line">management.health.db.enabled=true # Whether to enable database health check.</span><br><span class="line">management.health.cassandra.enabled=true # Whether to enable Cassandra health check.</span><br><span class="line">management.health.couchbase.enabled=true # Whether to enable Couchbase health check.</span><br><span class="line">management.health.defaults.enabled=true # Whether to enable default health indicators.</span><br><span class="line">management.health.diskspace.enabled=true # Whether to enable disk space health check.</span><br><span class="line">management.health.diskspace.path= # Path used to compute the available disk space.</span><br><span class="line">management.health.diskspace.threshold=0 # Minimum disk space, in bytes, that should be available.</span><br><span class="line">management.health.elasticsearch.enabled=true # Whether to enable Elasticsearch health check.</span><br><span class="line">management.health.elasticsearch.indices= # Comma-separated index names.</span><br><span class="line">management.health.elasticsearch.response-timeout=100ms # Time to wait for a response from the cluster.</span><br><span class="line">management.health.influxdb.enabled=true # Whether to enable InfluxDB health check.</span><br><span class="line">management.health.jms.enabled=true # Whether to enable JMS health check.</span><br><span class="line">management.health.ldap.enabled=true # Whether to enable LDAP health check.</span><br><span class="line">management.health.mail.enabled=true # Whether to enable Mail health check.</span><br><span class="line">management.health.mongo.enabled=true # Whether to enable MongoDB health check.</span><br><span class="line">management.health.neo4j.enabled=true # Whether to enable Neo4j health check.</span><br><span class="line">management.health.rabbit.enabled=true # Whether to enable RabbitMQ health check.</span><br><span class="line">management.health.redis.enabled=true # Whether to enable Redis health check.</span><br><span class="line">management.health.solr.enabled=true # Whether to enable Solr health check.</span><br><span class="line">management.health.status.http-mapping= # Mapping of health statuses to HTTP status codes. By default, registered health statuses map to sensible defaults (for example, UP maps to 200).</span><br><span class="line">management.health.status.order=DOWN,OUT_OF_SERVICE,UP,UNKNOWN # Comma-separated list of health statuses in order of severity.</span><br><span class="line"></span><br><span class="line"># HTTP TRACING (HttpTraceProperties)</span><br><span class="line">management.trace.http.enabled=true # Whether to enable HTTP request-response tracing.</span><br><span class="line">management.trace.http.include=request-headers,response-headers,cookies,errors # Items to be included in the trace.</span><br><span class="line"></span><br><span class="line"># INFO CONTRIBUTORS (InfoContributorProperties)</span><br><span class="line">management.info.build.enabled=true # Whether to enable build info.</span><br><span class="line">management.info.defaults.enabled=true # Whether to enable default info contributors.</span><br><span class="line">management.info.env.enabled=true # Whether to enable environment info.</span><br><span class="line">management.info.git.enabled=true # Whether to enable git info.</span><br><span class="line">management.info.git.mode=simple # Mode to use to expose git information.</span><br><span class="line"></span><br><span class="line"># METRICS</span><br><span class="line">management.metrics.binders.files.enabled=true # Whether to enable files metrics.</span><br><span class="line">management.metrics.binders.integration.enabled=true # Whether to enable Spring Integration metrics.</span><br><span class="line">management.metrics.binders.jvm.enabled=true # Whether to enable JVM metrics.</span><br><span class="line">management.metrics.binders.logback.enabled=true # Whether to enable Logback metrics.</span><br><span class="line">management.metrics.binders.processor.enabled=true # Whether to enable processor metrics.</span><br><span class="line">management.metrics.binders.uptime.enabled=true # Whether to enable uptime metrics.</span><br><span class="line">management.metrics.distribution.percentiles-histogram.*= # Whether meter IDs starting-with the specified name should be publish percentile histograms.</span><br><span class="line">management.metrics.distribution.percentiles.*= # Specific computed non-aggregable percentiles to ship to the backend for meter IDs starting-with the specified name.</span><br><span class="line">management.metrics.distribution.sla.*= # Specific SLA boundaries for meter IDs starting-with the specified name. The longest match wins, the key `all` can also be used to configure all meters.</span><br><span class="line">management.metrics.enable.*= # Whether meter IDs starting-with the specified name should be enabled. The longest match wins, the key `all` can also be used to configure all meters.</span><br><span class="line">management.metrics.export.atlas.batch-size=10000 # Number of measurements per request to use for this backend. If more measurements are found, then multiple requests will be made.</span><br><span class="line">management.metrics.export.atlas.config-refresh-frequency=10s # Frequency for refreshing config settings from the LWC service.</span><br><span class="line">management.metrics.export.atlas.config-time-to-live=150s # Time to live for subscriptions from the LWC service.</span><br><span class="line">management.metrics.export.atlas.config-uri=http://localhost:7101/lwc/api/v1/expressions/local-dev # URI for the Atlas LWC endpoint to retrieve current subscriptions.</span><br><span class="line">management.metrics.export.atlas.connect-timeout=1s # Connection timeout for requests to this backend.</span><br><span class="line">management.metrics.export.atlas.enabled=true # Whether exporting of metrics to this backend is enabled.</span><br><span class="line">management.metrics.export.atlas.eval-uri=http://localhost:7101/lwc/api/v1/evaluate # URI for the Atlas LWC endpoint to evaluate the data for a subscription.</span><br><span class="line">management.metrics.export.atlas.lwc-enabled=false # Whether to enable streaming to Atlas LWC.</span><br><span class="line">management.metrics.export.atlas.meter-time-to-live=15m # Time to live for meters that do not have any activity. After this period the meter will be considered expired and will not get reported.</span><br><span class="line">management.metrics.export.atlas.num-threads=2 # Number of threads to use with the metrics publishing scheduler.</span><br><span class="line">management.metrics.export.atlas.read-timeout=10s # Read timeout for requests to this backend.</span><br><span class="line">management.metrics.export.atlas.step=1m # Step size (i.e. reporting frequency) to use.</span><br><span class="line">management.metrics.export.atlas.uri=http://localhost:7101/api/v1/publish # URI of the Atlas server.</span><br><span class="line">management.metrics.export.datadog.api-key= # Datadog API key.</span><br><span class="line">management.metrics.export.datadog.application-key= # Datadog application key. Not strictly required, but improves the Datadog experience by sending meter descriptions, types, and base units to Datadog.</span><br><span class="line">management.metrics.export.datadog.batch-size=10000 # Number of measurements per request to use for this backend. If more measurements are found, then multiple requests will be made.</span><br><span class="line">management.metrics.export.datadog.connect-timeout=1s # Connection timeout for requests to this backend.</span><br><span class="line">management.metrics.export.datadog.descriptions=true # Whether to publish descriptions metadata to Datadog. Turn this off to minimize the amount of metadata sent.</span><br><span class="line">management.metrics.export.datadog.enabled=true # Whether exporting of metrics to this backend is enabled.</span><br><span class="line">management.metrics.export.datadog.host-tag=instance # Tag that will be mapped to "host" when shipping metrics to Datadog.</span><br><span class="line">management.metrics.export.datadog.num-threads=2 # Number of threads to use with the metrics publishing scheduler.</span><br><span class="line">management.metrics.export.datadog.read-timeout=10s # Read timeout for requests to this backend.</span><br><span class="line">management.metrics.export.datadog.step=1m # Step size (i.e. reporting frequency) to use.</span><br><span class="line">management.metrics.export.datadog.uri=https://app.datadoghq.com # URI to ship metrics to. If you need to publish metrics to an internal proxy en-route to Datadog, you can define the location of the proxy with this.</span><br><span class="line">management.metrics.export.ganglia.addressing-mode=multicast # UDP addressing mode, either unicast or multicast.</span><br><span class="line">management.metrics.export.ganglia.duration-units=milliseconds # Base time unit used to report durations.</span><br><span class="line">management.metrics.export.ganglia.enabled=true # Whether exporting of metrics to Ganglia is enabled.</span><br><span class="line">management.metrics.export.ganglia.host=localhost # Host of the Ganglia server to receive exported metrics.</span><br><span class="line">management.metrics.export.ganglia.port=8649 # Port of the Ganglia server to receive exported metrics.</span><br><span class="line">management.metrics.export.ganglia.protocol-version=3.1 # Ganglia protocol version. Must be either 3.1 or 3.0.</span><br><span class="line">management.metrics.export.ganglia.rate-units=seconds # Base time unit used to report rates.</span><br><span class="line">management.metrics.export.ganglia.step=1m # Step size (i.e. reporting frequency) to use.</span><br><span class="line">management.metrics.export.ganglia.time-to-live=1 # Time to live for metrics on Ganglia. Set the multi-cast Time-To-Live to be one greater than the number of hops (routers) between the hosts.</span><br><span class="line">management.metrics.export.graphite.duration-units=milliseconds # Base time unit used to report durations.</span><br><span class="line">management.metrics.export.graphite.enabled=true # Whether exporting of metrics to Graphite is enabled.</span><br><span class="line">management.metrics.export.graphite.host=localhost # Host of the Graphite server to receive exported metrics.</span><br><span class="line">management.metrics.export.graphite.port=2004 # Port of the Graphite server to receive exported metrics.</span><br><span class="line">management.metrics.export.graphite.protocol=pickled # Protocol to use while shipping data to Graphite.</span><br><span class="line">management.metrics.export.graphite.rate-units=seconds # Base time unit used to report rates.</span><br><span class="line">management.metrics.export.graphite.step=1m # Step size (i.e. reporting frequency) to use.</span><br><span class="line">management.metrics.export.graphite.tags-as-prefix= # For the default naming convention, turn the specified tag keys into part of the metric prefix.</span><br><span class="line">management.metrics.export.influx.auto-create-db=true # Whether to create the Influx database if it does not exist before attempting to publish metrics to it.</span><br><span class="line">management.metrics.export.influx.batch-size=10000 # Number of measurements per request to use for this backend. If more measurements are found, then multiple requests will be made.</span><br><span class="line">management.metrics.export.influx.compressed=true # Whether to enable GZIP compression of metrics batches published to Influx.</span><br><span class="line">management.metrics.export.influx.connect-timeout=1s # Connection timeout for requests to this backend.</span><br><span class="line">management.metrics.export.influx.consistency=one # Write consistency for each point.</span><br><span class="line">management.metrics.export.influx.db=mydb # Tag that will be mapped to "host" when shipping metrics to Influx.</span><br><span class="line">management.metrics.export.influx.enabled=true # Whether exporting of metrics to this backend is enabled.</span><br><span class="line">management.metrics.export.influx.num-threads=2 # Number of threads to use with the metrics publishing scheduler.</span><br><span class="line">management.metrics.export.influx.password= # Login password of the Influx server.</span><br><span class="line">management.metrics.export.influx.read-timeout=10s # Read timeout for requests to this backend.</span><br><span class="line">management.metrics.export.influx.retention-policy= # Retention policy to use (Influx writes to the DEFAULT retention policy if one is not specified).</span><br><span class="line">management.metrics.export.influx.step=1m # Step size (i.e. reporting frequency) to use.</span><br><span class="line">management.metrics.export.influx.uri=http://localhost:8086 # URI of the Influx server.</span><br><span class="line">management.metrics.export.influx.user-name= # Login user of the Influx server.</span><br><span class="line">management.metrics.export.jmx.enabled=true # Whether exporting of metrics to JMX is enabled.</span><br><span class="line">management.metrics.export.jmx.step=1m # Step size (i.e. reporting frequency) to use.</span><br><span class="line">management.metrics.export.newrelic.account-id= # New Relic account ID.</span><br><span class="line">management.metrics.export.newrelic.api-key= # New Relic API key.</span><br><span class="line">management.metrics.export.newrelic.batch-size=10000 # Number of measurements per request to use for this backend. If more measurements are found, then multiple requests will be made.</span><br><span class="line">management.metrics.export.newrelic.connect-timeout=1s # Connection timeout for requests to this backend.</span><br><span class="line">management.metrics.export.newrelic.enabled=true # Whether exporting of metrics to this backend is enabled.</span><br><span class="line">management.metrics.export.newrelic.num-threads=2 # Number of threads to use with the metrics publishing scheduler.</span><br><span class="line">management.metrics.export.newrelic.read-timeout=10s # Read timeout for requests to this backend.</span><br><span class="line">management.metrics.export.newrelic.step=1m # Step size (i.e. reporting frequency) to use.</span><br><span class="line">management.metrics.export.newrelic.uri=https://insights-collector.newrelic.com # URI to ship metrics to.</span><br><span class="line">management.metrics.export.prometheus.descriptions=true # Whether to enable publishing descriptions as part of the scrape payload to Prometheus. Turn this off to minimize the amount of data sent on each scrape.</span><br><span class="line">management.metrics.export.prometheus.enabled=true # Whether exporting of metrics to Prometheus is enabled.</span><br><span class="line">management.metrics.export.prometheus.step=1m # Step size (i.e. reporting frequency) to use.</span><br><span class="line">management.metrics.export.signalfx.access-token= # SignalFX access token.</span><br><span class="line">management.metrics.export.signalfx.batch-size=10000 # Number of measurements per request to use for this backend. If more measurements are found, then multiple requests will be made.</span><br><span class="line">management.metrics.export.signalfx.connect-timeout=1s # Connection timeout for requests to this backend.</span><br><span class="line">management.metrics.export.signalfx.enabled=true # Whether exporting of metrics to this backend is enabled.</span><br><span class="line">management.metrics.export.signalfx.num-threads=2 # Number of threads to use with the metrics publishing scheduler.</span><br><span class="line">management.metrics.export.signalfx.read-timeout=10s # Read timeout for requests to this backend.</span><br><span class="line">management.metrics.export.signalfx.source= # Uniquely identifies the app instance that is publishing metrics to SignalFx. Defaults to the local host name.</span><br><span class="line">management.metrics.export.signalfx.step=10s # Step size (i.e. reporting frequency) to use.</span><br><span class="line">management.metrics.export.signalfx.uri=https://ingest.signalfx.com # URI to ship metrics to.</span><br><span class="line">management.metrics.export.simple.enabled=true # Whether, in the absence of any other exporter, exporting of metrics to an in-memory backend is enabled.</span><br><span class="line">management.metrics.export.simple.mode=cumulative # Counting mode.</span><br><span class="line">management.metrics.export.simple.step=1m # Step size (i.e. reporting frequency) to use.</span><br><span class="line">management.metrics.export.statsd.enabled=true # Whether exporting of metrics to StatsD is enabled.</span><br><span class="line">management.metrics.export.statsd.flavor=datadog # StatsD line protocol to use.</span><br><span class="line">management.metrics.export.statsd.host=localhost # Host of the StatsD server to receive exported metrics.</span><br><span class="line">management.metrics.export.statsd.max-packet-length=1400 # Total length of a single payload should be kept within your network's MTU.</span><br><span class="line">management.metrics.export.statsd.polling-frequency=10s # How often gauges will be polled. When a gauge is polled, its value is recalculated and if the value has changed (or publishUnchangedMeters is true), it is sent to the StatsD server.</span><br><span class="line">management.metrics.export.statsd.port=8125 # Port of the StatsD server to receive exported metrics.</span><br><span class="line">management.metrics.export.statsd.publish-unchanged-meters=true # Whether to send unchanged meters to the StatsD server.</span><br><span class="line">management.metrics.export.wavefront.api-token= # API token used when publishing metrics directly to the Wavefront API host.</span><br><span class="line">management.metrics.export.wavefront.batch-size=10000 # Number of measurements per request to use for this backend. If more measurements are found, then multiple requests will be made.</span><br><span class="line">management.metrics.export.wavefront.connect-timeout=1s # Connection timeout for requests to this backend.</span><br><span class="line">management.metrics.export.wavefront.enabled=true # Whether exporting of metrics to this backend is enabled.</span><br><span class="line">management.metrics.export.wavefront.global-prefix= # Global prefix to separate metrics originating from this app's white box instrumentation from those originating from other Wavefront integrations when viewed in the Wavefront UI.</span><br><span class="line">management.metrics.export.wavefront.num-threads=2 # Number of threads to use with the metrics publishing scheduler.</span><br><span class="line">management.metrics.export.wavefront.read-timeout=10s # Read timeout for requests to this backend.</span><br><span class="line">management.metrics.export.wavefront.source= # Unique identifier for the app instance that is the source of metrics being published to Wavefront. Defaults to the local host name.</span><br><span class="line">management.metrics.export.wavefront.step=10s # Step size (i.e. reporting frequency) to use.</span><br><span class="line">management.metrics.export.wavefront.uri=https://longboard.wavefront.com # URI to ship metrics to.</span><br><span class="line">management.metrics.use-global-registry=true # Whether auto-configured MeterRegistry implementations should be bound to the global static registry on Metrics.</span><br><span class="line">management.metrics.tags.*= # Common tags that are applied to every meter.</span><br><span class="line">management.metrics.web.client.max-uri-tags=100 # Maximum number of unique URI tag values allowed. After the max number of tag values is reached, metrics with additional tag values are denied by filter.</span><br><span class="line">management.metrics.web.client.requests-metric-name=http.client.requests # Name of the metric for sent requests.</span><br><span class="line">management.metrics.web.server.auto-time-requests=true # Whether requests handled by Spring MVC or WebFlux should be automatically timed.</span><br><span class="line">management.metrics.web.server.requests-metric-name=http.server.requests # Name of the metric for received requests.</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># ----------------------------------------</span><br><span class="line"># DEVTOOLS PROPERTIES</span><br><span class="line"># ----------------------------------------</span><br><span class="line"></span><br><span class="line"># DEVTOOLS (DevToolsProperties)</span><br><span class="line">spring.devtools.livereload.enabled=true # Whether to enable a livereload.com-compatible server.</span><br><span class="line">spring.devtools.livereload.port=35729 # Server port.</span><br><span class="line">spring.devtools.restart.additional-exclude= # Additional patterns that should be excluded from triggering a full restart.</span><br><span class="line">spring.devtools.restart.additional-paths= # Additional paths to watch for changes.</span><br><span class="line">spring.devtools.restart.enabled=true # Whether to enable automatic restart.</span><br><span class="line">spring.devtools.restart.exclude=META-INF/maven/**,META-INF/resources/**,resources/**,static/**,public/**,templates/**,**/*Test.class,**/*Tests.class,git.properties,META-INF/build-info.properties # Patterns that should be excluded from triggering a full restart.</span><br><span class="line">spring.devtools.restart.log-condition-evaluation-delta=true # Whether to log the condition evaluation delta upon restart.</span><br><span class="line">spring.devtools.restart.poll-interval=1s # Amount of time to wait between polling for classpath changes.</span><br><span class="line">spring.devtools.restart.quiet-period=400ms # Amount of quiet time required without any classpath changes before a restart is triggered.</span><br><span class="line">spring.devtools.restart.trigger-file= # Name of a specific file that, when changed, triggers the restart check. If not specified, any classpath file change triggers the restart.</span><br><span class="line"></span><br><span class="line"># REMOTE DEVTOOLS (RemoteDevToolsProperties)</span><br><span class="line">spring.devtools.remote.context-path=/.~~spring-boot!~ # Context path used to handle the remote connection.</span><br><span class="line">spring.devtools.remote.proxy.host= # The host of the proxy to use to connect to the remote application.</span><br><span class="line">spring.devtools.remote.proxy.port= # The port of the proxy to use to connect to the remote application.</span><br><span class="line">spring.devtools.remote.restart.enabled=true # Whether to enable remote restart.</span><br><span class="line">spring.devtools.remote.secret= # A shared secret required to establish a connection (required to enable remote support).</span><br><span class="line">spring.devtools.remote.secret-header-name=X-AUTH-TOKEN # HTTP header used to transfer the shared secret.</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># ----------------------------------------</span><br><span class="line"># TESTING PROPERTIES</span><br><span class="line"># ----------------------------------------</span><br><span class="line"></span><br><span class="line">spring.test.database.replace=any # Type of existing DataSource to replace.</span><br><span class="line">spring.test.mockmvc.print=default # MVC Print option.</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Spring-Boot-常用应用程序属性&quot;&gt;&lt;a href=&quot;#Spring-Boot-常用应用程序属性&quot; class=&quot;headerlink&quot; title=&quot;Spring Boot 常用应用程序属性&quot;&gt;&lt;/a&gt;Spring Boot 常用应用程序属性&lt;/h1&gt;&lt;
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>SpringBoot学习笔记</title>
    <link href="https://blueleer.github.io/2018/06/01/SpringBoot%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <id>https://blueleer.github.io/2018/06/01/SpringBoot学习笔记/</id>
    <published>2018-06-01T08:38:25.000Z</published>
    <updated>2018-06-01T11:59:17.893Z</updated>
    
    <summary type="html">
    
    </summary>
    
      <category term="Spring Boot" scheme="https://blueleer.github.io/categories/Spring-Boot/"/>
    
    
      <category term="Spring Boot" scheme="https://blueleer.github.io/tags/Spring-Boot/"/>
    
  </entry>
  
  <entry>
    <title>回车和换行</title>
    <link href="https://blueleer.github.io/2018/04/07/%E5%9B%9E%E8%BD%A6%E5%92%8C%E6%8D%A2%E8%A1%8C/"/>
    <id>https://blueleer.github.io/2018/04/07/回车和换行/</id>
    <published>2018-04-07T03:43:40.000Z</published>
    <updated>2018-04-07T17:06:23.583Z</updated>
    
    <content type="html"><![CDATA[<p>今天在做爬虫的时候,需要匹配下面Title中的内容,发现写的正则表达式<strong>question_link(.<em>)&gt;(\n</em>)(.+)(\n*)&lt;</strong>竟然匹配不上里面的中文,原来在win系统中文件中的换行其实包含了两个字符, <strong>/CR(回车),/LF(换行)</strong>,这两个”.”都是匹配不上的.</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">h2</span>&gt;</span><span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">"question_link"</span> <span class="attr">href</span>=<span class="string">"/question/270597366/answer/355546388"</span> <span class="attr">data-id</span>=<span class="string">"22407872"</span> <span class="attr">data-za-element-name</span>=<span class="string">"Title"</span>&gt;</span></span><br><span class="line">如何看待星巴克被指含有致癌物质（丙烯酰胺Acrylamide）？</span><br><span class="line"><span class="tag">&lt;/<span class="name">a</span>&gt;</span><span class="tag">&lt;/<span class="name">h2</span>&gt;</span></span><br></pre></td></tr></table></figure><p>修改成下面,成功匹配</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">question_link(.*)&gt;(\r)(\n)(.*)</span><br></pre></td></tr></table></figure><p>完整代码为:</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="comment">// 其中这段是从文件中摘录的,文件中查看特殊符号显示了换行包含两个字符 一个回车一个换行</span></span><br><span class="line">String s = <span class="string">"&lt;h2&gt;&lt;a class="</span>question_link<span class="string">" href="</span>/question/<span class="number">270597366</span>/answer/<span class="number">355546388</span><span class="string">" data-id="</span><span class="number">22407872</span><span class="string">" data-za-element-name="</span>Title<span class="string">"&gt;</span></span><br><span class="line"><span class="string">如何看待星巴克被指含有致癌物质（丙烯酰胺Acrylamide）？</span></span><br><span class="line"><span class="string">&lt;/a&gt;&lt;/h2&gt;"</span></span><br><span class="line">    </span><br><span class="line">String regex = <span class="string">"question_link(.*)&gt;(\\r)(\\n)(.*)"</span>;</span><br><span class="line">Pattern pattern = Pattern.compile(regex);</span><br><span class="line">Matcher matcher = pattern.matcher(sb.toString());</span><br><span class="line">matcher.find();</span><br><span class="line">String group = matcher.group(<span class="number">4</span>);</span><br><span class="line">System.out.println(group);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 输出:</span></span><br><span class="line"><span class="comment">// 如何看待星巴克被指含有致癌物质（丙烯酰胺Acrylamide）？</span></span><br></pre></td></tr></table></figure><p>小示例:</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></pre></td><td class="code"><pre><span class="line">String s1 = <span class="string">"\r1234\r567"</span>;</span><br><span class="line">String s2 = <span class="string">"\n12345"</span>;</span><br><span class="line">System.out.println(s1);</span><br><span class="line">System.out.println(s2);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 输出:</span></span><br><span class="line"><span class="number">567</span></span><br><span class="line"></span><br><span class="line"><span class="number">12345</span></span><br></pre></td></tr></table></figure><p><strong>再次强调,回车和换行,”.”都不能匹配</strong></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></pre></td><td class="code"><pre><span class="line">String s1 = <span class="string">"\r1234\r567"</span>;</span><br><span class="line">String regex = <span class="string">".*"</span>;</span><br><span class="line">String regex1 = <span class="string">"\\r.*"</span>;</span><br><span class="line">Pattern pattern = Pattern.compile(regex1); <span class="comment">// 换成regex则下面的输出为空,也就是不能匹配</span></span><br><span class="line">Matcher matcher = pattern.matcher(s1);</span><br><span class="line">matcher.find();</span><br><span class="line">System.out.println(matcher.group());</span><br></pre></td></tr></table></figure><p>更多知识请参考:</p><p><a href="https://blog.csdn.net/fanwenbo/article/details/54848429" target="_blank" rel="noopener">终于搞懂了回车与换行的区别</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;今天在做爬虫的时候,需要匹配下面Title中的内容,发现写的正则表达式&lt;strong&gt;question_link(.&lt;em&gt;)&amp;gt;(\n&lt;/em&gt;)(.+)(\n*)&amp;lt;&lt;/strong&gt;竟然匹配不上里面的中文,原来在win系统中文件中的换行其实包含了两个字符, &lt;
      
    
    </summary>
    
      <category term="其他" scheme="https://blueleer.github.io/categories/%E5%85%B6%E4%BB%96/"/>
    
    
      <category term="计算机" scheme="https://blueleer.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
      <category term="其他" scheme="https://blueleer.github.io/tags/%E5%85%B6%E4%BB%96/"/>
    
  </entry>
  
  <entry>
    <title>AnjularJS中ngoptions使用小结</title>
    <link href="https://blueleer.github.io/2018/03/28/AnjularJS%E4%B8%ADngoptions%E4%BD%BF%E7%94%A8%E5%B0%8F%E7%BB%93/"/>
    <id>https://blueleer.github.io/2018/03/28/AnjularJS中ngoptions使用小结/</id>
    <published>2018-03-28T08:16:22.000Z</published>
    <updated>2018-06-28T07:46:41.006Z</updated>
    
    <content type="html"><![CDATA[<h1 id="AnjularJS中ngoptions使用小结"><a href="#AnjularJS中ngoptions使用小结" class="headerlink" title="AnjularJS中ngoptions使用小结"></a>AnjularJS中<code>ngoptions</code>使用小结</h1><p><code>ng-options</code>是<code>angular-1.3</code>新出的一个指令。<code>ng-options</code>属性可以在表达式中使用数组或对象来自动生成一个<code>select</code>中的<code>option</code>列表。<code>ng-options</code>与<code>ng-repeat</code>很相似，很多时候可以用<code>ng-repeat</code>来代替<code>ng-options</code>。但是<code>ng-options</code>提供了一些好处，例如<strong>减少内存提高速度，以及提供选择框的选项来让用户选择</strong>。 </p><p>代码:</p><figure class="highlight js"><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><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br></pre></td><td class="code"><pre><span class="line">&lt;!DOCTYPE html&gt;</span><br><span class="line">&lt;html&gt;</span><br><span class="line">&lt;head&gt;</span><br><span class="line">  &lt;title&gt;AnjularJS 中的select中的ng-options&lt;<span class="regexp">/title&gt;</span></span><br><span class="line"><span class="regexp">   &lt;!-- &lt;script type="text/</span>javascript<span class="string">" src="</span>jquery<span class="number">-2.2</span><span class="number">.3</span>.min.js<span class="string">"&gt;&lt;/script&gt; --&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">  &lt;script type="</span>text/javascript<span class="string">" src="</span>angular.min.js<span class="string">"&gt;&lt;/script&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">  &lt;script type="</span>text/javascript<span class="string">"&gt;</span></span><br><span class="line"><span class="string">    var app = angular.module("</span>myApp<span class="string">",[]);</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">// 所有的应用都有一个 $rootScope，它可以作用在 ng-app 指令包含的所有 HTML 元素中。</span></span><br><span class="line"><span class="string">// $rootScope 可作用于整个应用中。是各个controller中scope的桥梁。用rootscope定义的值,可以在各个 controller 中使用。</span></span><br><span class="line"><span class="string">// 但是需要注意的是,需要将包含$rootScope的控制前定义在最前面,在它前面的控制器中是访问不到的</span></span><br><span class="line"><span class="string">    app.controller('baseController',['$rootScope',function($rootScope)&#123;</span></span><br><span class="line"><span class="string">      $rootScope.optData = [&#123;</span></span><br><span class="line"><span class="string">          id: 10001,</span></span><br><span class="line"><span class="string">          MainCategory: '男',</span></span><br><span class="line"><span class="string">          ProductName: '水洗T恤',</span></span><br><span class="line"><span class="string">          ProductColor: '白'</span></span><br><span class="line"><span class="string">      &#125;,&#123;</span></span><br><span class="line"><span class="string">          id: 10002,</span></span><br><span class="line"><span class="string">          MainCategory: '女',</span></span><br><span class="line"><span class="string">          ProductName: '圓領短袖',</span></span><br><span class="line"><span class="string">          ProductColor: '黃'</span></span><br><span class="line"><span class="string">      &#125;,&#123;</span></span><br><span class="line"><span class="string">          id: 10003,</span></span><br><span class="line"><span class="string">          MainCategory: '女',</span></span><br><span class="line"><span class="string">          ProductName: '圓領短袖',</span></span><br><span class="line"><span class="string">          ProductColor: '黃'</span></span><br><span class="line"><span class="string">      &#125;];</span></span><br><span class="line"><span class="string">    &#125;]);</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    app.controller("</span>controller1<span class="string">",function($scope)&#123;</span></span><br><span class="line"><span class="string">      $scope.selected = "</span><span class="string">";</span></span><br><span class="line"><span class="string">    &#125;);</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    app.controller("</span>controller2<span class="string">",function($scope)&#123;</span></span><br><span class="line"><span class="string">      $scope.selected = "</span><span class="string">";</span></span><br><span class="line"><span class="string">    &#125;);</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    app.controller("</span>controller3<span class="string">",function($scope)&#123;</span></span><br><span class="line"><span class="string">      $scope.selected = "</span><span class="string">";</span></span><br><span class="line"><span class="string">    &#125;);</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    app.controller("</span>controller4<span class="string">",function($scope)&#123;</span></span><br><span class="line"><span class="string">      $scope.selected = "</span><span class="string">";</span></span><br><span class="line"><span class="string">    &#125;);</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">  &lt;/script&gt;</span></span><br><span class="line"><span class="string">&lt;/head&gt;</span></span><br><span class="line"><span class="string">&lt;body ng-app="</span>myApp<span class="string">" ng-controller="</span>baseController<span class="string">"&gt;</span></span><br><span class="line"><span class="string">    &lt;!-- 1.基本下拉效果(lable for value in array)</span></span><br><span class="line"><span class="string">　　其中select标签中的ng-model属性必须有，其值为选中的对象或属性值。 --&gt;</span></span><br><span class="line"><span class="string">    &lt;div ng-controller = "</span>controller1<span class="string">"&gt;</span></span><br><span class="line"><span class="string">        &lt;p&gt;1.基本下拉效果(lable for value in array)&lt;/p&gt;</span></span><br><span class="line"><span class="string">        &lt;p&gt;选项:&#123;&#123;selected&#125;&#125;&lt;/p&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        &lt;select ng-model="</span>selected<span class="string">" ng-options="</span>o.id <span class="keyword">for</span> o <span class="keyword">in</span> optData<span class="string">"&gt;</span></span><br><span class="line"><span class="string">            &lt;option value="</span><span class="string">"&gt;请选择&lt;/option&gt;</span></span><br><span class="line"><span class="string">        &lt;/select&gt;</span></span><br><span class="line"><span class="string">    &lt;/div&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &lt;!-- 2.自定义下拉显示名称(label for value in array)</span></span><br><span class="line"><span class="string">    label可以根据需要拼接出不同的字符串 --&gt;</span></span><br><span class="line"><span class="string">    &lt;div ng-controller = "</span>controller2<span class="string">"&gt;</span></span><br><span class="line"><span class="string">        &lt;p&gt;2.自定义下拉显示名称 label可以根据需求拼接出不同的字符串(label for value in array)&lt;/p&gt;</span></span><br><span class="line"><span class="string">        &lt;p&gt;选项:&#123;&#123;selected&#125;&#125;&lt;/p&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        &lt;select ng-model="</span>selected<span class="string">" ng-options="</span>(o.ProductColor+<span class="string">'-'</span>+o.ProductName) <span class="keyword">for</span> o <span class="keyword">in</span> optData<span class="string">"&gt;</span></span><br><span class="line"><span class="string">        &lt;!-- &lt;select ng-model="</span>selected<span class="string">" ng-options="</span>o.id <span class="keyword">for</span> o <span class="keyword">in</span> optData<span class="string">"&gt; --&gt;</span></span><br><span class="line"><span class="string">            &lt;option value="</span><span class="string">"&gt;请选择&lt;/option&gt;</span></span><br><span class="line"><span class="string">        &lt;/select&gt;</span></span><br><span class="line"><span class="string">    &lt;/div&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &lt;!-- 第3种用法：ng-options 选项分组</span></span><br><span class="line"><span class="string">    group by分组项 --&gt;</span></span><br><span class="line"><span class="string">    &lt;div ng-controller = "</span>controller3<span class="string">"&gt;</span></span><br><span class="line"><span class="string">        &lt;p&gt;3.ng-options 选项分组(usage:label group by groupName for value in array)&lt;/p&gt;</span></span><br><span class="line"><span class="string">        &lt;p&gt;选项:&#123;&#123;selected&#125;&#125;&lt;/p&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        &lt;select ng-model="</span>selected<span class="string">" ng-options="</span>(o.ProductColor+<span class="string">'-'</span>+o.ProductName) group by o.MainCategory <span class="keyword">for</span> o <span class="keyword">in</span> optData<span class="string">"&gt;</span></span><br><span class="line"><span class="string">            &lt;option value="</span><span class="string">"&gt;-- 请选择 --&lt;/option&gt;</span></span><br><span class="line"><span class="string">        &lt;/select&gt;</span></span><br><span class="line"><span class="string">    &lt;/div&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &lt;!-- 第4种用法：ng-options 自定义ngModel的绑定</span></span><br><span class="line"><span class="string">    下面selected的值为optData的id 效果 http://sandbox.runjs.cn/show/nhi8ubrb --&gt;</span></span><br><span class="line"><span class="string">    &lt;div ng-controller = "</span>controller4<span class="string">"&gt;</span></span><br><span class="line"><span class="string">        &lt;p&gt;4.ng-options 自定义ngModel的绑定(usage:select as label for value in array)&lt;/p&gt;</span></span><br><span class="line"><span class="string">        &lt;p&gt;选项:&#123;&#123;selected&#125;&#125;&lt;/p&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        &lt;select ng-model="</span>selected<span class="string">" ng-options="</span>o.id <span class="keyword">as</span> o.ProductName <span class="keyword">for</span> o <span class="keyword">in</span> optData<span class="string">"&gt;</span></span><br><span class="line"><span class="string">            &lt;option value="</span><span class="string">"&gt;-- 请选择 --&lt;/option&gt;</span></span><br><span class="line"><span class="string">        &lt;/select&gt;</span></span><br><span class="line"><span class="string">    &lt;/div&gt;</span></span><br><span class="line"><span class="string">&lt;/body&gt;</span></span><br><span class="line"><span class="string">&lt;/html&gt;</span></span><br></pre></td></tr></table></figure><p>预览代码效果:<a href="http://sandbox.runjs.cn/show/r512c74a" target="_blank" rel="noopener">http://sandbox.runjs.cn/show/r512c74a</a></p><p><strong>总结:</strong></p><ol><li><p>基本用法（显示 o 对象的某一个属性值作为下拉名称）： </p><p>ng-options = ” o.attr for o in dataArr “</p></li><li><p>显示更多：同一对象显示更多下拉名称（比如需要显示 o 对象的两个或更多个属性值作为一个下拉列表项）: ng-options = ” <strong>(o.attr1 + ‘-’ + o.attr2)</strong> for o in dataArr “</p></li><li><p>选项分组（将下拉选项按照 o 对象某一属性分组显示）： </p><p>ng-options = ” (o.attr1 + ‘-’ + o.attr2) <strong>group by o.attr3</strong> for o in dataArr “</p></li><li><p>自定义ngModel的绑定:</p><p> ng-options = ” <strong>o.attr1 as o.attr2</strong> for o in dataArr ” ,</p><p> 这时，<strong>o.attr1 是 ng-model 绑定的值，o.attr2 是下拉列表显示的值。</strong></p></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;AnjularJS中ngoptions使用小结&quot;&gt;&lt;a href=&quot;#AnjularJS中ngoptions使用小结&quot; class=&quot;headerlink&quot; title=&quot;AnjularJS中ngoptions使用小结&quot;&gt;&lt;/a&gt;AnjularJS中&lt;code&gt;n
      
    
    </summary>
    
      <category term="web前端" scheme="https://blueleer.github.io/categories/web%E5%89%8D%E7%AB%AF/"/>
    
    
      <category term="AngularJS" scheme="https://blueleer.github.io/tags/AngularJS/"/>
    
  </entry>
  
  <entry>
    <title>AngularJS中Controller的三种写法</title>
    <link href="https://blueleer.github.io/2018/03/27/AngularJS%E4%B8%ADController%E7%9A%84%E4%B8%89%E7%A7%8D%E5%86%99%E6%B3%95/"/>
    <id>https://blueleer.github.io/2018/03/27/AngularJS中Controller的三种写法/</id>
    <published>2018-03-27T07:50:17.000Z</published>
    <updated>2018-06-28T07:46:32.758Z</updated>
    
    <content type="html"><![CDATA[<h1 id="AngularJS中Controller的三种写法"><a href="#AngularJS中Controller的三种写法" class="headerlink" title="AngularJS中Controller的三种写法"></a>AngularJS中Controller的三种写法</h1><p>在<code>Angular</code>中，<code>Directive</code>、<code>Service</code>、<code>Filter</code>、<code>Controller</code>都是以工厂方法的方式给出，而工厂方法的参数名对应着该工厂方法依赖的<code>Service</code> ,关于controller的几种写法,这里简单的列举了三种:</p><h2 id="第一种"><a href="#第一种" class="headerlink" title="第一种"></a>第一种</h2><figure class="highlight js"><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></pre></td><td class="code"><pre><span class="line">&lt;script type=<span class="string">"text/javascript"</span> src=<span class="string">"angular.min.js"</span>&gt;&lt;/script&gt;</span><br><span class="line">&lt;script type=<span class="string">"text/javascript"</span>&gt;</span><br><span class="line">    <span class="keyword">var</span> app = angular.module(<span class="string">"myApp"</span>,[]);</span><br><span class="line"><span class="comment">// 声明了方法需要注入的参数,然后定义了方法体</span></span><br><span class="line">    <span class="keyword">var</span> controller_1 =[<span class="string">'$scope'</span>,<span class="function"><span class="keyword">function</span>(<span class="params">$scope</span>)</span>&#123;</span><br><span class="line">      $scope.alertMessage = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        alert(<span class="string">"Hello World!"</span>);</span><br><span class="line">      &#125;;</span><br><span class="line">    &#125;];</span><br><span class="line">     <span class="comment">// 将controller_1绑定到app上</span></span><br><span class="line">    app.controller(<span class="string">"controller1"</span>,controller_1);</span><br><span class="line">&lt;<span class="regexp">/script&gt;</span></span><br></pre></td></tr></table></figure><h2 id="第二种"><a href="#第二种" class="headerlink" title="第二种"></a>第二种</h2><figure class="highlight js"><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">app.controlle(<span class="string">"controller2"</span>,<span class="function"><span class="keyword">function</span>(<span class="params">$scope</span>)</span>&#123;</span><br><span class="line">    $scope.alertMessage = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        alert(<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>此种方法最为常用.</p><h2 id="第三种"><a href="#第三种" class="headerlink" title="第三种"></a>第三种</h2><figure class="highlight js"><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="function"><span class="keyword">function</span> <span class="title">controller3</span>(<span class="params">$scope</span>)</span>&#123;</span><br><span class="line">  $scope.alertMessage3 = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">    alert(<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>直接写方法,然后在<code>ng-controller</code>处直接引用该方法即可.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;AngularJS中Controller的三种写法&quot;&gt;&lt;a href=&quot;#AngularJS中Controller的三种写法&quot; class=&quot;headerlink&quot; title=&quot;AngularJS中Controller的三种写法&quot;&gt;&lt;/a&gt;AngularJS中C
      
    
    </summary>
    
      <category term="web前端" scheme="https://blueleer.github.io/categories/web%E5%89%8D%E7%AB%AF/"/>
    
    
      <category term="AngularJS" scheme="https://blueleer.github.io/tags/AngularJS/"/>
    
  </entry>
  
  <entry>
    <title>Shiro安全框架之与web集成（2）</title>
    <link href="https://blueleer.github.io/2017/06/07/Shiro%E5%AE%89%E5%85%A8%E6%A1%86%E6%9E%B6%E4%B9%8B%E4%B8%8Eweb%E9%9B%86%E6%88%90%EF%BC%882%EF%BC%89/"/>
    <id>https://blueleer.github.io/2017/06/07/Shiro安全框架之与web集成（2）/</id>
    <published>2017-06-07T08:06:54.000Z</published>
    <updated>2018-06-07T11:00:55.913Z</updated>
    
    <content type="html"><![CDATA[<p>为了深入理解Shiro与web项目集成的工作原理,我们搭建一个普通的web项目</p><h2 id="1-导入相关依赖"><a href="#1-导入相关依赖" class="headerlink" title="1. 导入相关依赖"></a>1. 导入相关依赖</h2><p><code>pom.xml</code>: shiro-core和shiro-web</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></pre></td><td class="code"><pre><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">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">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">shiro.version</span>&gt;</span>1.2.2<span class="tag">&lt;/<span class="name">shiro.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">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.apache.shiro<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>shiro-core<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>$&#123;shiro.version&#125;<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="comment">&lt;!--因为是合web项目集成,因此需要导入shiro-web这个jar包--&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.apache.shiro<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>shiro-web<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>$&#123;shiro.version&#125;<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><br></pre></td></tr></table></figure><h2 id="2-在web-xml中配置shiro的过滤器shiroFilter"><a href="#2-在web-xml中配置shiro的过滤器shiroFilter" class="headerlink" title="2.在web.xml中配置shiro的过滤器shiroFilter"></a>2.在<code>web.xml</code>中配置shiro的过滤器shiroFilter</h2><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">web-app...</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!--初始化securityManager对象所需要的环境配置--&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--主要是为了加载ini文件,如果将shiro.ini放在WEB-INF下或者classpath根目录下,这个也不用配置,EnvironmentLoaderListener会自动读取并且加载--&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--&lt;context-param&gt;--&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--&lt;param-name&gt;shiroEnvironmentClass&lt;/param-name&gt;--&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--&lt;param-value&gt;org.apache.shiro.web.env.IniWebEnvironment&lt;/param-value&gt;--&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--&lt;/context-param&gt;--&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--&lt;context-param&gt;--&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--&lt;param-name&gt;shiroConfigLocations&lt;/param-name&gt;--&gt;</span></span><br><span class="line">        <span class="comment">&lt;!----&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--&lt;param-value&gt;classpath:shiro.ini&lt;/param-value&gt;--&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--&lt;/context-param&gt;--&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--</span></span><br><span class="line"><span class="comment">       从Shiro1.2开始引入了Environment/WebEnvironment的概念，即由它们的实现提供相应的SecurityManager及其相应的依赖。</span></span><br><span class="line"><span class="comment">       ShiroFilter会自动找到Environment然后获取相应的依赖。</span></span><br><span class="line"><span class="comment">       底层:返回反射创建shiroEnvironmentClass对象,调用其init方法.</span></span><br><span class="line"><span class="comment">       shiroEnvironmentClass中的init方法创建SecurityManager实例并绑定到当前运行环境</span></span><br><span class="line"><span class="comment">    --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">listener</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">listener-class</span>&gt;</span>org.apache.shiro.web.env.EnvironmentLoaderListener<span class="tag">&lt;/<span class="name">listener-class</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">listener</span>&gt;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">filter</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">filter-name</span>&gt;</span>shiroFilter<span class="tag">&lt;/<span class="name">filter-name</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">filter-class</span>&gt;</span>org.apache.shiro.web.servlet.ShiroFilter<span class="tag">&lt;/<span class="name">filter-class</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">filter</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">filter-mapping</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">filter-name</span>&gt;</span>shiroFilter<span class="tag">&lt;/<span class="name">filter-name</span>&gt;</span></span><br><span class="line">        <span class="comment">&lt;!-- 拦截所有的请求 --&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">url-pattern</span>&gt;</span>/*<span class="tag">&lt;/<span class="name">url-pattern</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">filter-mapping</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">web-app</span>&gt;</span></span><br></pre></td></tr></table></figure><p>具体可以参考:<a href="https://shiro.apache.org/webapp-tutorial.html" target="_blank" rel="noopener">官方文档</a></p><p>这里简单说下<code>EnvironmentLoaderListener</code>和<code>ShiroFilter</code>的作用:</p><ol><li>在容器启动时创建 WebEnvironment 对象，并由该对象来读取 Shiro 配置文件，创建WebSecurityManager 与 FilterChainResolver 对象，它们都在后面将要出现的 ShiroFilter 中起到了重要作用。</li><li>从 web.xml 中同样可以得知，ShiroFilter 是整个 Shiro 框架的门面，因为它拦截了所有的请求，后面是需要 Authentication（认证）还是需要 Authorization（授权）都由它说了算。</li></ol><h2 id="3-创建shiro-ini文件"><a href="#3-创建shiro-ini文件" class="headerlink" title="3. 创建shiro.ini文件"></a>3. 创建<code>shiro.ini</code>文件</h2><figure class="highlight"><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></pre></td><td class="code"><pre><span class="line"><span class="section">[main]</span></span><br><span class="line"><span class="comment">#默认是/login.jsp(登录认证的url,默认是/login.jsp)</span></span><br><span class="line">authc.loginUrl=/login</span><br><span class="line"><span class="comment">#用户无需要的角色时跳转的页面</span></span><br><span class="line">roles.unauthorizedUrl=/nopermission.jsp</span><br><span class="line"><span class="comment">#用户无需要的权限时跳转的页面</span></span><br><span class="line">perms.unauthorizedUrl=/nopermission.jsp</span><br><span class="line"><span class="comment">#登出之后重定向的页面</span></span><br><span class="line">logout.redirectUrl=/login</span><br><span class="line"></span><br><span class="line"><span class="section">[users]</span></span><br><span class="line"><span class="comment">; admin用户拥有admin这个角色</span></span><br><span class="line"><span class="attr">admin</span>=<span class="number">666</span>,admin</span><br><span class="line"><span class="comment">;zhangsan拥有deptMgr这个角色</span></span><br><span class="line"><span class="attr">zhangsan</span>=<span class="number">666</span>,deptMgr</span><br><span class="line"></span><br><span class="line"><span class="section">[roles]</span></span><br><span class="line"><span class="comment">;admin这个角色拥有employee和department的所有操作权限</span></span><br><span class="line"><span class="attr">admin</span>=*:*</span><br><span class="line"><span class="comment">;admin=employee:*,department:*</span></span><br><span class="line"><span class="attr">deptMgr</span>=department:view</span><br><span class="line"></span><br><span class="line"><span class="section">[urls]</span></span><br><span class="line"><span class="comment">#静态资源可以匿名访问</span></span><br><span class="line">/static/**=anon</span><br><span class="line"><span class="comment">#访问员工列表需要身份认证及需要拥有admin角色</span></span><br><span class="line">/employee=authc,roles[admin]</span><br><span class="line"><span class="comment">#访问部门列表需要身份认证及需要拥有department:view的权限</span></span><br><span class="line">/department=authc,perms["department:view"]</span><br><span class="line"><span class="comment">#当请求loginOut,会被logout捕获并清除session</span></span><br><span class="line">/loginOut=logout</span><br><span class="line"><span class="comment">#所有的请求都需要身份认证(会跳转到authc.loginUrl指定的url)</span></span><br><span class="line">/**=authc</span><br></pre></td></tr></table></figure><p>上面配置中的<code>anon</code>,<code>authc</code>,<code>logout</code>..等等都是shiro中的默认过滤器,<a href="http://shiro.apache.org/web.html#Web-%7B%7B%5Curls%5C%7D%7D" target="_blank" rel="noopener">官方文档:默认过滤器</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><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">过滤器简称对应的java类</span><br><span class="line">anonorg.apache.shiro.web.filter.authc.AnonymousFilter</span><br><span class="line">authcorg.apache.shiro.web.filter.authc.FormAuthenticationFilter</span><br><span class="line">authcBasicorg.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter</span><br><span class="line">rolesorg.apache.shiro.web.filter.authz.RolesAuthorizationFilter</span><br><span class="line">permsorg.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter</span><br><span class="line">userorg.apache.shiro.web.filter.authc.UserFilter</span><br><span class="line">logoutorg.apache.shiro.web.filter.authc.LogoutFilter</span><br><span class="line">portorg.apache.shiro.web.filter.authz.PortFilter</span><br><span class="line">restorg.apache.shiro.web.filter.authz.HttpMethodPermissionFilter</span><br><span class="line">sslorg.apache.shiro.web.filter.authz.SslFilter</span><br></pre></td></tr></table></figure><p>说明:</p><ul><li><code>anon</code>:匿名拦截器，即不需要登录即可访问；一般用于静态资源过滤；示例“/static/**=anon”</li><li><p><code>authc</code>:表示需要认证(登录)才能使用;示例“/**=authc”.主要属性：usernameParam：表单提交的用户名参数名（ username）；  passwordParam：表单提交的密码参数名（password）； rememberMeParam：表单提交的密码参数名（rememberMe）；  loginUrl：登录页面地址（/login.jsp）；successUrl：登录成功后的默认重定向地址； failureKeyAttribute：登录失败后错误信息存储key（shiroLoginFailure）；</p></li><li><p><code>authcBasic</code>:Basic HTTP身份验证拦截器，主要属性： applicationName：弹出登录框显示的信息（application）；</p></li><li><code>roles</code>:角色授权拦截器，验证用户是否拥有资源角色；示例“/admin/**=roles[admin]”</li><li><code>perms</code>:权限授权拦截器，验证用户是否拥有资源权限；示例“/user/create=perms[“user:create”]”</li><li><code>user</code>:用户拦截器，用户已经身份验证/记住我登录的都可；示例“/index=user”</li><li><code>logout</code>:退出拦截器，主要属性：redirectUrl：退出成功后重定向的地址（/）;示例“/logout=logout”</li><li><code>port</code>:端口拦截器，主要属性：port（80）：可以通过的端口；示例“/test= port[80]”，如果用户访问该页面是非80，将自动将请求端口改为80并重定向到该80端口，其他路径/参数等都一样</li><li><code>rest</code>:rest风格拦截器，自动根据请求方法构建权限字符串（GET=read,POST=create,PUT=update,DELETE=delete,HEAD=read,TRACE=read,OPTIONS=read, MKCOL=create）构建权限字符串； 示例“/users=rest[user]”，会自动拼出“user:read,user:create,user:update,user:delete”权限字符串进行权限匹配（所有都得匹配，isPermittedAll）；</li><li><code>ssl</code>:SSL拦截器，只有请求协议是https才能通过；否则自动跳转会https端口（443）；其他和port拦截器一样；</li></ul><p><strong>注：</strong></p><p><strong>anon，authcBasic，auchc，user是认证过滤器，</strong></p><p><strong>perms，roles，ssl，rest，port是授权过滤器</strong></p><h2 id="4-拦截器的执行原理"><a href="#4-拦截器的执行原理" class="headerlink" title="4.拦截器的执行原理"></a>4.拦截器的执行原理</h2><p><img src="http://p9xlnkn7r.bkt.clouddn.com/shiro%E9%BB%98%E8%AE%A4%E6%8B%A6%E6%88%AA%E5%99%A8%E7%9A%84%E6%89%A7%E8%A1%8C%E5%8E%9F%E7%90%86.png" alt=""></p><p>从上图可以看出,排号越前的默认拦截器优先级越高</p><h3 id="4-1-authc登录拦截器工作原理"><a href="#4-1-authc登录拦截器工作原理" class="headerlink" title="4.1 authc登录拦截器工作原理"></a>4.1 authc登录拦截器工作原理</h3><p>authc拦截器有2个作用：</p><ol><li><p>校验是否已经登录</p><p>请求进来时，拦截并判断当前用户是否登录了，如果已经登录了放行， 如果没有登录，跳转到authc.loginUrl属性配置的路径，注意：默认是/login.jsp</p></li><li><p>执行登录认证</p><p>请求进来时，如果请求的路径为authc.loginUrl属性配置的路径（没配置，默认是/login.jsp）时，如果当前用户没有登录，authc这个拦截器会尝试获取请求中的账号跟密码值，然后<strong>比对ini配置文件或者realm中的用户列表，如果比对正确，直接执行登录操作，反之，抛异常，跳转到authc.loginUrl指定的路径</strong>。</p><p>注意：请求中账号与密码必须固定为username 跟password， 如果需要改动必须额外指定，authc.usernameParam=xxx   authc.passwordParam=xxxx</p><p>我们在<code>shiro.ini</code>文件中已经配置了user,shiro的拦截器会自动进行校验,不需要再像传统方式一样在这里获取用户名和密码,然后比对,然后存入session….</p></li></ol><h3 id="4-2-authc登录成功之后处理逻辑："><a href="#4-2-authc登录成功之后处理逻辑：" class="headerlink" title="4.2 authc登录成功之后处理逻辑："></a>4.2 authc登录成功之后处理逻辑：</h3><p><img src="http://p9xlnkn7r.bkt.clouddn.com/authc%E7%99%BB%E5%BD%95%E6%88%90%E5%8A%9F%E5%90%8E%E7%9A%84%E5%A4%84%E7%90%86%E9%80%BB%E8%BE%91.png" alt=""></p><h3 id="4-3-authc登录失败后的异常处理"><a href="#4-3-authc登录失败后的异常处理" class="headerlink" title="4.3 authc登录失败后的异常处理:"></a>4.3 authc登录失败后的异常处理:</h3><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></pre></td><td class="code"><pre><span class="line"><span class="meta">@WebServlet</span>(name = <span class="string">"LoginServlet"</span>, urlPatterns = <span class="string">"/login"</span>)</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">LoginServlet</span> <span class="keyword">extends</span> <span class="title">HttpServlet</span> </span>&#123;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">doGet</span><span class="params">(HttpServletRequest req, HttpServletResponse resp)</span> <span class="keyword">throws</span> ServletException, IOException </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.doPost(req, resp);</span><br><span class="line">    &#125;</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">protected</span> <span class="keyword">void</span> <span class="title">doPost</span><span class="params">(HttpServletRequest req, HttpServletResponse resp)</span> <span class="keyword">throws</span> ServletException, IOException </span>&#123;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 如果登录失败,从request中获取认证异常信息,exceptionClassName就是shiro的异常类名</span></span><br><span class="line">        String exceptionClassName = (String) req.getAttribute(<span class="string">"shiroLoginFailure"</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (UnknownAccountException.class.getSimpleName().equals(exceptionClassName)) &#123;</span><br><span class="line">            req.setAttribute(<span class="string">"errorMsg"</span>, <span class="string">"账号异常!"</span>);</span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (IncorrectCredentialsException.class.getSimpleName().equals(exceptionClassName)) &#123;</span><br><span class="line">            req.setAttribute(<span class="string">"errorMsg"</span>, <span class="string">"密码异常!"</span>);</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            req.setAttribute(<span class="string">"errorMsg"</span>, <span class="string">"其他异常!"</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">//不需要再像传统方式一样在这里获取用户名和密码,然后比对,然后存入session....</span></span><br><span class="line"></span><br><span class="line">        req.getRequestDispatcher(<span class="string">"/WEB-INF/views/login.jsp"</span>).forward(req, resp);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="5-shiro的jsp标签"><a href="#5-shiro的jsp标签" class="headerlink" title="5.shiro的jsp标签"></a>5.shiro的jsp标签</h2><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></pre></td><td class="code"><pre><span class="line">标签名称                  标签条件（均是显示标签内容）</span><br><span class="line"><span class="tag">&lt;<span class="name">shiro:authenticated</span>&gt;</span>          登录之后</span><br><span class="line"><span class="tag">&lt;<span class="name">shiro:notAuthenticated</span>&gt;</span>不在登录状态时</span><br><span class="line"><span class="tag">&lt;<span class="name">shiro:guest</span>&gt;</span>用户在没有RememberMe时</span><br><span class="line"><span class="tag">&lt;<span class="name">shiro:user</span>&gt;</span>用户在RememberMe时</span><br><span class="line"><span class="tag">&lt;<span class="name">shiro:hasAnyRoles</span> <span class="attr">name</span>=<span class="string">"abc,123"</span> &gt;</span>   在有abc或者123角色时</span><br><span class="line"><span class="tag">&lt;<span class="name">shiro:hasRole</span> <span class="attr">name</span>=<span class="string">"abc"</span>&gt;</span>拥有角色abc</span><br><span class="line"><span class="tag">&lt;<span class="name">shiro:lacksRole</span> <span class="attr">name</span>=<span class="string">"abc"</span>&gt;</span>没有角色abc</span><br><span class="line"><span class="tag">&lt;<span class="name">shiro:hasPermission</span> <span class="attr">name</span>=<span class="string">"abc"</span>&gt;</span>拥有权限资源abc</span><br><span class="line"><span class="tag">&lt;<span class="name">shiro:lacksPermission</span> <span class="attr">name</span>=<span class="string">"abc"</span>&gt;</span>没有abc权限资源</span><br><span class="line"><span class="tag">&lt;<span class="name">shiro:principal</span>&gt;</span>显示用户身份名称</span><br><span class="line"><span class="tag">&lt;<span class="name">shiro:principal</span> <span class="attr">property</span>=<span class="string">"username"</span>/&gt;</span>     显示用户身份中的属性值</span><br></pre></td></tr></table></figure><p>当具有对department资源的add权限的时候,才显示<code>新增</code>标签</p><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&lt;shiro:hasPermission name=<span class="string">"department:add"</span>&gt;</span><br><span class="line">&lt;a href="/department?cmd=input"&gt;新增&lt;/a&gt;</span><br><span class="line">&lt;/shiro:hasPermission&gt;</span><br></pre></td></tr></table></figure><p>上面就是shiro和web矿建的简单集成…</p><p><a href="https://blueleer.github.io/">欢迎访问我的博客网站</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;为了深入理解Shiro与web项目集成的工作原理,我们搭建一个普通的web项目&lt;/p&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;
      
    
    </summary>
    
      <category term="shiro安全框架" scheme="https://blueleer.github.io/categories/shiro%E5%AE%89%E5%85%A8%E6%A1%86%E6%9E%B6/"/>
    
    
      <category term="shiro" scheme="https://blueleer.github.io/tags/shiro/"/>
    
  </entry>
  
  <entry>
    <title>Shiro安全框架之入门（1）</title>
    <link href="https://blueleer.github.io/2017/06/06/Shiro%E5%AE%89%E5%85%A8%E6%A1%86%E6%9E%B6%E4%B9%8B%E5%85%A5%E9%97%A8%EF%BC%881%EF%BC%89/"/>
    <id>https://blueleer.github.io/2017/06/06/Shiro安全框架之入门（1）/</id>
    <published>2017-06-06T09:28:37.000Z</published>
    <updated>2018-06-07T11:00:45.071Z</updated>
    
    <content type="html"><![CDATA[<h1 id="1-什么是权限管理"><a href="#1-什么是权限管理" class="headerlink" title="1.什么是权限管理"></a>1.什么是权限管理</h1><p>基本上涉及到用户参与的系统都要进行权限管理，权限管理属于系统安全的范畴，权限管理能实现对用户访问系统的控制，按照安全规则或者安全策略限制用户操作，只允许用户访问被授权的资源。</p><p>权限管理包括<strong>用户身份认证</strong>和<strong>授权</strong>两部分，简称<strong>认证授权</strong>。</p><p><img src="http://p9xlnkn7r.bkt.clouddn.com/%E6%8E%88%E6%9D%83%E8%AE%A4%E7%9C%9F%E6%B5%81%E7%A8%8B.png" alt=""></p><p>相关概念:</p><ul><li><strong>身份认证</strong> 就是判断一个用户是否为合法用户的处理过程.醉常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确.对于采用指纹等系统,则出示指纹；对于硬件Key等刷卡系统,则需要刷卡</li><li><strong>授权</strong>  即访问控制，控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源，对于某些资源没有权限是无法访问的。 </li></ul><p>上边的流程图中需 要理解以下关键对象：</p><ul><li><strong>Subject</strong>：主体  user</li></ul><p>​       访问系统的用户，主体可以是用户、程序等，进行认证的都称为主体；</p><ul><li><strong>Principal</strong>：身份信息(username)主体（subject）进行身份认证的标识，标识必须具有唯一性，如用户名、手机号、邮箱地址等，一个主体可以有多个身份，但是必须有一个主身份（Primary Principal）。</li><li><strong>credential</strong>：凭证信息(password)，只有主体自己知道的安全信息，如密码、证书等。</li></ul><h1 id="Apache-Shiro安全框架"><a href="#Apache-Shiro安全框架" class="headerlink" title="Apache Shiro安全框架"></a>Apache Shiro安全框架</h1><p>Apache Shiro是Java的一个安全框架。帮助我们完成：认证、授权、加密、会话管理、与Web集成、缓存等。 </p><ul><li><p>从功能角度看shiro</p><p><img src="http://p9xlnkn7r.bkt.clouddn.com/shiro%E5%8A%9F%E8%83%BD%E6%9E%B6%E6%9E%84.png" alt=""></p><ul><li><strong>Authentication</strong>：[ɔ:ˌθentɪ’keɪʃn]身份认证/登录，验证用户是不是拥有相应的身份；</li><li><strong>Authorization</strong>：[ˌɔ:θərəˈzeɪʃn] 授权，即权限验证，验证某个已认证的用户是否拥有某个权限；即判断用户是否能做事情，常见的如：验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限；</li><li><strong>Session Manager</strong>：会话管理，即用户登录后就是一次会话，在没有退出之前，它的所有信息都在会话中；会话可以是普通JavaSE环境的，也可以是Web环境的；</li><li><strong>Cryptography</strong>：[krɪpˈɑ:grəfi]加密，保护数据的安全性，如密码加密存储到数据库，而不是明文存储；</li><li><strong>Web Support</strong>：Web支持，可以非常容易的集成到Web环境；</li><li><strong>Caching</strong>：缓存，比如用户登录后，其用户信息、拥有的角色/权限不必每次去查，这样可以提高效率；</li><li><strong>Concurrency</strong>：shiro支持多线程应用的并发验证，即如在一个线程中开启另一个线程，能把权限自动传播过去；</li><li><strong>Testing</strong>：提供测试支持；</li><li><strong>Run As</strong>：允许一个用户假装为另一个用户（如果他们允许）的身份进行访问；</li><li><strong>Remember Me</strong>：记住我，这个是非常常见的功能，即一次登录后，下次再来的话不用登录了。</li></ul><p><strong>Shiro架构有三个主要概念 : Subject，SecurityManager，Realms。</strong></p><p><img src="http://p9xlnkn7r.bkt.clouddn.com/shiro%E6%A6%82%E5%BF%B5.png" alt=""></p><ul><li><p><strong>Subject</strong></p><pre><code>访问系统的用户，主体可以是用户、程序等，进行认证的都称为主体；</code></pre></li></ul><p>​          Subject一词是一个安全术语，其基本意思是“当前的操作用户”。它是一个抽象的概念，可以是人，也可以是第三方进程或其他类似事物，如爬虫，机器人等。</p><p>​    在程序任意位置：Subject currentUser = SecurityUtils.getSubject(); 获取shiro</p><p>   一旦获得Subject，你就可以立即获得你希望用Shiro为当前用户做的90%的事情，如登录、登出、访问会话、执行授权检查等</p><ul><li><strong>SecurityManager</strong></li></ul><p>​        安全管理器，它是shiro功能实现的核心，负责与后边介绍的其他组件(认证器/授权器/缓存控制器)进行交互，实现subject委托的各种功能。有点类似于spirngmvc中的DispatcherServlet前端控制器。</p><ul><li><strong>Realms</strong></li></ul><p>​      Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。；可以把Realm看成DataSource，即安全数据源。执行认证（登录）和授权（访问控制）时，Shiro会从应用配置的Realm中查找相关的比对数据。以确认用户是否合法，操作是否合理</p></li><li><p>从系统结构角度看shiro</p><p><img src="http://p9xlnkn7r.bkt.clouddn.com/shiro%E7%B3%BB%E7%BB%9F%E7%BB%93%E6%9E%84.png" alt=""></p><p><strong>Subject</strong>：主体，可以看到主体可以是任何可以与应用交互的“用户”；</p><p><strong>SecurityManager</strong>：相当于SpringMVC中的DispatcherServlet或者Struts2中的FilterDispatcher；是Shiro的心脏；所有具体的交互都通过SecurityManager进行控制；它管理着所有Subject、且负责进行认证和授权、及会话、缓存的管理。</p><p><strong>Authenticator</strong>：认证器，负责主体认证的，这是一个扩展点，如果用户觉得Shiro默认的不好，可以自定义实现；其需要认证策略（Authentication Strategy），即什么情况下算用户认证通过了；</p><p><strong>Authorizer</strong>：授权器，或者访问控制器，用来决定主体是否有权限进行相应的操作；即控制着用户能访问应用中的哪些功能；</p><p><strong>Realm</strong>：可以有1个或多个Realm，可以认为是安全实体数据源，即用于获取安全实体的；可以是JDBC实现，也可以是LDAP实现，或者内存实现等等；由用户提供；注意：Shiro不知道你的用户/权限存储在哪及以何种格式存储；所以我们一般在应用中都需要实现自己的Realm；</p><p><strong>SessionManager</strong>：如果写过Servlet就应该知道Session的概念，Session呢需要有人去管理它的生命周期，这个组件就是SessionManager；而Shiro并不仅仅可以用在Web环境，也可以用在如普通的JavaSE环境、EJB等环境；所有呢，Shiro就抽象了一个自己的Session来管理主体与应用之间交互的数据；可以实现分布式的会话管理；</p><p><strong>SessionDAO</strong>：DAO大家都用过，数据访问对象，用于会话的CRUD，比如我们想把Session保存到数据库，那么可以实现自己的SessionDAO，通过如JDBC写到数据库；比如想把Session放到redis中，可以实现自己的redis  SessionDAO；另外SessionDAO中可以使用Cache进行缓存，以提高性能；</p><p><strong>CacheManager</strong>：缓存控制器，来管理如用户、角色、权限等的缓存的；因为这些数据基本上很少去改变，放到缓存中后可以提高访问的性能</p><p><strong>Cryptography</strong>：密码模块，Shiro提高了一些常见的加密组件用于如密码加密/解密的。</p></li></ul><h1 id="入门使用"><a href="#入门使用" class="headerlink" title="入门使用"></a>入门使用</h1><ul><li><p>1.导入依赖</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="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.apache.shiro<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>shiro-core<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.2.2<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></pre></td></tr></table></figure></li><li><p>2.配置<code>shiro.ini</code>文件</p><figure class="highlight ini"><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="section">[users]</span></span><br><span class="line"><span class="comment">; username=password(等号前面是用户名,后面是密码)</span></span><br><span class="line"><span class="attr">admin</span>=<span class="number">123</span></span><br><span class="line"><span class="attr">zhangsan</span>=<span class="number">123</span></span><br><span class="line"><span class="attr">lisi</span>=<span class="number">123</span></span><br></pre></td></tr></table></figure></li></ul><ul><li><p>3.测试</p><p>写一个简单的测试类,用于登录的业务逻辑</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></pre></td><td class="code"><pre><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">login</span><span class="params">()</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">    String username = <span class="string">"zhangsan"</span>;</span><br><span class="line">    String password = <span class="string">"123"</span>;</span><br><span class="line">    <span class="comment">// 创建工厂(从本地的shiro.ini文件中获取用户列表)</span></span><br><span class="line">    IniSecurityManagerFactory factory = <span class="keyword">new</span> IniSecurityManagerFactory(<span class="string">"classpath:shiro/shiro.ini"</span>);</span><br><span class="line">    <span class="comment">// 创建securityManager实例</span></span><br><span class="line">    SecurityManager securityManager = factory.getInstance();</span><br><span class="line">    <span class="comment">// 将securityManager绑定到当前运行环境中,让系统可以随时随地的访问securityManager对象</span></span><br><span class="line">    SecurityUtils.setSecurityManager(securityManager);</span><br><span class="line">    <span class="comment">// 创建当前的主体</span></span><br><span class="line">    Subject subject = SecurityUtils.getSubject();</span><br><span class="line">    UsernamePasswordToken token = <span class="keyword">new</span> UsernamePasswordToken(username, password);</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">            subject.login(token);</span><br><span class="line">        </span><br><span class="line">    &#125;<span class="keyword">catch</span> (Exception e)&#123;</span><br><span class="line">        <span class="keyword">if</span> (e <span class="keyword">instanceof</span> UnknownAccountException)&#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> Exception(<span class="string">"该用户不存在"</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (e <span class="keyword">instanceof</span> IncorrectCredentialsException)&#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> Exception(<span class="string">"用户密码不正确!"</span>);</span><br><span class="line">        &#125;</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="keyword">boolean</span> authenticated = subject.isAuthenticated();</span><br><span class="line">System.out.println(<span class="string">"是否登录成功"</span>+authenticated);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>login.jsp</code></p><figure class="highlight"><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></pre></td><td class="code"><pre><span class="line">&lt;html&gt;</span><br><span class="line">&lt;head&gt;</span><br><span class="line">    &lt;title&gt;用户登录&lt;/title&gt;</span><br><span class="line">&lt;/head&gt;</span><br><span class="line">&lt;body&gt;</span><br><span class="line">&lt;form action=<span class="string">"$&#123;pageContext.request.contextPath&#125;/login.action"</span> method=<span class="string">"post"</span>&gt;</span><br><span class="line">    用户名:&lt;input type=<span class="string">"text"</span> name=<span class="string">"username"</span>/&gt;</span><br><span class="line">    密码:&lt;input type=<span class="string">"text"</span> name=<span class="string">"password"</span>/&gt;</span><br><span class="line">    &lt;input type=<span class="string">"submit"</span> value=<span class="string">"登录"</span> /&gt;</span><br><span class="line">&lt;/form&gt;</span><br><span class="line">&lt;/body&gt;</span><br><span class="line">&lt;/html&gt;</span><br></pre></td></tr></table></figure><p>当在表单中输入用户名:zhangsan,密码:123时,输出:是否登录成功:true</p><p>用户登出也很简单:直接调用:subject.logout();方法即可</p></li></ul><h1 id="shiro登录登出流程简单分析"><a href="#shiro登录登出流程简单分析" class="headerlink" title="shiro登录登出流程简单分析"></a>shiro登录登出流程简单分析</h1><p><img src="http://p9xlnkn7r.bkt.clouddn.com/shiro%E7%99%BB%E5%BD%95%E7%99%BB%E5%87%BA%E6%B5%81%E7%A8%8B%E5%88%86%E6%9E%90.png" alt=""></p><p><strong>大体流程是:</strong></p><ul><li>1、调用subject.login方法进行登录，其会自动委托给securityManager.login方法进行登录；</li><li>2、securityManager通过Authenticator(认证器)进行认证;</li><li>3、Authenticator的实现ModularRealmAuthenticator调用realm从ini配置文件取用户真实的账号和密码，这里使用的是IniRealm（shiro自带,相当于数据源）；</li><li>4、IniRealm先根据token中的账号去ini中找该账号，如果找不到则给ModularRealmAuthenticator返回null，如果找到则匹配密码，匹配密码成功则认证通过。</li><li>5、最后调用Subject.logout进行退出操作。</li></ul><p><img src="http://p9xlnkn7r.bkt.clouddn.com/%E7%99%BB%E5%BD%95%E7%99%BB%E5%87%BA%E5%A4%A7%E4%BD%93%E6%B5%81%E7%A8%8B.png" alt=""></p><h1 id="shiro自定义realm-测试认证"><a href="#shiro自定义realm-测试认证" class="headerlink" title="shiro自定义realm,测试认证"></a>shiro自定义realm,测试认证</h1><p>Realm是安全实体数据源，即用于获取安全实体的；可以是JDBC实现，也可以是LDAP实现，或者内存实现等等；由用户提供；注意：Shiro不知道你的用户/权限存储在哪及以何种格式存储；所以我们一般在应用中都需要实现自己的Realm.</p><p><img src="http://p9xlnkn7r.bkt.clouddn.com/%E8%87%AA%E5%AE%9A%E4%B9%89realm%E7%BB%A7%E6%89%BF%E7%9A%84%E7%B1%BB.png" alt=""></p><p>我们直接选择继承<code>AuthorizingRealm</code></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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MyRealmForPermission</span> <span class="keyword">extends</span> <span class="title">AuthorizingRealm</span> </span>&#123;</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">getName</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">this</span>.getClass().getSimpleName();</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">     * 认证操作</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> authenticationToken</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> AuthenticationException</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">protected</span> AuthenticationInfo <span class="title">doGetAuthenticationInfo</span><span class="params">(AuthenticationToken authenticationToken)</span> <span class="keyword">throws</span> AuthenticationException </span>&#123;</span><br><span class="line">        <span class="comment">// 获取token传入的用户名(页面传入)</span></span><br><span class="line">        String usernameForm = (String) authenticationToken.getPrincipal();</span><br><span class="line">        <span class="comment">// 用户名,密码(根据用户名从数据库中查询得到,这里为模拟数据)</span></span><br><span class="line">        String username = <span class="string">"wangle"</span>;</span><br><span class="line">        String password = <span class="string">"123"</span>;</span><br><span class="line">        <span class="comment">// 如果没有找到相应的用户,则返回null</span></span><br><span class="line">        <span class="keyword">if</span> (!username.equals(usernameForm)) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">null</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">// 将从数据库中查询的相关信息,封装成AuthenticationInfo对象,继续交给authenticator(认证器)进行认证</span></span><br><span class="line">        AuthenticationInfo info = <span class="keyword">new</span> SimpleAuthenticationInfo(username, password, getName());</span><br><span class="line">        <span class="keyword">return</span> info;</span><br><span class="line">    &#125;</span><br><span class="line"></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></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> principals</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">protected</span> AuthorizationInfo <span class="title">doGetAuthorizationInfo</span><span class="params">(PrincipalCollection principals)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>接下来在<code>shiro.ini</code>文件中,指定realms的来源为自定义的realm.(将[users]下定义的用户删除掉,不然不起作用)</p><figure class="highlight"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">;自定义realm</span></span><br><span class="line"><span class="attr">myRealm</span> = com.lee.shiro.realm.MyRealm</span><br><span class="line"><span class="comment">; 给自定义的real添加加密器</span></span><br><span class="line">myRealm.credentialsMatcher=$credentialsMatcher</span><br><span class="line"><span class="comment">;指定securityManager引用的realm</span></span><br><span class="line">securityManager.realms = $myRealm</span><br></pre></td></tr></table></figure><p>测试:(跟上面使用ini文件中配置的realm用户密码测试方法一样)</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></pre></td><td class="code"><pre><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">login</span><span class="params">()</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">    String username = <span class="string">"zhangsan"</span>;</span><br><span class="line">    String password = <span class="string">"123"</span>;</span><br><span class="line">    <span class="comment">// 创建工厂(从本地的shiro.ini文件中获取用户列表)</span></span><br><span class="line">    IniSecurityManagerFactory factory = <span class="keyword">new</span> IniSecurityManagerFactory(<span class="string">"classpath:shiro/shiro.ini"</span>);</span><br><span class="line">    <span class="comment">// 创建securityManager实例</span></span><br><span class="line">    SecurityManager securityManager = factory.getInstance();</span><br><span class="line">    <span class="comment">// 将securityManager绑定到当前运行环境中,让系统可以随时随地的访问securityManager对象</span></span><br><span class="line">    SecurityUtils.setSecurityManager(securityManager);</span><br><span class="line">    <span class="comment">// 创建当前的主体</span></span><br><span class="line">    Subject subject = SecurityUtils.getSubject();</span><br><span class="line">    UsernamePasswordToken token = <span class="keyword">new</span> UsernamePasswordToken(username, password);</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">            subject.login(token);</span><br><span class="line">        </span><br><span class="line">    &#125;<span class="keyword">catch</span> (Exception e)&#123;</span><br><span class="line">        <span class="keyword">if</span> (e <span class="keyword">instanceof</span> UnknownAccountException)&#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> Exception(<span class="string">"该用户不存在"</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (e <span class="keyword">instanceof</span> IncorrectCredentialsException)&#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> Exception(<span class="string">"用户密码不正确!"</span>);</span><br><span class="line">        &#125;</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="keyword">boolean</span> authenticated = subject.isAuthenticated();</span><br><span class="line">System.out.println(<span class="string">"是否登录成功"</span>+authenticated);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="shiro-加密操作"><a href="#shiro-加密操作" class="headerlink" title="shiro 加密操作"></a>shiro 加密操作</h1><blockquote><p>散列算法一般用于生成数据的摘要信息，是一种不可逆的算法，一般适合存储密码之类的数据，常见的散列算法如MD5、SHA等。一般进行散列时最好提供一个salt（盐），比如加密密码“admin”，产生的散列值是“21232f297a57a5a743894a0e4a801fc3”，可以到一些md5解密网站很容易的通过散列值得到密码“admin”，即如果直接对密码进行散列相对来说破解更容易，此时我们可以加一些只有系统知道的干扰数据，如用户名和ID（即盐）；这样散列的对象是“密码+用户名+ID”，这样生成的散列值相对来说更难破解。 </p></blockquote><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></pre></td><td class="code"><pre><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">getMD5Str</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    String password = <span class="string">"123"</span>;</span><br><span class="line">    <span class="comment">// 参数说明:1.需要加密的字符串;2.盐;3.迭代加密次数</span></span><br><span class="line">    Md5Hash md5Hash = <span class="keyword">new</span> Md5Hash(password,<span class="keyword">null</span>, <span class="number">2</span>);</span><br><span class="line">    System.out.println(md5Hash);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在shiro中使用方式很简单:</p><ol><li><p>在<code>shiro.ini</code>中增加</p><figure class="highlight"><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="section">[main]</span></span><br><span class="line">......</span><br><span class="line"><span class="comment">; 给自定义的real添加加密器</span></span><br><span class="line">myRealm.credentialsMatcher=$credentialsMatcher</span><br><span class="line"><span class="comment">;散列算法</span></span><br><span class="line">credentialsMatcher.hashAlgorithmName = md5</span><br><span class="line"><span class="comment">;散列次数(本次散列的结果作为下次散列的源)</span></span><br><span class="line">credentialsMatcher.hashIterations = 2</span><br></pre></td></tr></table></figure></li><li><p>在插入用户的时候,就使用MD5+盐将密码加密,然后存入数据库.前端传入的用户名、密码（明文）被封装的UsernamePasswordToken对象中,从数据库中查询出用户名、密码（密文）被封装成AuthenticationInfo对象，然后SecurityManager在调用方法进行比对时会自动现将UsernamePasswordToken对象中的密码（明文）先加密（加密的方式应该和存入数据库密码的加密方式一样），然后才进行比对。</p></li></ol><h1 id="授权"><a href="#授权" class="headerlink" title="授权"></a>授权</h1><p>上面的所有操作都是认证操作，也就是登录操作。接下来看看授权操作是怎么回事儿</p><h2 id="1-RBAC-基于角色的权限管理"><a href="#1-RBAC-基于角色的权限管理" class="headerlink" title="1.RBAC 基于角色的权限管理"></a>1.RBAC 基于角色的权限管理</h2><p>简单理解为：谁扮演什么角色， 被允许做什么操作</p><p>用户对象：user： 当前操作用户</p><p>角色对象：role：表示权限操作许可权的集合</p><p>权限对象：permission: 资源操作许可权</p><p>例子：张三（user） 下载（permission）一个高清无码的种子（资源）， 需要VIP权限（role）</p><p>张三—&gt;普通用户—&gt;授权—-&gt;VIP用户—–&gt;下载种子</p><h2 id="2-授权方式"><a href="#2-授权方式" class="headerlink" title="2.授权方式"></a>2.授权方式</h2><ul><li><p>编程方式</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></pre></td><td class="code"><pre><span class="line"><span class="comment">//通过写if/else授权代码块完成</span></span><br><span class="line">Subject subject = SecurityUtils.getSubject();  </span><br><span class="line"><span class="keyword">if</span>(subject.hasRole(“admin”)) &#123;  </span><br><span class="line">    <span class="comment">//有权限  </span></span><br><span class="line">&#125; <span class="keyword">else</span> &#123;  </span><br><span class="line">    <span class="comment">//无权限  </span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>注解方式</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></pre></td><td class="code"><pre><span class="line"><span class="comment">// 通过在执行的Java方法上放置相应的注解完成</span></span><br><span class="line"><span class="meta">@RequiresRoles</span>(<span class="string">"admin"</span>)  </span><br><span class="line"><span class="meta">@RequiresPermission</span>(“employee:save”)</span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">hello</span><span class="params">()</span> </span>&#123;  </span><br><span class="line">    <span class="comment">//有权限  </span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>jsp标签方式</p><figure class="highlight"><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></pre></td><td class="code"><pre><span class="line">&lt;!--jsp标签方式：在JSP页面通过相应的标签完成--&gt;</span><br><span class="line">&lt;shiro:hasRole name=<span class="string">"admin"</span>&gt;  </span><br><span class="line">         &lt;!— 有权限 —&gt;  </span><br><span class="line">&lt;/shiro:hasRole&gt;</span><br></pre></td></tr></table></figure></li></ul><h2 id="3-权限表达式"><a href="#3-权限表达式" class="headerlink" title="3. 权限表达式"></a>3. 权限表达式</h2><p>在ini文件中用户、角色、权限的配置规则是：“用户名=密码，角色1，角色2…” “角色=权限1，权限2…”，首先根据用户名找角色，再根据角色找权限，角色是权限集合。</p><p>权限字符串的规则是：“资源标识符：操作：资源实例标识符”，意思是对哪个资源的哪个实例具有什么操作，“:”是资源/操作/实例的分割符，权限字符串也可以使用*通配符。</p><p>例子：</p><p>用户创建权限：<code>user:create</code>，或<code>user:create:*</code></p><p>用户修改实例001的权限：<code>user:update:001</code></p><p>用户实例001的所有权限：<code>user：*：001</code></p><p>一般而已，我们操作只需要关注前面两节：</p><p><strong>资源：操作  ：</strong>   </p><p><code>*.*</code>: 所有资源的所有操作权限—&gt;admin</p><h2 id="4-使用ini方式判断是否有角色权限"><a href="#4-使用ini方式判断是否有角色权限" class="headerlink" title="4. 使用ini方式判断是否有角色权限"></a>4. 使用ini方式判断是否有角色权限</h2><p>步骤:</p><ul><li><p>1：配置ini文件 (<code>shiro/shiro_roles.ini</code>)</p><figure class="highlight ini"><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="section">[users]</span></span><br><span class="line"><span class="attr">zhangsan</span>=<span class="number">123</span>,role1</span><br><span class="line"><span class="attr">lisi</span>=<span class="number">123</span></span><br><span class="line"><span class="attr">wanglee</span>=<span class="number">123</span>,role2</span><br><span class="line"></span><br><span class="line"><span class="section">[roles]</span></span><br><span class="line"><span class="comment">; role1对上边的user有创建和更新的权限</span></span><br><span class="line"><span class="attr">role1</span>=user:create,user:update</span><br><span class="line"><span class="comment">; role2对上面的user具有所有的权限</span></span><br><span class="line"><span class="attr">role2</span>=user:*</span><br></pre></td></tr></table></figure></li><li><p>2：加载配置文件，测试用户是否拥有角色 </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></pre></td><td class="code"><pre><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">testHasRoles</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    Factory&lt;SecurityManager&gt; factory = <span class="keyword">new</span> IniSecurityManagerFactory(<span class="string">"classpath:shiro/shiro_roles.ini"</span>);</span><br><span class="line">    SecurityManager securityManager = factory.getInstance();</span><br><span class="line">    SecurityUtils.setSecurityManager(securityManager);</span><br><span class="line">    Subject subject = SecurityUtils.getSubject();</span><br><span class="line">    UsernamePasswordToken token = <span class="keyword">new</span> UsernamePasswordToken(<span class="string">"wanglee"</span>, <span class="string">"123"</span>);</span><br><span class="line">    <span class="comment">// 在进行授权之前需要先进行登录(实际应用中,只有登录以后才可以进行授权)</span></span><br><span class="line">    subject.login(token);</span><br><span class="line">    <span class="comment">// 判断用户wangle是否有role1角色</span></span><br><span class="line">    System.out.println(subject.hasRole(<span class="string">"role1"</span>));</span><br><span class="line">    <span class="comment">// 判断wanglee是否具有下面这一堆属性</span></span><br><span class="line">    System.out.println(Arrays.toString(subject.hasRoles(Arrays.asList(<span class="string">"role1"</span>, <span class="string">"role2"</span>))));</span><br><span class="line">    <span class="comment">// 校验用户是否拥有role1角色,如果没有,则抛出异常,如果有该权限,继续往下执行,什么也不做</span></span><br><span class="line">    subject.checkRole(<span class="string">"role1"</span>);</span><br><span class="line">    <span class="comment">// 校验是否具有下述的一堆属性,如果没有其中的一个,则抛出异常</span></span><br><span class="line">    subject.checkRoles(<span class="string">"role1"</span>, <span class="string">"role2"</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><h2 id="5-自定义Realm完成授权"><a href="#5-自定义Realm完成授权" class="headerlink" title="5.自定义Realm完成授权"></a>5.自定义Realm完成授权</h2><p>自定义<code>MyRealmForPermission</code>继承 <code>AuthorizingRealm</code>重写3个方法： getName()   doGetAuthorizationInfo()   doGetAuthenticationInfo()</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MyRealmForPermission</span> <span class="keyword">extends</span> <span class="title">AuthorizingRealm</span> </span>&#123;</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">getName</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">this</span>.getClass().getSimpleName();</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">     * 认证操作</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> authenticationToken</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> AuthenticationException</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">protected</span> AuthenticationInfo <span class="title">doGetAuthenticationInfo</span><span class="params">(AuthenticationToken authenticationToken)</span> <span class="keyword">throws</span> AuthenticationException </span>&#123;</span><br><span class="line">        <span class="comment">// 获取token传入的用户名(页面传入)</span></span><br><span class="line">        String usernameForm = (String) authenticationToken.getPrincipal();</span><br><span class="line">        <span class="comment">// 用户名,密码(从数据库中查询得到)</span></span><br><span class="line">        String username = <span class="string">"wangle"</span>;</span><br><span class="line">        String password = <span class="string">"123"</span>;</span><br><span class="line">        <span class="comment">// 如果没有找到相应的用户,则返回null</span></span><br><span class="line">        <span class="keyword">if</span> (!username.equals(usernameForm)) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">null</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">// 将从数据库中查询的相关信息,封装成AuthenticationInfo对象,继续交给authenticator(认证器)进行认证</span></span><br><span class="line">        <span class="comment">// 加盐</span></span><br><span class="line"><span class="comment">//        AuthenticationInfo info = new SimpleAuthenticationInfo(username, password, ByteSource.Util.bytes("username"),getName());</span></span><br><span class="line">        <span class="comment">// 不加盐</span></span><br><span class="line">        AuthenticationInfo info = <span class="keyword">new</span> SimpleAuthenticationInfo(username, password, getName());</span><br><span class="line">        <span class="keyword">return</span> info;</span><br><span class="line">    &#125;</span><br><span class="line"></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></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> principals</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">protected</span> AuthorizationInfo <span class="title">doGetAuthorizationInfo</span><span class="params">(PrincipalCollection principals)</span> </span>&#123;</span><br><span class="line">        <span class="comment">// 当前登录的用户名</span></span><br><span class="line">        String username = (String) principals.getPrimaryPrincipal();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        SimpleAuthorizationInfo info = <span class="keyword">new</span> SimpleAuthorizationInfo();</span><br><span class="line">        <span class="comment">// 添加角色(实际开发中是通过该用户名称查询数据库,得到用户类型,然后查询用户角色表和角色权限表得到该用户的权限)</span></span><br><span class="line">        info.addRoles(Arrays.asList(<span class="string">"role1"</span>, <span class="string">"role2"</span>));</span><br><span class="line"></span><br><span class="line">        info.addStringPermissions(Arrays.asList(<span class="string">"user:delete"</span>, <span class="string">"user:create"</span>));</span><br><span class="line">        <span class="keyword">return</span> info;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在<code>shiro/shiro_roles_custom.ini</code>中进行配置:</p><figure class="highlight"><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></pre></td><td class="code"><pre><span class="line"><span class="section">[main]</span></span><br><span class="line"></span><br><span class="line"><span class="comment">; 自定realm完成授权</span></span><br><span class="line"><span class="attr">myRealm2</span>= com.lee.shiro.realm.MyRealmForPermission</span><br><span class="line"><span class="comment">;指定securityManager引用的realm</span></span><br><span class="line">securityManager.realms = $myRealm2</span><br></pre></td></tr></table></figure><p>测试:</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></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 自定义Realm,实现用户的认证和授权</span></span><br><span class="line"><span class="comment">     * &lt;p&gt;</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">@Test</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">testAuthen</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    Factory&lt;SecurityManager&gt; factory = <span class="keyword">new</span>           IniSecurityManagerFactory(<span class="string">"classpath:shiro/shiro_roles_custom.ini"</span>);</span><br><span class="line">    SecurityManager securityManager = factory.getInstance();</span><br><span class="line">    SecurityUtils.setSecurityManager(securityManager);</span><br><span class="line">    Subject subject = SecurityUtils.getSubject();</span><br><span class="line">    UsernamePasswordToken token = <span class="keyword">new</span> UsernamePasswordToken(<span class="string">"wangle"</span>, <span class="string">"123"</span>);</span><br><span class="line">    <span class="comment">// 登录认证</span></span><br><span class="line">    subject.login(token);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">boolean</span>[] booleans = subject.hasRoles(Arrays.asList(<span class="string">"role1"</span>, <span class="string">"role2"</span>, <span class="string">"role3"</span>));</span><br><span class="line">    System.out.println(Arrays.toString(booleans));</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 用户是否被授予关于user的所有的权限(类似于admin管理员权限)</span></span><br><span class="line">    <span class="keyword">boolean</span> permitted = subject.isPermitted(<span class="string">"user:*"</span>);</span><br><span class="line">    System.out.println(permitted);</span><br><span class="line"></span><br><span class="line">    <span class="comment">//用户是否被授予delete权限</span></span><br><span class="line">    <span class="keyword">boolean</span> permitted1 = subject.isPermitted(<span class="string">"user:delete"</span>);</span><br><span class="line">    System.out.println(permitted1);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>关于<code>shiro</code>的基本使用原理就是这样的,实际应用是结合web项目来应用的,请关注我的下一篇博客:</p><p><strong>Shiro安全框架之与web集成（2）</strong></p><p><a href="https://blueleer.github.io/">欢迎访问我的博客网站</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 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;/h1&gt;&lt;p&gt;基本上涉及到用户参与的系统都要进行权限管理，权限管理属于系统安全的范畴，权限管理能实
      
    
    </summary>
    
      <category term="shiro安全框架" scheme="https://blueleer.github.io/categories/shiro%E5%AE%89%E5%85%A8%E6%A1%86%E6%9E%B6/"/>
    
    
      <category term="shiro" scheme="https://blueleer.github.io/tags/shiro/"/>
    
  </entry>
  
  <entry>
    <title>Hibernate学习笔记4</title>
    <link href="https://blueleer.github.io/2017/05/12/Hibernate%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B04/"/>
    <id>https://blueleer.github.io/2017/05/12/Hibernate学习笔记4/</id>
    <published>2017-05-12T11:10:40.000Z</published>
    <updated>2018-04-27T09:45:54.293Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Hibernate–4"><a href="#Hibernate–4" class="headerlink" title="Hibernate–4"></a>Hibernate–4</h1><p>JPA(<em>Java Persistence API</em>)：Java持久化API,用于规范ORM接口的一系列规范。</p><p>Hibernate中实现了JPA规范</p><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><ul><li><p>项目引入jpa配置（persistence.xml）</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></pre></td><td class="code"><pre><span class="line">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</span><br><span class="line"><span class="tag">&lt;<span class="name">persistence</span> <span class="attr">xmlns</span>=<span class="string">"http://xmlns.jcp.org/xml/ns/persistence"</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://xmlns.jcp.org/xml/ns/persistence</span></span></span><br><span class="line"><span class="tag"><span class="string">          http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"</span></span></span><br><span class="line"><span class="tag">             <span class="attr">version</span>=<span class="string">"2.1"</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--</span></span><br><span class="line"><span class="comment">                        name : 用于指定持久化单元的名称(可以为空,必须配)</span></span><br><span class="line"><span class="comment">            transaction-type : 指定事务类型,取值为JTA(默认)、RESOURCE_LOCAL</span></span><br><span class="line"><span class="comment">    --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">persistence-unit</span> <span class="attr">name</span>=<span class="string">"Unit1"</span> <span class="attr">transaction-type</span>=<span class="string">"RESOURCE_LOCAL"</span>&gt;</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">&lt;!--javax.persistence.PersistenceProvider的一个实现类,用于创建EntityManagerFactory(用于产生实体类管理者工厂)--&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--在Hibernate中实现了JPA规范,这个类其实也是默认的,可以不配--&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">provider</span>&gt;</span>org.hibernate.jpa.HibernatePersistenceProvider<span class="tag">&lt;/<span class="name">provider</span>&gt;</span></span><br></pre></td></tr></table></figure><pre><code>    &lt;!--罗列出需要持久化的类(在JavaEE环境下可以不配)--&gt;    &lt;class&gt;com.lee.cfgtest.Student&lt;/class&gt;    &lt;class&gt;com.lee.cfgtest.Teacher&lt;/class&gt;    &lt;class&gt;com.lee.one2many.Tenant&lt;/class&gt;    &lt;class&gt;com.lee.one2many.Landlord&lt;/class&gt;    &lt;!--JPA实现者专有配置,不同的JPA规范实现框架,可能配置的property值不一样--&gt;    &lt;!--参考hibernate.cfg.xml中的配置--&gt;    &lt;properties&gt;        &lt;!--DDL生成策略--&gt;        &lt;!--其中update表示:检测实体类和表结构是否一致,如果不一致,更新表结构达到一致,如果不存在该表,就创建一张表--&gt;        &lt;property name=&quot;hibernate.hbm2ddl.auto&quot; value=&quot;update&quot;/&gt;        &lt;!--第一部分:数据库连接配置--&gt;        &lt;property name=&quot;hibernate.connection.driver_class&quot; value=&quot;com.mysql.jdbc.Driver&quot;/&gt;        &lt;property name=&quot;hibernate.connection.url&quot; value=&quot;jdbc:mysql://localhost:3306/hibernate2&quot;/&gt;        &lt;property name=&quot;hibernate.connection.username&quot; value=&quot;root&quot;/&gt;        &lt;property name=&quot;hibernate.connection.password&quot; value=&quot;123&quot;/&gt;        &lt;!--第二部分 :配置数据库连接池:c3p0 (自由选择)--&gt;        &lt;property name=&quot;hibernate.connection.provider_class&quot;                  value=&quot;org.hibernate.connection.C3P0ConnectionProvider&quot;/&gt;        &lt;!--配置数据库方言--&gt;        &lt;property name=&quot;hibernate.dialect&quot; value=&quot;org.hibernate.dialect.MySQL55Dialect&quot;/&gt;        &lt;!--是否在控制台显示生成的sql语句--&gt;        &lt;property name=&quot;hibernate.show_sql&quot; value=&quot;true&quot;/&gt;        &lt;!--是否将控制台里的sql语句格式化输出--&gt;        &lt;!--&lt;property name=&quot;hibernate.format_sql&quot; value=&quot;true&quot;/&gt;--&gt;    &lt;/properties&gt;&lt;/persistence-unit&gt;</code></pre><h2 id="一对多关系配置"><a href="#一对多关系配置" class="headerlink" title="一对多关系配置"></a>一对多关系配置</h2></li></ul><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><br><span class="line"></span><br><span class="line">  一对多关系中的<span class="string">"一"</span>的一方实体类配置</span><br><span class="line"></span><br><span class="line">  <span class="meta">@Entity</span></span><br><span class="line">  <span class="meta">@Table</span>(name = <span class="string">"hb_landlord"</span>)</span><br><span class="line">  <span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Landlord</span> </span>&#123;</span><br><span class="line">      <span class="meta">@Id</span></span><br><span class="line">      <span class="meta">@GeneratedValue</span>(strategy = GenerationType.IDENTITY)</span><br><span class="line">      <span class="meta">@Column</span>(name = <span class="string">"l_id"</span>)</span><br><span class="line">      <span class="keyword">private</span> Integer lid;</span><br><span class="line"></span><br><span class="line">      <span class="meta">@Column</span>(name = <span class="string">"l_name"</span>)</span><br><span class="line">      <span class="keyword">private</span> String lname;</span><br><span class="line"></span><br><span class="line">      <span class="meta">@Column</span>(name = <span class="string">"l_sex"</span>)</span><br><span class="line">      <span class="keyword">private</span> String lsex;</span><br><span class="line">      <span class="meta">@Column</span>(name = <span class="string">"l_age"</span>)</span><br><span class="line">      <span class="keyword">private</span> Integer lage;</span><br><span class="line">      <span class="meta">@Column</span>(name = <span class="string">"l_phone"</span>)</span><br><span class="line">      <span class="keyword">private</span> String lphone;</span><br><span class="line">      </span><br><span class="line">      <span class="comment">// 参数解释:</span></span><br><span class="line">      <span class="comment">// targetEntity:表示对应的"多"的一方的字节码文件,也可以不加</span></span><br><span class="line">      <span class="comment">// mappedBy:从表中引用的该实体属性名,如果配置了该项,表示放弃维护和从表之间的关联关系.在一对多配置中,一般"一"的一方会配置上该属性;如果没有配置该属性,会生成第三张表(类似于多对多中的中间表)来维护他们之间的关系</span></span><br><span class="line">      <span class="comment">// fetch:配置tenants的加载方式, OneToMany中fetch的默认值为LAZY</span></span><br><span class="line">      <span class="comment">// 还有其他属性:cascade:级联操作</span></span><br><span class="line">      <span class="meta">@OneToMany</span>(targetEntity = Tenant.class, fetch = FetchType.LAZY, mappedBy = <span class="string">"landlord"</span>)</span><br><span class="line">      <span class="keyword">private</span> Set&lt;Tenant&gt; tenants = <span class="keyword">new</span> HashSet&lt;&gt;(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">      <span class="comment">// 省略默认构造方法,get/set方法,toString()方法</span></span><br><span class="line">  &#125;</span><br></pre></td></tr></table></figure><p><strong>注意:属性级别的注解，都是放在其对应的getter前。</strong></p><p>  一对多中”多”的一方的实体类配置</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></pre></td><td class="code"><pre><span class="line"><span class="meta">@Entity</span></span><br><span class="line"><span class="meta">@Table</span>(name = <span class="string">"hb_tenant"</span>)</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Tenant</span> </span>&#123;</span><br><span class="line">    <span class="meta">@Id</span></span><br><span class="line">    <span class="meta">@GeneratedValue</span>(strategy = GenerationType.IDENTITY)</span><br><span class="line">    <span class="meta">@Column</span>(name = <span class="string">"t_id"</span>)</span><br><span class="line">    <span class="keyword">private</span> Integer tid;</span><br><span class="line">    <span class="meta">@Column</span>(name = <span class="string">"t_name"</span>)</span><br><span class="line">    <span class="keyword">private</span> String tname;</span><br><span class="line">    <span class="meta">@Column</span>(name = <span class="string">"t_sex"</span>)</span><br><span class="line">    <span class="keyword">private</span> String tsex;</span><br><span class="line">    <span class="meta">@Column</span>(name = <span class="string">"t_age"</span>)</span><br><span class="line">    <span class="keyword">private</span> Integer tage;</span><br><span class="line">    <span class="meta">@Column</span>(name = <span class="string">"t_phone"</span>)</span><br><span class="line">    <span class="keyword">private</span> String tphone;</span><br><span class="line">    <span class="meta">@Column</span>(name = <span class="string">"t_job"</span>)</span><br><span class="line">    <span class="keyword">private</span> String tjob; <span class="comment">// 从事的工作</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// 一位租户只能有一个房东,建立关系</span></span><br><span class="line">    <span class="meta">@ManyToOne</span>(targetEntity = Landlord.class, fetch = FetchType.LAZY)</span><br><span class="line">    <span class="comment">// 用于配置外键,如果不配置也会默认生成(最好自己配上,生成的外键字段可读性更好)</span></span><br><span class="line">    <span class="meta">@JoinColumn</span>(name = <span class="string">"land_tenant_fk"</span>, referencedColumnName = <span class="string">"l_id"</span>) </span><br><span class="line">    <span class="keyword">private</span> Landlord landlord;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 省略默认构造方法,get/set方法,toString()方法</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="多对多关系配置"><a href="#多对多关系配置" class="headerlink" title="多对多关系配置"></a>多对多关系配置</h2><p>多对多配置以后会生成一个中间表,中间表维护了两个表之间的关系.但是在配置的时候,要分清楚关系维护端(保留关联关系),<strong>任何两个表之间都有主从之分</strong></p><p><strong>主表:hb_teacher对应的实体表</strong></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></pre></td><td class="code"><pre><span class="line"><span class="meta">@Entity</span> <span class="comment">// 指定这是一个实体类.在创建EntityManagerFactory的时候就会读取映射配置</span></span><br><span class="line"><span class="meta">@Table</span>(name = <span class="string">"hb_teacher"</span>) <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">Teacher</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Id</span> <span class="comment">// 主键</span></span><br><span class="line">    <span class="meta">@GeneratedValue</span>(strategy = GenerationType.IDENTITY) <span class="comment">// 主键生成策略</span></span><br><span class="line">    <span class="meta">@Column</span>(name = <span class="string">"t_id"</span>) <span class="comment">// 主键在数据库中对应的字段名</span></span><br><span class="line">    <span class="keyword">private</span> Long tid;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="meta">@Column</span>(name = <span class="string">"t_name"</span>)</span><br><span class="line">    <span class="keyword">private</span> String tname;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Column</span>(name = <span class="string">"t_age"</span>)</span><br><span class="line">    <span class="keyword">private</span> String tage;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// targetEntity:映射的另一方实体的类</span></span><br><span class="line">    <span class="comment">// mappedBy : 被对方维护关联关系(也就是说放弃了维护关联关系的权利)</span></span><br><span class="line">    <span class="meta">@ManyToMany</span>(targetEntity = Student.class,mappedBy = <span class="string">"teachers"</span>)</span><br><span class="line">    <span class="keyword">private</span> Set&lt;Student&gt; students = <span class="keyword">new</span> HashSet&lt;&gt;(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">Teacher</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 省略get/set方法,省略toString方法</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>从表:hb_student表对应的实:</strong></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></pre></td><td class="code"><pre><span class="line"><span class="meta">@Entity</span></span><br><span class="line"><span class="meta">@Table</span>(name = <span class="string">"hb_student"</span>)</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Student</span> </span>&#123;</span><br><span class="line">    <span class="meta">@Id</span></span><br><span class="line">    <span class="meta">@GeneratedValue</span>(strategy = GenerationType.IDENTITY)</span><br><span class="line">    <span class="meta">@Column</span>(name = <span class="string">"s_id"</span>)</span><br><span class="line">    <span class="keyword">private</span> Long sid;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Column</span>(name = <span class="string">"s_name"</span>)</span><br><span class="line">    <span class="keyword">private</span> String sname;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Column</span>(name = <span class="string">"s_age"</span>)</span><br><span class="line">    <span class="keyword">private</span> String sage;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@ManyToMany</span>(targetEntity = Teacher.class)</span><br><span class="line">    <span class="meta">@JoinTable</span>(</span><br><span class="line">            name = <span class="string">"stu_tea_ref"</span>, <span class="comment">// 中间表的表名</span></span><br><span class="line">            joinColumns = &#123;</span><br><span class="line">                    <span class="comment">// 指定自己一方在表中维护的字段.name:字段名;referencedColumnName:关联的字段名称</span></span><br><span class="line">                    <span class="meta">@JoinColumn</span>(name = <span class="string">"stu_id"</span>, referencedColumnName = <span class="string">"s_id"</span>)</span><br><span class="line">            &#125;,</span><br><span class="line">            inverseJoinColumns = &#123;</span><br><span class="line">                    <span class="comment">// 指定对方在表中维护的字段.name:字段名;referencedColumnName:关联的字段的名称</span></span><br><span class="line">                    <span class="meta">@JoinColumn</span>(name = <span class="string">"tea_id"</span>, referencedColumnName = <span class="string">"t_id"</span>)</span><br><span class="line">            &#125;</span><br><span class="line">    )</span><br><span class="line">    <span class="keyword">private</span> Set&lt;Teacher&gt; teachers = <span class="keyword">new</span> HashSet&lt;&gt;(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">Student</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 省略get/set方法,省略toString()方法</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="在执行删除操作时"><a href="#在执行删除操作时" class="headerlink" title="在执行删除操作时:"></a>在执行删除操作时:</h2><p><strong>主控方(维护了关联关系的表)</strong>:</p><ul><li>可以同时将记录删除,并且删除中间表中的记录</li></ul><p><strong>从方(放弃维护关联关系的表):</strong></p><ul><li>如果该记录被中间表引用,不能删除</li><li><p>在从方配置了级联删除,会将该记录删除,中间表中的数据也会删除,但,<strong>同时会将主控方的表中也删除一条记录</strong>,这是不允许的</p><p>​</p></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Hibernate–4&quot;&gt;&lt;a href=&quot;#Hibernate–4&quot; class=&quot;headerlink&quot; title=&quot;Hibernate–4&quot;&gt;&lt;/a&gt;Hibernate–4&lt;/h1&gt;&lt;p&gt;JPA(&lt;em&gt;Java Persistence API&lt;/em&gt;)
      
    
    </summary>
    
    
      <category term="学习日记" scheme="https://blueleer.github.io/tags/%E5%AD%A6%E4%B9%A0%E6%97%A5%E8%AE%B0/"/>
    
      <category term="错误解决" scheme="https://blueleer.github.io/tags/%E9%94%99%E8%AF%AF%E8%A7%A3%E5%86%B3/"/>
    
      <category term="Hibernate" scheme="https://blueleer.github.io/tags/Hibernate/"/>
    
  </entry>
  
  <entry>
    <title>mybatis的逆向工程</title>
    <link href="https://blueleer.github.io/2017/05/10/mybatis%E7%9A%84%E9%80%86%E5%90%91%E5%B7%A5%E7%A8%8B/"/>
    <id>https://blueleer.github.io/2017/05/10/mybatis的逆向工程/</id>
    <published>2017-05-10T08:11:52.000Z</published>
    <updated>2018-06-07T11:16:13.977Z</updated>
    
    <summary type="html">
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>SpringMVC和MyBatis整合入门</title>
    <link href="https://blueleer.github.io/2017/05/10/SpringMVC%E5%92%8CMyBatis%E6%95%B4%E5%90%88%E5%85%A5%E9%97%A8/"/>
    <id>https://blueleer.github.io/2017/05/10/SpringMVC和MyBatis整合入门/</id>
    <published>2017-05-10T07:39:01.000Z</published>
    <updated>2018-06-07T11:16:39.592Z</updated>
    
    <content type="html"><![CDATA[<h1 id="1-整合思路"><a href="#1-整合思路" class="headerlink" title="1. 整合思路"></a>1. 整合思路</h1><ul><li>表现层 SpringMVC</li><li>业务层 service接口</li><li>持久层 MyBatis</li></ul><p>Spring将各层进行整合</p><ul><li>通过spring管理持久层的mapper(相当于dao接口)</li><li>通过spring管理业务层service，service中可以调用mapper接口。</li><li>spring进行事务控制。</li></ul><ul><li>通过spring管理表现层Handler，Handler中可以调用service接口。</li></ul><p><strong>mapper、service、Handler都是javabean(Java组件)。Spring的IOC和AOP特性很容易做到上面这些</strong></p><h1 id="2-整合思路"><a href="#2-整合思路" class="headerlink" title="2. 整合思路"></a>2. 整合思路</h1><ul><li>第一步：整合dao层</li></ul><p>​        mybatis和spring整合，通过spring管理mapper接口。</p><p>​        使用mapper的扫描器自动扫描mapper接口在spring中进行注册。</p><ul><li>第二步：整合service层</li></ul><p>​        通过spring管理 service接口。</p><p>​        使用配置方式将service接口配置在spring配置文件中。</p><p>​        实现事务控制。</p><ul><li>第三步：整合springmvc</li></ul><p>​        由于springmvc是spring的模块，不需要整合。</p><h1 id="3-整合过程-基于maven"><a href="#3-整合过程-基于maven" class="headerlink" title="3. 整合过程,基于maven"></a>3. 整合过程,基于maven</h1><h2 id="3-1-整合dao层"><a href="#3-1-整合dao层" class="headerlink" title="3.1 整合dao层"></a>3.1 整合dao层</h2><p>创建配置文件<code>applicationContext-dao.xml</code>配置文件,里面专门放置跟dao层相关的配置</p><p>applicationContext-dao.xml:</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></pre></td><td class="code"><pre><span class="line">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</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">xmlns:context</span>=<span class="string">"http://www.springframework.org/schema/context"</span></span></span><br><span class="line"><span class="tag">       <span class="attr">xmlns:mvc</span>=<span class="string">"http://www.springframework.org/schema/mvc"</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</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/beans/spring-beans.xsd</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/context</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/context/spring-context.xsd</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/mvc</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/mvc/spring-mvc.xsd"</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">context:property-placeholder</span> <span class="attr">location</span>=<span class="string">"classpath:config.properties"</span>/&gt;</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment">&lt;!--</span></span><br><span class="line"><span class="comment">   使用自动扫描:将mybatis的mapper自动装载进来</span></span><br><span class="line"><span class="comment">   遵循的规范:mapper.java和mapper.xml映射文件名保持一致,并且要在一个目录中</span></span><br><span class="line"><span class="comment">   --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">bean</span> <span class="attr">class</span>=<span class="string">"org.mybatis.spring.mapper.MapperScannerConfigurer"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">property</span> <span class="attr">name</span>=<span class="string">"basePackage"</span> <span class="attr">value</span>=<span class="string">"com.lee.ssm.mapper"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">bean</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="comment">&lt;!--配置c3p0连接池--&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"dataSource"</span> <span class="attr">class</span>=<span class="string">"com.mchange.v2.c3p0.ComboPooledDataSource"</span>&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--数据库连接相关信息--&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">property</span> <span class="attr">name</span>=<span class="string">"driverClass"</span> <span class="attr">value</span>=<span class="string">"$&#123;jdbc.driverClassName&#125;"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">property</span> <span class="attr">name</span>=<span class="string">"jdbcUrl"</span> <span class="attr">value</span>=<span class="string">"$&#123;jdbc.url&#125;"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">property</span> <span class="attr">name</span>=<span class="string">"user"</span> <span class="attr">value</span>=<span class="string">"$&#123;jdbc.username&#125;"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">property</span> <span class="attr">name</span>=<span class="string">"password"</span> <span class="attr">value</span>=<span class="string">"$&#123;jdbc.password&#125;"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">bean</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">&lt;!--使用SqlSessionFactoryBean来代替SqlSessionFactoryBuilder创建SqlSessionFactory，&amp;ndash;&amp;gt;--&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"sqlSessionFactory"</span> <span class="attr">class</span>=<span class="string">"org.mybatis.spring.SqlSessionFactoryBean"</span>&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--加载MyBatis的配置文件--&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">property</span> <span class="attr">name</span>=<span class="string">"configLocation"</span> <span class="attr">value</span>=<span class="string">"classpath:mybatis/mybatis_cfg.xml"</span>/&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--配置数据源--&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">property</span> <span class="attr">name</span>=<span class="string">"dataSource"</span> <span class="attr">ref</span>=<span class="string">"dataSource"</span>/&gt;</span></span><br><span class="line">    <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><p>要点:</p><ul><li>配置数据源</li><li>配置<code>SqlSessionFactoryBean</code>,用于创建<code>SqlSessionFactory</code></li><li>配置<code>mapper扫描器</code>,用于将mapper自动加载出来</li><li>可以使用mybatis的逆向工程生成单表的mapper</li></ul><p>还需要一个文件,mybatis的配置文件<code>mybatis_cfg.xml</code>,里面用于放置mybatis的运行环境</p><p>mybatis_cfg.xml:</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></pre></td><td class="code"><pre><span class="line">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</span><br><span class="line"><span class="meta">&lt;!DOCTYPE configuration</span></span><br><span class="line"><span class="meta">        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"</span></span><br><span class="line"><span class="meta">        "http://mybatis.org/dtd/mybatis-3-config.dtd"&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">configuration</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">settings</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">setting</span> <span class="attr">name</span>=<span class="string">"logImpl"</span> <span class="attr">value</span>=<span class="string">"LOG4J"</span>/&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--</span></span><br><span class="line"><span class="comment">        配置懒加载:</span></span><br><span class="line"><span class="comment">        lazyLoadingEnabled:</span></span><br><span class="line"><span class="comment">            表示是否开启懒加载,true表示开启懒加载,默认为true</span></span><br><span class="line"><span class="comment">        aggressiveLazyLoading:</span></span><br><span class="line"><span class="comment">            当它为true的时候,访问任何一个属性,都会触发查询,懒加载的对象也会被查询</span></span><br><span class="line"><span class="comment">            当它为false的时候,你访问了非懒加载对象,他不会执行懒加载语句;直到你访问了懒加载对象,他才会进行加载</span></span><br><span class="line"><span class="comment">            默认值为true</span></span><br><span class="line"><span class="comment">        lazyLoadTriggerMethods:</span></span><br><span class="line"><span class="comment">            指定哪些对象的方法会触发一次延迟加载.默认有: equals,clone,hashCode,toString</span></span><br><span class="line"><span class="comment">            当执行这些方法的时候,都会触发懒加载</span></span><br><span class="line"><span class="comment">        --&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">setting</span> <span class="attr">name</span>=<span class="string">"lazyLoadingEnabled"</span> <span class="attr">value</span>=<span class="string">"true"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">setting</span> <span class="attr">name</span>=<span class="string">"aggressiveLazyLoading"</span> <span class="attr">value</span>=<span class="string">"false"</span>/&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--将触发懒加载的方法设成空--&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">setting</span> <span class="attr">name</span>=<span class="string">"lazyLoadTriggerMethods"</span> <span class="attr">value</span>=<span class="string">"/"</span>/&gt;</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">&lt;!--开启二级缓存,默认就是true,可以不配置--&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">setting</span> <span class="attr">name</span>=<span class="string">"cacheEnabled"</span> <span class="attr">value</span>=<span class="string">"true"</span>/&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;/<span class="name">settings</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">typeAliases</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">package</span> <span class="attr">name</span>=<span class="string">"com.lee.ssm.model"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">typeAliases</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">&lt;!--在Spring中开启组件扫描,所以这里不用配置了</span></span><br><span class="line"><span class="comment">    注意:在Spring中自动扫描Mapper.xml和Mapper.java必须要满足文件名一致,并且在同一个目录下--&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--&lt;mappers&gt;&lt;/mappers&gt;--&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">configuration</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="3-2-整合service"><a href="#3-2-整合service" class="headerlink" title="3.2 整合service"></a>3.2 整合service</h2><p>BookService接口:</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">interface</span> <span class="title">BookService</span> </span>&#123;</span><br><span class="line">    <span class="function">List&lt;Book&gt; <span class="title">findAllBooks</span><span class="params">()</span> <span class="keyword">throws</span> Exception</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>BookService的实现类:</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">BookServiceImpl</span> <span class="keyword">implements</span> <span class="title">BookService</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> BookMapper mBookMapper;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> BookMapper <span class="title">getBookMapper</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> mBookMapper;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 自动注入BookMapper,Spring会自动装配</span></span><br><span class="line">    <span class="meta">@Autowired</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setBookMapper</span><span class="params">(BookMapper bookMapper)</span> </span>&#123;</span><br><span class="line">        mBookMapper = bookMapper;</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">     * 查询所有的Book信息</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> Exception</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> List&lt;Book&gt; <span class="title">findAllBooks</span><span class="params">()</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">        BookExample bookExample = <span class="keyword">new</span> BookExample();</span><br><span class="line">        List&lt;Book&gt; bookList = mBookMapper.selectByExample(bookExample);</span><br><span class="line">        <span class="keyword">return</span> bookList;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>让spring管理我们的service,因此在<code>applicationContext-service.xml</code>中配置service的bean</p><p>applicationContext-service.xml:</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></pre></td><td class="code"><pre><span class="line">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</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">xmlns:context</span>=<span class="string">"http://www.springframework.org/schema/context"</span></span></span><br><span class="line"><span class="tag">       <span class="attr">xmlns:mvc</span>=<span class="string">"http://www.springframework.org/schema/mvc"</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</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/beans/spring-beans.xsd</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/context</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/context/spring-context.xsd</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/mvc</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/mvc/spring-mvc.xsd"</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">&lt;!--book的Service--&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"bookService"</span> <span class="attr">class</span>=<span class="string">"com.lee.ssm2.service.impl.BookServiceImpl"</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><h2 id="3-3-事务控制"><a href="#3-3-事务控制" class="headerlink" title="3.3 事务控制"></a>3.3 事务控制</h2><p>service层负责事务管理.</p><p>为了是xml配置文件分工明确,这里可以另外分离出一个<code>applicationContext-transaction.xml</code>配置文件:</p><p>applicationContext-transaction.xml:</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></pre></td><td class="code"><pre><span class="line">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</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">xmlns:context</span>=<span class="string">"http://www.springframework.org/schema/context"</span></span></span><br><span class="line"><span class="tag">       <span class="attr">xmlns:mvc</span>=<span class="string">"http://www.springframework.org/schema/mvc"</span></span></span><br><span class="line"><span class="tag">       <span class="attr">xmlns:tx</span>=<span class="string">"http://www.springframework.org/schema/tx"</span></span></span><br><span class="line"><span class="tag">       <span class="attr">xmlns:aop</span>=<span class="string">"http://www.springframework.org/schema/aop"</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</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/beans/spring-beans.xsd</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/context</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/context/spring-context.xsd</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/mvc</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/mvc/spring-mvc.xsd</span></span></span><br><span class="line"><span class="tag"><span class="string">        http://www.springframework.org/schema/tx</span></span></span><br><span class="line"><span class="tag"><span class="string">        http://www.springframework.org/schema/tx/spring-tx.xsd</span></span></span><br><span class="line"><span class="tag"><span class="string">        http://www.springframework.org/schema/aop</span></span></span><br><span class="line"><span class="tag"><span class="string">        http://www.springframework.org/schema/tx/spring-aop.xsd"</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="comment">&lt;!--第一步:配置事务管理器--&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"transactionManager"</span> <span class="attr">class</span>=<span class="string">"org.springframework.jdbc.datasource.DataSourceTransactionManager"</span>&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--注意这个dataSource是引用自dao层映射文件中的--&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">property</span> <span class="attr">name</span>=<span class="string">"dataSource"</span> <span class="attr">ref</span>=<span class="string">"dataSource"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">bean</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">tx:advice</span> <span class="attr">id</span>=<span class="string">"tx_advice"</span> <span class="attr">transaction-manager</span>=<span class="string">"transactionManager"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">tx:attributes</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">tx:method</span> <span class="attr">name</span>=<span class="string">"find*"</span> <span class="attr">propagation</span>=<span class="string">"REQUIRED"</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">tx:method</span> <span class="attr">name</span>=<span class="string">"insert*"</span> <span class="attr">propagation</span>=<span class="string">"REQUIRED"</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">tx:method</span> <span class="attr">name</span>=<span class="string">"select*"</span> <span class="attr">propagation</span>=<span class="string">"REQUIRED"</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">tx:method</span> <span class="attr">name</span>=<span class="string">"get*"</span> <span class="attr">propagation</span>=<span class="string">"REQUIRED"</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">tx:method</span> <span class="attr">name</span>=<span class="string">"load*"</span> <span class="attr">propagation</span>=<span class="string">"REQUIRED"</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">tx:method</span> <span class="attr">name</span>=<span class="string">"update*"</span> <span class="attr">propagation</span>=<span class="string">"REQUIRED"</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">tx:method</span> <span class="attr">name</span>=<span class="string">"modify*"</span> <span class="attr">propagation</span>=<span class="string">"REQUIRED"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">tx:attributes</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">tx:advice</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">aop:config</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">aop:pointcut</span> <span class="attr">id</span>=<span class="string">"book_pointcut"</span> <span class="attr">expression</span>=<span class="string">"execution(* com.lee.ssm2.service.*.*(..))"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">aop:advisor</span> <span class="attr">advice-ref</span>=<span class="string">"tx_advice"</span> <span class="attr">pointcut-ref</span>=<span class="string">"book_pointcut"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">aop:config</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">beans</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="3-4-整合SpringMVC"><a href="#3-4-整合SpringMVC" class="headerlink" title="3.4 整合SpringMVC"></a>3.4 整合SpringMVC</h2><p>整合思路,一共有四个点:</p><ul><li><p>配置前端控制器(在web.xml中)</p><p>web.xml:</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></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">servlet</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">servlet-name</span>&gt;</span>springmvc<span class="tag">&lt;/<span class="name">servlet-name</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">servlet-class</span>&gt;</span>org.springframework.web.servlet.DispatcherServlet<span class="tag">&lt;/<span class="name">servlet-class</span>&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--加载applicationContext-mvc配置文件--&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">init-param</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">param-name</span>&gt;</span>contextConfigLocation<span class="tag">&lt;/<span class="name">param-name</span>&gt;</span></span><br><span class="line">            <span class="comment">&lt;!--配置文件的地址如果不配置contextConfigLocation，默认查找的配置文件名称是classpath下的:servlet名称+"-servlet.xml"即springmvc-servlet.xml--&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">param-value</span>&gt;</span>classpath:spring/applicationContext-mvc.xml<span class="tag">&lt;/<span class="name">param-value</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">init-param</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">servlet</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">servlet-mapping</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">servlet-name</span>&gt;</span>springmvc<span class="tag">&lt;/<span class="name">servlet-name</span>&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--</span></span><br><span class="line"><span class="comment">        可以配置"/"此工程所有的请求全部由springmvc解析，此种方式可以实现RESTful方式，需要特殊处理对静态文件的解析不能由springmvc解析;</span></span><br><span class="line"><span class="comment">        可以配置*.do或者*.action,所有请求的url扩展名为.do或.action由springmvc解析，此中方法常用;</span></span><br><span class="line"><span class="comment">        不可以配置"/*",如果配置/*,返回jsp也由springmvc解析，这是不对的</span></span><br><span class="line"><span class="comment">        --&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">url-pattern</span>&gt;</span>*.action<span class="tag">&lt;/<span class="name">url-pattern</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">servlet-mapping</span>&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>配置处理器映射器(在applicationContext-mvc.xml中)(选择注解方式)</p></li><li><p>配置处理器适配器(在applicationContext-mvc.xml中)(选择注解方式)</p></li><li><p>配置视图解析器(在applicationContext-mvc.xml中)</p><p>applicationContext-mvc.xml:</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></pre></td><td class="code"><pre><span class="line">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</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">xmlns:context</span>=<span class="string">"http://www.springframework.org/schema/context"</span></span></span><br><span class="line"><span class="tag">       <span class="attr">xmlns:mvc</span>=<span class="string">"http://www.springframework.org/schema/mvc"</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</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/beans/spring-beans.xsd</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/context</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/context/spring-context.xsd</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/mvc</span></span></span><br><span class="line"><span class="tag"><span class="string">       http://www.springframework.org/schema/mvc/spring-mvc.xsd"</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">context:component-scan</span> <span class="attr">base-package</span>=<span class="string">"com.lee.ssm2.controller"</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">bean</span> <span class="attr">class</span>=<span class="string">"org.springframework.web.servlet.view.InternalResourceViewResolver"</span>&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--prefix表示jsp路径的前缀，suffix表示jsp路径的后缀--&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--在实际的controller中路径jsp/index.jsp就可以直接简化成index--&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--通过该视图解析器的解析,会自动的拼接真正的视图路径--&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">property</span> <span class="attr">name</span>=<span class="string">"prefix"</span> <span class="attr">value</span>=<span class="string">"/jsp"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">property</span> <span class="attr">name</span>=<span class="string">"suffix"</span> <span class="attr">value</span>=<span class="string">".jsp"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">bean</span>&gt;</span></span><br></pre></td></tr></table></figure><pre><code>&lt;!--================================================================================--&gt;&lt;!--使用注解的方式配置Handler以后,需要将处理器映射器和处理器适配器配置为以下的方式--&gt;&lt;!--配置处理器映射器--&gt;&lt;!--&lt;bean class=&quot;org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping&quot;/&gt;--&gt;&lt;!--配置处理器适配器--&gt;&lt;!--&lt;bean class=&quot;org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter&quot;/&gt;--&gt;&lt;!--一句话将处理器映射器和处理器配置器配置进来了,用来取代上面的两行代码--&gt;&lt;mvc:annotation-driven/&gt;</code></pre><p></p><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">## 3.5 装载Spring容器</span><br><span class="line"></span><br><span class="line">回顾:上面一共有四个Spring相关的配置文件</span><br><span class="line"></span><br><span class="line">* `applicationContext-dao.xml`</span><br><span class="line">* `applicationContext-service.xml`</span><br><span class="line">* `applicationContext-transaction.xml`</span><br><span class="line">* `applicationContext-mvc.xml`</span><br><span class="line"></span><br><span class="line">其中`applicationContext.mvc.xml`是SpringMVC的配置文件,他已经在配置前端控制器的时候作为配置参数传递进去了.而另外三个是Spring容器加载需要的配置文件,因此他们也需要在`web.xml`文件中进行配置,配置如下:</span><br><span class="line"></span><br><span class="line">​```xml</span><br><span class="line">&lt;!--加载Spring容器--&gt;</span><br><span class="line">&lt;!--指定Spring配置文件的位置--&gt;</span><br><span class="line">&lt;context-param&gt;</span><br><span class="line">    &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;</span><br><span class="line">    &lt;!--使用通配符的方式--&gt;</span><br><span class="line">    &lt;param-value&gt;classpath:spring/applicationContext-*.xml&lt;/param-value&gt;</span><br><span class="line">&lt;/context-param&gt;</span><br><span class="line">&lt;!--配置Spring监听器--&gt;</span><br><span class="line">&lt;listener&gt;</span><br><span class="line">    &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;</span><br><span class="line">&lt;/listener&gt;</span><br></pre></td></tr></table></figure></li></ul><p>其中:<code>ContextLoaderListener</code>是Spring上下文加载时的监听器,当它读取到<code>context-param</code>参数的时候,就会在服务器启动的时候创建<code>context-param</code>配置文件中的bean.它和Struts整合的时候也是这么做的!!</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 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;/h1&gt;&lt;ul&gt;
&lt;li&gt;表现层 SpringMVC&lt;/li&gt;
&lt;li&gt;业务层 service接口&lt;/li&gt;
&lt;li&gt;
      
    
    </summary>
    
      <category term="Spring" scheme="https://blueleer.github.io/categories/Spring/"/>
    
    
      <category term="Spring" scheme="https://blueleer.github.io/tags/Spring/"/>
    
      <category term="SpringMVC" scheme="https://blueleer.github.io/tags/SpringMVC/"/>
    
  </entry>
  
  <entry>
    <title>SpringMVC使用非注解方式和注解方式</title>
    <link href="https://blueleer.github.io/2017/05/09/Spring%E4%BD%BF%E7%94%A8%E9%9D%9E%E6%B3%A8%E8%A7%A3%E6%96%B9%E5%BC%8F%E5%92%8C%E6%B3%A8%E8%A7%A3%E6%96%B9%E5%BC%8F/"/>
    <id>https://blueleer.github.io/2017/05/09/Spring使用非注解方式和注解方式/</id>
    <published>2017-05-09T11:00:33.000Z</published>
    <updated>2018-06-07T11:16:53.982Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Spring-SpringMVC-使用非注解方式和注解方式"><a href="#Spring-SpringMVC-使用非注解方式和注解方式" class="headerlink" title="Spring:SpringMVC 使用非注解方式和注解方式"></a>Spring:SpringMVC 使用非注解方式和注解方式</h1><p>SpringMVC配置的组件众多,如果单纯的在xml文件中进行配置,需要配置<code>处理器映射器</code>,<code>处理器适配器</code>,<code>处理器</code>,<code>处理器解析器.</code>尤其是处理器的配置,并且还得指定处理器的name,才能完成请求地址到handler之间的映射.相比较于注解方式,注解方式实在是太麻烦了.</p><p>但是,我们还是先来看看两种配置方式的具体做法吧!</p><h2 id="1-1-使用非注解方式"><a href="#1-1-使用非注解方式" class="headerlink" title="1.1 使用非注解方式"></a>1.1 使用非注解方式</h2><h3 id="1-1-1-处理器映射器"><a href="#1-1-1-处理器映射器" class="headerlink" title="1.1.1 处理器映射器"></a>1.1.1 处理器映射器</h3><p>使用<code>BeanNameUrlHandlerMapping</code>:</p><p>它能够完成Handler的bean的name和url之间的映射</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="comment">&lt;!--配置处理器映射器--&gt;</span></span><br><span class="line"><span class="comment">&lt;!--根据url查找对应name值的Handler--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">bean</span> <span class="attr">class</span>=<span class="string">"org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"</span>/&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!--配置我们自定义的Handler(处理器)--&gt;</span></span><br><span class="line"><span class="comment">&lt;!--它会被BeanNameUrlHandlerMapping类型的处理器映射器映射匹配,根据它的name值--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">bean</span> <span class="attr">name</span>=<span class="string">"/user.action"</span> <span class="attr">class</span>=<span class="string">"com.lee.ssm.controller.UserController"</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">bean</span> <span class="attr">name</span>=<span class="string">"/book.action"</span> <span class="attr">class</span>=<span class="string">"com.lee.ssm.controller.BookController"</span>/&gt;</span></span><br></pre></td></tr></table></figure><p>使用<code>SimpleUrlHandlerMapping</code>:</p><p>它可以批量完成Handler和url之间的映射</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></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!--通过Handler的ID值完成url和Handler的映射--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">bean</span> <span class="attr">class</span>=<span class="string">"org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">property</span> <span class="attr">name</span>=<span class="string">"mappings"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">props</span>&gt;</span></span><br><span class="line">            <span class="comment">&lt;!--key是地址--&gt;</span></span><br><span class="line">            <span class="comment">&lt;!--值为Handler的ID--&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">prop</span> <span class="attr">key</span>=<span class="string">"/user.action"</span>&gt;</span>userController<span class="tag">&lt;/<span class="name">prop</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">prop</span> <span class="attr">key</span>=<span class="string">"/book.action"</span>&gt;</span>bookController<span class="tag">&lt;/<span class="name">prop</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">props</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">property</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;/<span class="name">bean</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!--配置我们自定义的Handler(处理器)--&gt;</span></span><br><span class="line"><span class="comment">&lt;!--它会被BeanNameUrlHandlerMapping类型的处理器映射器映射匹配,根据它的name值--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">bean</span> <span class="attr">name</span>=<span class="string">"/user.action"</span> <span class="attr">id</span>=<span class="string">"userController"</span> <span class="attr">class</span>=<span class="string">"com.lee.ssm.controller.UserController"</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">bean</span> <span class="attr">name</span>=<span class="string">"/book.action"</span> <span class="attr">id</span>=<span class="string">"bookController"</span> <span class="attr">class</span>=<span class="string">"com.lee.ssm.controller.BookController"</span>/&gt;</span></span><br></pre></td></tr></table></figure><p>上述两种方式都能完成url到handler的映射</p><h3 id="1-1-2-处理器适配器"><a href="#1-1-2-处理器适配器" class="headerlink" title="1.1.2 处理器适配器"></a>1.1.2 处理器适配器</h3><ul><li><p>使用:<code>SimpleControllerHandlerAdapter</code>,它能够调用的Handler必须实现<code>org.springframework.web.servlet.mvc</code>包下的<code>Controller</code>接口</p><p>UserController处理器:</p></li></ul><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">UserController</span> <span class="keyword">implements</span> <span class="title">Controller</span> </span>&#123;</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> ModelAndView <span class="title">handleRequest</span><span class="params">(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">        ModelAndView modelAndView = <span class="keyword">new</span> ModelAndView();</span><br><span class="line">        <span class="comment">// 设置模型数据,通过键值对的形式设置,在页面中就像从response中取数据一样取出来</span></span><br><span class="line">        modelAndView.addObject(<span class="string">"msg"</span>, <span class="string">"Hello World!"</span>);</span><br><span class="line">        <span class="comment">// 设置视图,这里设置了一个链接,相当于转发</span></span><br><span class="line">        modelAndView.setViewName(<span class="string">"jsp/helloworld.jsp"</span>);</span><br><span class="line">        <span class="keyword">return</span> modelAndView;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>SimpleControllerHanderAdapter的配置:</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></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!--配置处理器适配器--&gt;</span></span><br><span class="line"><span class="comment">&lt;!--他只能适配Controller的实现类型的Controller--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">bean</span> <span class="attr">class</span>=<span class="string">"org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"</span>/&gt;</span></span><br></pre></td></tr></table></figure><ul><li><p>使用<code>HttpRequestHandlerAdapter</code>,他只能适配HttpRequestHandler实现类型的Controller</p><p>OrdersController处理器:</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">OrdersController</span> <span class="keyword">implements</span> <span class="title">HttpRequestHandler</span> </span>&#123;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">handleRequest</span><span class="params">(HttpServletRequest request, HttpServletResponse response)</span> <span class="keyword">throws</span> ServletException, IOException </span>&#123;</span><br><span class="line">        <span class="comment">// 接下来的开发像极了使用Servlet的原生开发</span></span><br><span class="line">        response.getWriter().print(getClass().getSimpleName() + <span class="string">",hello!"</span>);</span><br><span class="line"></span><br><span class="line">        request.getRequestDispatcher(<span class="string">"jsp/helloworld.jsp"</span>).forward(request, response);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>HttpRequestHandlerAdapter配置:</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!--他只能适配HttpRequestHandler实现类型的Controller--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">bean</span> <span class="attr">class</span>=<span class="string">"org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"</span>/&gt;</span></span><br></pre></td></tr></table></figure><p>上面两种非注解的处理器适配器能够适配不同类型的Handler(也称作Controller)</p></li></ul><h2 id="使用注解的方式"><a href="#使用注解的方式" class="headerlink" title="使用注解的方式"></a>使用注解的方式</h2><p>在<code>applicationContext.xml</code>中配置:</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;!--使用注解的方式配置Handler以后,需要将处理器映射器和处理器适配器配置为以下的方式--&gt;</span></span><br><span class="line"><span class="comment">&lt;!--配置处理器映射器--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">bean</span> <span class="attr">class</span>=<span class="string">"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"</span>/&gt;</span></span><br><span class="line"><span class="comment">&lt;!--配置处理器适配器--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">bean</span> <span class="attr">class</span>=<span class="string">"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"</span>/&gt;</span></span><br></pre></td></tr></table></figure><p>或者使用:</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">mvc:annotation-driven</span>/&gt;</span></span><br></pre></td></tr></table></figure><p>上面这一句就可以在Spring容器中自动的帮我们注册<code>RequestMappingHandlerMapping</code>和<code>RequestMappingHandlerAdapter</code>.</p><p>编写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></pre></td><td class="code"><pre><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">FirstAnnoController</span> </span>&#123;</span><br><span class="line">    <span class="comment">// 可以放回很多中类型的值,这里选择返回ModelAndView,他将返回的结果交给视图解析器进行解析,然后返回给前端控制器</span></span><br><span class="line">    <span class="meta">@RequestMapping</span>(<span class="string">"/firstanno.action"</span>)</span><br><span class="line">    <span class="function"><span class="keyword">public</span> ModelAndView <span class="title">request1</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        ModelAndView modelAndView = <span class="keyword">new</span> ModelAndView();</span><br><span class="line">        <span class="comment">// 设置模型数据,通过键值对的形式设置,在页面中就像从response中取数据一样取出来</span></span><br><span class="line">        modelAndView.addObject(<span class="string">"msg"</span>, <span class="string">"Hello World!"</span>);</span><br><span class="line">        <span class="comment">// 设置视图,这里设置了一个链接,相当于转发</span></span><br><span class="line">        modelAndView.setViewName(<span class="string">"jsp/helloworld.jsp"</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> modelAndView;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="meta">@RequestMapping</span>(<span class="string">"/secondanno.action"</span>)</span><br><span class="line"><span class="function"><span class="keyword">public</span> String <span class="title">request2</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="comment">// redirect:表示重定向</span></span><br><span class="line">        <span class="keyword">return</span> <span class="string">"redirect:/index.jsp"</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>RequestMappingHandlerMapping</code>能够完成url到该方法的映射.另外,<code>FirstAnnoController</code>中也可以配置多个方法,只要他们的<code>@RequestMapping</code>注解中value不一样就可以,这样一个Controller中可以实现多种功能.</p><p>另外:<code>在applicationContext.xml</code>中开启组件扫描,<code>@Controller</code>就能被自动扫描到并被Spring容器管理</p><p><strong>测试</strong>:在浏览器中输入地址:<code>http://localhost:8080/ssm/firstanno.action</code>就能自动跳转到<code>jsp/helloworld.jsp</code>页面</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Spring-SpringMVC-使用非注解方式和注解方式&quot;&gt;&lt;a href=&quot;#Spring-SpringMVC-使用非注解方式和注解方式&quot; class=&quot;headerlink&quot; title=&quot;Spring:SpringMVC 使用非注解方式和注解方式&quot;&gt;&lt;/a
      
    
    </summary>
    
      <category term="Spring" scheme="https://blueleer.github.io/categories/Spring/"/>
    
    
      <category term="Spring" scheme="https://blueleer.github.io/tags/Spring/"/>
    
      <category term="SpringMVC" scheme="https://blueleer.github.io/tags/SpringMVC/"/>
    
  </entry>
  
  <entry>
    <title>SpringMVC入门(基本配置)</title>
    <link href="https://blueleer.github.io/2017/05/09/SpringMVC%E5%85%A5%E9%97%A8(%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE)/"/>
    <id>https://blueleer.github.io/2017/05/09/SpringMVC入门(基本配置)/</id>
    <published>2017-05-09T08:40:30.000Z</published>
    <updated>2018-06-07T11:17:03.881Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Spring-MVC-框架入门"><a href="#Spring-MVC-框架入门" class="headerlink" title="Spring MVC 框架入门"></a>Spring MVC 框架入门</h1><h2 id="1-1-Spring-MVC介绍"><a href="#1-1-Spring-MVC介绍" class="headerlink" title="1.1 Spring MVC介绍"></a>1.1 Spring MVC介绍</h2><p>SpringMVC和Struts2都属于表现层的框架，它是Spring框架的一个模块，提供web层解决方案，我们可以从Spring的整体结构中看得出来:</p><p><img src="http://od2xrf8gr.bkt.clouddn.com/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202016-11-13%20%E4%B8%8B%E5%8D%887.56.09.png" alt=""></p><h2 id="1-2-MVC在b-s系统的应用"><a href="#1-2-MVC在b-s系统的应用" class="headerlink" title="1.2 MVC在b/s系统的应用"></a>1.2 MVC在b/s系统的应用</h2><p>mvc是一个设计模式，在b/s系统的应用如图:</p><p><img src="http://od2xrf8gr.bkt.clouddn.com/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202016-11-13%20%E4%B8%8B%E5%8D%887.58.00.png" alt=""></p><p>解释如下:</p><ul><li>1.用户发起request请求至控制器(Controller),控制接收用户请求的数据，委托给模型(<strong>Model</strong>)进行处理。</li></ul><ul><li>2.控制器通过模型(Model)处理数据并得到处理结果，模型通常是指业务逻辑(jsp、dao、service)。</li><li>3.模型处理结果返回给控制器。</li><li>4.控制器将模型数据在视图(View)中展示，web中模型无法将数据直接在视图上显示，需要通过控制器完成。如果在C/S应用中模型是可以将数据在视图中展示的。</li><li>5.控制器将视图response响应给用户，通过视图展示给用户要的数据或处理结果。</li></ul><h2 id="1-3-Spring-MVC-架构"><a href="#1-3-Spring-MVC-架构" class="headerlink" title="1.3 Spring MVC 架构"></a>1.3 Spring MVC 架构</h2><h3 id="1-3-1-架构图"><a href="#1-3-1-架构图" class="headerlink" title="1.3.1 架构图"></a>1.3.1 架构图</h3><p><img src="http://od2xrf8gr.bkt.clouddn.com/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202016-11-13%20%E4%B8%8B%E5%8D%888.04.54.png" alt=""></p><h3 id="1-3-2-架构流程"><a href="#1-3-2-架构流程" class="headerlink" title="1.3.2 架构流程"></a>1.3.2 架构流程</h3><ul><li><ol><li>用户发送请求至前端控制器<code>DispatcherServlet</code></li></ol></li><li><ol start="2"><li><code>DispatcherServlet</code>收到请求调用<code>HandlerMapping</code>处理器映射器。</li></ol></li><li><ol start="3"><li>处理器映射器根据请求<code>url</code>找到具体的处理器，生成处理器对象及处理器拦截器(如果有则生成)一并返回给<code>DispatcherServlet</code>。</li></ol></li><li><ol start="4"><li><code>DispatcherServlet</code>通过<code>HandlerAdapter</code>处理器适配器调用处理器</li></ol></li><li><ol start="5"><li>执行处理器(Controller，也叫后端控制器)。</li></ol></li><li><ol start="6"><li><code>Controller</code>执行完成返回<code>ModelAndView</code></li></ol></li><li><ol start="7"><li><code>HandlerAdapter</code>将<code>controller</code>执行结果<code>ModelAndView</code>返回</li></ol></li><li><ol start="8"><li><code>DispatcherServlet</code>将<code>ModelAndView</code>传给<code>ViewReslover视图解析器</code></li></ol></li><li><ol start="9"><li><code>ViewReslover</code>解析后返回具体View</li></ol></li><li><ol start="10"><li><code>DispatcherServlet</code>对<code>View</code>进行渲染视图（即将模型数据填充至视图中）。</li></ol></li><li><ol start="11"><li><code>DispatcherServlet</code>响应用户</li></ol></li></ul><h3 id="1-3-3架构中涉及的组件说明"><a href="#1-3-3架构中涉及的组件说明" class="headerlink" title="1.3.3架构中涉及的组件说明"></a>1.3.3架构中涉及的组件说明</h3><ul><li><ol><li><strong>DispatcherServlet</strong>：前端控制器。用户请求到达前端控制器，它就相当于mvc模式中的c，dispatcherServlet是整个流程控制的中心，由它调用其它组件处理用户的请求，dispatcherServlet的存在降低了组件之间的耦合性。由框架实现</li></ol></li><li><ol start="2"><li><strong>HandlerMapping</strong>：处理器映射器。HandlerMapping负责根据用户请求找到Handler即处理器，springmvc提供了不同的映射器实现不同的映射方式，例如：配置文件方式，实现接口方式，注解方式等。由框架实现</li></ol></li><li><ol start="3"><li><strong>Handler</strong>：处理器。Handler 是继DispatcherServlet前端控制器的后端控制器，在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求，所以一般情况需要程序员根据业务需求开发Handler。</li></ol></li><li><ol start="4"><li><strong>HandlAdapter</strong>：处理器适配器。通过HandlerAdapter对处理器进行执行，这是适配器模式的应用，通过扩展适配器可以对更多类型的处理器进行执行。由框架实现。</li></ol></li><li><ol start="5"><li><strong>ViewResolver</strong>：视图解析器。ViewResolver负责将处理结果生成View视图，ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址，再生成View视图对象，最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型，包括：jstlView、freemarkerView、pdfView等。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户，需要由程序员根据业务需求开发具体的页面。</li></ol></li></ul><h2 id="1-4-入门程序-使用maven构建"><a href="#1-4-入门程序-使用maven构建" class="headerlink" title="1.4 入门程序(使用maven构建)"></a>1.4 入门程序(使用maven构建)</h2><p>需求 : 请求一个简单的静态页面</p><p>导入相关的jar包,<code>Spring</code>版本<code>4.3.16.RELEASE</code></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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">dependencies</span>&gt;</span></span><br><span class="line">        <span class="comment">&lt;!-- Junit依赖 --&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>junit<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<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>4.12<span class="tag">&lt;/<span class="name">version</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>log4j<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>log4j<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.2.17<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="comment">&lt;!-- 导入java ee jar 包 --&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>javax<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>javaee-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>7.0<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="comment">&lt;!--=================================================================--&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--Spring核心依赖--&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<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-core<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>$&#123;spring.version&#125;<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.springframework<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-beans<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>$&#123;spring.version&#125;<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.springframework<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-context<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>$&#123;spring.version&#125;<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="comment">&lt;!--测试模块,能使用SpringJUnit4ClassRunner快速的实现单元测试--&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<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-test<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>$&#123;spring.version&#125;<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="comment">&lt;!--如果要整合mybatis,要加入orm和tx模块,并且mybatis的版本和mybatis-spring版本也要匹配--&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<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-orm<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>$&#123;spring.version&#125;<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="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<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-tx<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>$&#123;spring.version&#125;<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="comment">&lt;!--web模块必须的包--&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<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-web<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>$&#123;spring.version&#125;<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="comment">&lt;!--SpringMVC模块--&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<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-webmvc<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>$&#123;spring.version&#125;<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></pre></td></tr></table></figure><h3 id="1-4-1-前端控制器配置-web-xml"><a href="#1-4-1-前端控制器配置-web-xml" class="headerlink" title="1.4.1 前端控制器配置(web.xml)"></a>1.4.1 前端控制器配置(web.xml)</h3><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></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">servlet</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">servlet-name</span>&gt;</span>springmvc<span class="tag">&lt;/<span class="name">servlet-name</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">servlet-class</span>&gt;</span>org.springframework.web.servlet.DispatcherServlet<span class="tag">&lt;/<span class="name">servlet-class</span>&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--加载springmvc配置文件--&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">init-param</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">param-name</span>&gt;</span>contextConfigLocation<span class="tag">&lt;/<span class="name">param-name</span>&gt;</span></span><br><span class="line">            <span class="comment">&lt;!--配置文件的地址</span></span><br><span class="line"><span class="comment">            如果不配置contextConfigLocation，默认查找的配置文件名称是classpath下的:servlet名称+"-servlet.xml"</span></span><br><span class="line"><span class="comment">            即springmvc-servlet.xml--&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">param-value</span>&gt;</span>classpath:spring/applicationContext.xml<span class="tag">&lt;/<span class="name">param-value</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">init-param</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">servlet</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">servlet-mapping</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">servlet-name</span>&gt;</span>springmvc<span class="tag">&lt;/<span class="name">servlet-name</span>&gt;</span></span><br><span class="line">        </span><br><span class="line">        <span class="comment">&lt;!--可以配置"/"此工程所有的请求全部由springmvc解析，此种方式可以实现RESTful方式，</span></span><br><span class="line"><span class="comment">        需要特殊处理对静态文件的解析不能由springmvc解析;</span></span><br><span class="line"><span class="comment">        可以配置*.do或者*.action,所有请求的url扩展名为.do或.action由springmvc解析，此中方法常用;</span></span><br><span class="line"><span class="comment">        不可以配置"/*",如果配置/*,返回jsp也由springmvc解析，这是不对的--&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">url-pattern</span>&gt;</span>*.action<span class="tag">&lt;/<span class="name">url-pattern</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">servlet-mapping</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="1-4-2-配置SpringMVC三大组件-–处理器映射器、处理器适配器、视图解析器"><a href="#1-4-2-配置SpringMVC三大组件-–处理器映射器、处理器适配器、视图解析器" class="headerlink" title="1.4.2 配置SpringMVC三大组件 –处理器映射器、处理器适配器、视图解析器"></a>1.4.2 配置SpringMVC三大组件 –处理器映射器、处理器适配器、视图解析器</h3><p>简介：</p><ul><li>处理器映射器：根据前端传来的<strong>url</strong>匹配正确的处理器，并返回给前端控制器</li><li>处理器适配器：能够调用不同类别的处理器来执行任务</li><li>视图解析器：视图解析</li></ul><h4 id="1-4-2-1-处理器映射器"><a href="#1-4-2-1-处理器映射器" class="headerlink" title="1.4.2.1 处理器映射器"></a>1.4.2.1 处理器映射器</h4><p>对于用户发起的request请求，前端控制器首先会请求HandlerMapping处理器映射器来查找Handler</p><p>在<code>applicationContext.xml</code>配置文件中:</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></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!--配置处理器映射器--&gt;</span></span><br><span class="line"><span class="comment">&lt;!--根据url查找对应id值的Handler--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">bean</span> <span class="attr">class</span>=<span class="string">"org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"</span>/&gt;</span></span><br></pre></td></tr></table></figure><h4 id="1-4-2-2-处理器适配器"><a href="#1-4-2-2-处理器适配器" class="headerlink" title="1.4.2.2 处理器适配器"></a>1.4.2.2 处理器适配器</h4><p>处理器适配器有不同类型的,他们可以去调用不同类别的Handler来完成任务,如下方的,让Handler去实现Controller接口,这样,SimpleControllerHandlerAdapter会调用这个类别的处理器去执行任务</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></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!--配置处理器适配器--&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--他只能适配Controller的实现类型的Controller--&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">bean</span> <span class="attr">class</span>=<span class="string">"org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"</span>/&gt;</span></span><br></pre></td></tr></table></figure><h4 id="1-4-2-3-视图解析器"><a href="#1-4-2-3-视图解析器" class="headerlink" title="1.4.2.3 视图解析器"></a>1.4.2.3 视图解析器</h4><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</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">bean</span> <span class="attr">class</span>=<span class="string">"org.springframework.web.servlet.view.InternalResourceViewResolver"</span>/&gt;</span></span><br></pre></td></tr></table></figure><h4 id="1-4-2-4-处理器编写与配置"><a href="#1-4-2-4-处理器编写与配置" class="headerlink" title="1.4.2.4 处理器编写与配置"></a>1.4.2.4 处理器编写与配置</h4><p>处理器是根据你的业务需求需要我们自己来编写的,你可以选择实现不同类型的处理器,他们做了不同程度的封装.</p><p>这里我们实现Controller接口,这样他就能被SimpleControllerHandlerAdapter适配器适配,同时又能根据它的name值被BeanNameUrlHandlerMapping映射器找到,从而将相应的请求传入对应的Handler中</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">UserController</span> <span class="keyword">implements</span> <span class="title">Controller</span> </span>&#123;</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> ModelAndView <span class="title">handleRequest</span><span class="params">(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">        ModelAndView modelAndView = <span class="keyword">new</span> ModelAndView();</span><br><span class="line">        <span class="comment">// 设置模型数据,通过键值对的形式设置,在页面中就像从response中取数据一样取出来</span></span><br><span class="line">        modelAndView.addObject(<span class="string">"msg"</span>, <span class="string">"Hello World!"</span>);</span><br><span class="line">        <span class="comment">// 设置视图,这里设置了一个链接,相当于转发</span></span><br><span class="line">        modelAndView.setViewName(<span class="string">"jsp/helloworld.jsp"</span>);</span><br><span class="line">        <span class="keyword">return</span> modelAndView;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>处理器也作为一个组件,需要在<code>applicationContext.xml</code>进行配置</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></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!--配置我们自定义的Handler(处理器)--&gt;</span></span><br><span class="line"><span class="comment">&lt;!--它会被BeanNameUrlHandlerMapping类型的处理器映射器映射匹配,根据它的name值--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">bean</span> <span class="attr">name</span>=<span class="string">"/helloworld.action"</span> <span class="attr">class</span>=<span class="string">"com.lee.ssm.controller.UserController"</span>/&gt;</span></span><br></pre></td></tr></table></figure><p>至此配置完毕,当在浏览器的地址栏中输入:<code>http://localhost:8080/ssm/helloworld.action</code>的时候,最终会显示<code>jsp/helloworld.jsp</code>页面中的内容(在我们的处理器UserController中设置了<code>modelAndView.setViewName(&quot;jsp/helloworld.jsp&quot;);</code>)</p><p>流程是这样的:</p><ol><li><code>http://localhost:8080/ssm/helloworld.action</code> </li><li>处理器映射器查找name名称为<code>helloworld.action</code>的处理器,并且返回给前端控制器,也就是返回了<code>UserController</code> </li><li>前端控制器将<code>UserController</code>交给处理器适配器</li><li>处理器适配器判断UserController的类型,看自己能不能调用执行(我们配置的处理器适配器有SimpleControllerHandlerAdapter,所以他能执行,SimpleControllerHandlerAdapter是专门执行调用Controller接口实现类型的Controller)</li><li>处理器适配器执行Handler</li><li>Handler返回ModelAndView给前端控制器</li><li>前端控制器调用InternalResourceViewResolver视图解析器进行解析,并将解析后的view返回给前端控制器</li><li>前端控制器渲染视图,响应给客户端(浏览器)</li></ol><p>在上面的配置过程中我们分别配置了<code>处理器映射器</code>,<code>处理器适配器</code>,<code>视图解析器</code>,当我们把这三个注释掉,他依然能够完成请求的响应,也就是说,依然能能够完成请求的映射执行,这是为什么呢?</p><p>对于前端控制器DispatcherServlet,我有必要多说几句，在spring-webmvc.jar包中有一个DispatcherServlet.properties文件，内容如下:</p><p><img src="http://od2xrf8gr.bkt.clouddn.com/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202016-11-14%20%E4%B8%8B%E5%8D%886.51.45.png" alt=""></p><p>里面包含一些默认的组件例如处理器映射器、处理器适配器等，当程序启动时，DispatcherServlet会自动加载DispatcherServlet.properties配置文件，从而默认加载各个组件，所以如果我们在springmvc.xml中配置了处理器映射器和处理器适配器，那程序就以springmvc.xml中的配置信息为主。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Spring-MVC-框架入门&quot;&gt;&lt;a href=&quot;#Spring-MVC-框架入门&quot; class=&quot;headerlink&quot; title=&quot;Spring MVC 框架入门&quot;&gt;&lt;/a&gt;Spring MVC 框架入门&lt;/h1&gt;&lt;h2 id=&quot;1-1-Spring-MV
      
    
    </summary>
    
      <category term="Spring" scheme="https://blueleer.github.io/categories/Spring/"/>
    
    
      <category term="Spring" scheme="https://blueleer.github.io/tags/Spring/"/>
    
      <category term="SpringMVC" scheme="https://blueleer.github.io/tags/SpringMVC/"/>
    
  </entry>
  
  <entry>
    <title>SSH项目搭建记录(基于Maven)</title>
    <link href="https://blueleer.github.io/2017/04/26/SSH%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA%E8%AE%B0%E5%BD%95/"/>
    <id>https://blueleer.github.io/2017/04/26/SSH项目搭建记录/</id>
    <published>2017-04-26T03:57:42.000Z</published>
    <updated>2018-04-26T16:05:21.159Z</updated>
    
    <content type="html"><![CDATA[<h1 id="框架版本选择"><a href="#框架版本选择" class="headerlink" title="框架版本选择"></a>框架版本选择</h1><ul><li>spring:<code>4.3.16</code></li><li>struts2:<code>2.5.16</code></li><li>hibernate:<code>5.2.16</code></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;框架版本选择&quot;&gt;&lt;a href=&quot;#框架版本选择&quot; class=&quot;headerlink&quot; title=&quot;框架版本选择&quot;&gt;&lt;/a&gt;框架版本选择&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;spring:&lt;code&gt;4.3.16&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;struts2:&lt;cod
      
    
    </summary>
    
    
      <category term="学习日记" scheme="https://blueleer.github.io/tags/%E5%AD%A6%E4%B9%A0%E6%97%A5%E8%AE%B0/"/>
    
      <category term="Hibernate" scheme="https://blueleer.github.io/tags/Hibernate/"/>
    
      <category term="Struts2" scheme="https://blueleer.github.io/tags/Struts2/"/>
    
      <category term="Spring" scheme="https://blueleer.github.io/tags/Spring/"/>
    
  </entry>
  
  <entry>
    <title>《Spring实战》（第四版）读书笔记</title>
    <link href="https://blueleer.github.io/2017/04/21/%E3%80%8ASpring%E5%AE%9E%E6%88%98%E3%80%8B%EF%BC%88%E7%AC%AC%E5%9B%9B%E7%89%88%EF%BC%89%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    <id>https://blueleer.github.io/2017/04/21/《Spring实战》（第四版）读书笔记/</id>
    <published>2017-04-21T06:42:36.000Z</published>
    <updated>2018-06-07T11:17:13.963Z</updated>
    
    <content type="html"><![CDATA[<h1 id="第1章-Spring之旅"><a href="#第1章-Spring之旅" class="headerlink" title="第1章 Spring之旅"></a>第1章 Spring之旅</h1><p><strong>两大核心</strong></p><ul><li>依赖注入(Dependency injection,DI)</li><li>面向切面编程(aspect-oriented-programming,AOP)</li></ul><p><strong>发展历程:</strong></p><ul><li>创建Spring的主要目的是用来<strong>替代更加重量级的企业级Java技术</strong>，尤其是EJB。相对于EJB说,Spring提供了更加轻量级和简单的编程模型。它<strong>增强了简单老式Java对象</strong>（Plain Old Java object，POJO）的功能，使<strong>其具备了之前只有EJB和其他企业级Java规范才具有的功能</strong>。</li><li>随着时间的推移，EJB以及Java 2企业版（Java 2 Enterprise Edition，J2EE）在不断演化。EJB自身也提供了面向简单POJO的编程模型。现在，EJB也采用了依赖注入（Dependency Injection，DI）和面向切面编程（Aspect-Oriented Programming，AOP）的理念，这毫无疑问是受到Spring成功的启发。</li><li>尽管J2EE（现在称之为JEE）能够赶上Spring的步伐，但Spring也没有停止前进。Spring继续在其他领域发展，而JEE则刚刚开始涉及这些领域，或者还完全没有开始在这些领域的创新。移动开发、社交API集成、NoSQL数据库、云计算以及大数据都是Spring正在涉足和创新的领域。Spring的前景依然会很美好。</li></ul><h2 id="1-1-简化Java开发"><a href="#1-1-简化Java开发" class="headerlink" title="1.1 简化Java开发"></a>1.1 简化Java开发</h2><p>为了降低Java开发的复杂性,Spring采取了下面四种关键性策略</p><ul><li>基于POJO的轻量级和最小侵入性编程；</li><li>通过依赖注入和面向接口实现松耦合；</li><li>基于切面和惯例进行声明式编程；</li><li>通过切面和模板减少样板式代码。</li></ul><blockquote><p>POJO:plain old java object,简单老实Java对象。使用POJO名称是为了避免和<a href="https://baike.baidu.com/item/EJB" target="_blank" rel="noopener">EJB</a>混淆起来, 而且简称比较直接. 其中<strong>有一些属性及其getter setter方法的类,没有业务逻辑</strong>，有时可以作为<a href="https://baike.baidu.com/item/VO" target="_blank" rel="noopener">VO</a>(value -object)或<a href="https://baike.baidu.com/item/dto" target="_blank" rel="noopener">dto</a>(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。</p></blockquote><h3 id="1-1-1-基于POJO的轻量级和最小侵入性编程"><a href="#1-1-1-基于POJO的轻量级和最小侵入性编程" class="headerlink" title="1.1.1 基于POJO的轻量级和最小侵入性编程"></a>1.1.1 基于POJO的轻量级和最小侵入性编程</h3><p><strong>侵入式框架</strong>：框架通过强迫应用继承它们的类或实现它们的接口从而导致应用与框架绑死。例如：struts框架。</p><p><strong>非侵入式框架</strong>：不会强迫的让你继承框架提供的类或者接口，你一样可以使用，简而言之，拿来即用，不用去修改你原来的代码。例如：Hibernate框架，Spring框架等等。</p><h3 id="1-1-2-通过依赖注入和面向接口实现松耦合"><a href="#1-1-2-通过依赖注入和面向接口实现松耦合" class="headerlink" title="1.1.2 通过依赖注入和面向接口实现松耦合"></a>1.1.2 通过依赖注入和面向接口实现松耦合</h3><p>Spring通过应用上下文（Application Context）装载bean的定义并把它们组装起来。Spring应用上下文全权负责对象的创建和组装。Spring自带了多种应用上下文的实现，它们之间主要的区别仅仅在于如何加载配置。</p><h3 id="1-1-3-基于切面和惯例进行声明式编程（应用切面）"><a href="#1-1-3-基于切面和惯例进行声明式编程（应用切面）" class="headerlink" title="1.1.3 基于切面和惯例进行声明式编程（应用切面）"></a>1.1.3 基于切面和惯例进行声明式编程（应用切面）</h3><p><strong>面向切面编程（aspect-oriented programming，AOP）允许你把遍布应用各处的功能分离出来形成可重用的组件。</strong></p><p>面向切面编程往往被定义为促使软件系统实现关注点的分离一项技术。<strong>系统由许多不同的组件组成，每一个组件各负责一块特定功能。除了实现自身核心的功能之外，这些组件还经常承担着额外的职责。诸如日志、事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑的组件中去，这些系统服务通常被称为横切关注点，因为它</strong><br><strong>们会跨越系统的多个组件。</strong></p><p><strong>横切关注点 ：这些系统服务通常被称为横切关注点，因为他们会跨越系统的多个组件</strong></p><p><strong>如果将这些关注点分散到多个组件中去，你的代码将会带来双重的复杂性。</strong></p><ul><li>实现系统关注点功能的代码将会重复出现在多个组件中。这意味着如果你要改变这些关注点的逻辑，必须修改各个模块中的相关实现。即使你把这些关注点抽象为一个独立的模块，其他模块只是调用它的方法，但方法的调用还是会重复出现在各个模块中。组件会因为那些与自身核心业务无关的代码而变得混乱。一个向地址簿增加地址条目的方法应该只关注如何添加地址，而不应该关注它是不是安全的或者是否需要支持事务。</li></ul><p><strong>使用AOP的好处：</strong></p><p>借助AOP，可以使用各种功能层去包裹核心业务层。这些层以声明的方式灵活地应用到系统中，你的核心应用甚至根本不知道它们的存在。这是一个非常强大的理念，可以将安全、事务和日志关注点与核心业务逻辑相分离。</p><h3 id="1-1-4-使用模板消除样板式代码"><a href="#1-1-4-使用模板消除样板式代码" class="headerlink" title="1.1.4 使用模板消除样板式代码"></a>1.1.4 使用模板消除样板式代码</h3><p>Spring旨在通过模板封装来消除样板式代码。例如：<code>Spring</code>的<code>JdbcTemplate</code>使得执行数据库操作时，避免传统的JDBC样板代码成为了可能。（例如：在使用JDBC操作数据库的时候，需要关闭数据库连接，关闭Statement，关闭ResultSet等等这些都是重复性的代码，使用模板将这些重复性的代码封装到了模板中）</p><h2 id="1-2-Spring容器"><a href="#1-2-Spring容器" class="headerlink" title="1.2 Spring容器"></a>1.2 Spring容器</h2><p>简单来说就是装JavaBean的容器，统一管理，按需装配（使用依赖注入的方式）。</p><p><strong>它是Spring框架的核心。</strong>Spring容器使用DI管理构成应用的组件，它会创建相互协作的组件之间的关联。毫无疑问，这些对象更简单干净，更易于理解，更易于重用并且更易于进行单元测试。</p><p>Spring容器分为两种类型：</p><ul><li><strong>Bean工厂</strong> 实现<code>org.springframework. beans.factory.BeanFactory</code>接口，是最简单的容器，提供基本的DI支持.</li><li><strong>应用上下文</strong> <strong>(ApplicationContext)</strong> 实现<code>org.springframework.context.ApplicationContext</code>接口,它是基于Bean工厂实现的,并提供应用框架级别的服务，例如从属性文件解析文本信息以及发布应用事件给感兴趣的事件监听者。</li></ul><p>Bean工厂功能态单一,所以大多数选用<code>ApplicationContext</code></p><h3 id="1-2-1-使用应用上下文"><a href="#1-2-1-使用应用上下文" class="headerlink" title="1.2.1 使用应用上下文"></a>1.2.1 使用应用上下文</h3><p>常用的应用上下文:</p><ul><li><strong>AnnotationConfigApplicationContext</strong>：从一个或多个基于Java的配置类中加载Spring应用上下文。</li></ul><ul><li><strong>AnnotationConfigWebApplicationContext</strong>：从一个或多个基于Java的配置类中加载Spring Web应用上下文。</li></ul><ul><li><strong>ClassPathXmlApplicationContext</strong>：从类路径下的一个或多个XML配置文件中加载上下文定义，把应用上下文的定义文件作为类资源。</li></ul><ul><li><strong>FileSystemXmlapplicationcontext</strong>：从文件系统下的一个或多个XML配置文件中加载上下文定义。</li><li><strong>XmlWebApplicationContext</strong>：从Web应用下的一个或多个XML配置文件中加载上下文定义。</li></ul><p>使用<code>FileSystemXmlApplicationContext</code>和使用<code>ClassPathXmlApp-licationContext</code>的区别在于：<code>FileSystemXmlApplicationContext</code>在指定的文件系统路径下查找<code>bean.xml</code>文件；而<code>ClassPathXmlApplicationContext</code>是在所有的类路径（包含JAR文件）下查找 <code>bean.xml</code>文件。</p><p>这里需要注意的是:使用 “classpath*:”和”classpath:”的区别</p><h3 id="1-2-2-Bean的生命周期"><a href="#1-2-2-Bean的生命周期" class="headerlink" title="1.2.2 Bean的生命周期"></a>1.2.2 Bean的生命周期</h3><p><img src="E:\github\MyBlog\source\_posts\《Spring实战》（第四版）读书笔记\Bean的生命周期.png" alt=""></p><ul><li>1．Spring对bean进行实例化；</li><li>2．Spring将值和bean的引用注入到bean对应的属性中；</li><li>3．如果bean实现了BeanNameAware接口，Spring将bean的ID传递给setBean-Name()方法；</li></ul><ul><li>4．如果bean实现了BeanFactoryAware接口，Spring将调用setBeanFactory()方法，将BeanFactory容器实例传入；</li></ul><ul><li>5．如果bean实现了ApplicationContextAware接口，Spring将调用setApplicationContext()方法，将bean所在的应用上下文的引用传入进来；</li></ul><ul><li>6．如果bean实现了BeanPostProcessor接口，Spring将调用它们的post-ProcessBeforeInitialization()方法；</li></ul><ul><li>7．如果bean实现了InitializingBean接口，Spring将调用它们的after-PropertiesSet()方法。类似地，如果bean使用initmethod声明了初始化方法，该方法也会被调用；</li></ul><ul><li>8．如果bean实现了BeanPostProcessor接口，Spring将调用它们的post-ProcessAfterInitialization()方法；</li></ul><ul><li>9．此时，bean已经准备就绪，可以被应用程序使用了，它们将一直驻留在应用上下文中，直到该应用上下文被销毁；</li></ul><ul><li>10．如果bean实现了DisposableBean接口，Spring将调用它的destroy()接口方法。同样，如果bean使用destroy-method声明了销毁方法，该方法也会被调用。</li></ul><h2 id="1-3-Spring模块"><a href="#1-3-Spring模块" class="headerlink" title="1.3 Spring模块"></a>1.3 Spring模块</h2><h2 id="1-4-Spring新方向"><a href="#1-4-Spring新方向" class="headerlink" title="1.4 Spring新方向"></a>1.4 Spring新方向</h2><ul><li><strong>Spring Boot</strong></li></ul><h2 id="1-5-小节"><a href="#1-5-小节" class="headerlink" title="1.5 小节"></a>1.5 小节</h2><ul><li><p>Spring致力于简化开发,方便维护,其核心是<strong>依赖注入</strong>和<strong>面向切面编程</strong></p></li><li><p>依赖注入,也叫作控制反转。正常情况下类中需要用到的组件都是需要使用自己去new，相当于控制正转。但是它的耦合性太高，不利于维护和测试。而控制反转是我们需要什么组件外界使用我们的时候自己传进来，例如可以通过set方法或者构造器传入。这样，依赖的对象可以有使用者自己去扩展，实现了松耦合。而依赖注入正是控制反转的一种实现。另一方面，使用Spring的依赖注入核心功能使得对象的管理更加清晰。</p></li><li><p>面向切面编程（AOP），是将散落的逻辑，例如日志（在Spring中称作关注点），事务等等，这些功能也不得不使用，将这些逻辑汇聚在一起，形成一个面，也就是一个独立的模块，这样讲这些与核心业务逻辑类分离。一方面能够减少业务逻辑类中的代码量，使其专注自己的逻辑。</p><blockquote><p>AOP可以帮助应用将散落在各处的逻辑汇集于一处——切面。当Spring装配bean的时候，这些切面能够在运行期编织起来，这样就能非常有效地赋予bean新的行为。</p></blockquote></li></ul><h1 id="第2章-装配Bean（Bean的配置与获取）"><a href="#第2章-装配Bean（Bean的配置与获取）" class="headerlink" title="第2章 装配Bean（Bean的配置与获取）"></a>第2章 装配Bean（Bean的配置与获取）</h1><blockquote><p>在Spring中，对象无需自己查找或创建与其所关联的其他对象。相反，容器负责把需要相互协作的对象引用赋予各个对象。例如，一个订单管理组件需要信用卡认证组件，但它不需要自己创建信用卡认证组件。订单管理组件只需要表明自己两手空空，容器就会主动赋予它一个信用卡认证组件。</p></blockquote><blockquote><p><strong>创建应用对象之间协作关系的行为通常称为装配（wiring），这也是依赖注入（DI）的本质</strong>。</p></blockquote><h2 id="2-1-Spring容器的配置方式"><a href="#2-1-Spring容器的配置方式" class="headerlink" title="2.1 Spring容器的配置方式"></a>2.1 Spring容器的配置方式</h2><ul><li>在XML中进行显式配置。</li><li>在Java中进行显式配置。</li><li>隐式的bean发现机制和自动装配。</li></ul><p>关于三种配置方式的选择问题:</p><blockquote><p>选择自己喜欢的或者项目适合的配置方式。</p><p>搭配配置也是可以的</p><p>我的建议是尽可能地使用<strong>自动配置的机制</strong>。<strong>显式配置越少越好</strong>。当你必须要显式配置bean的时候（比如，有些源码不是由你来维护的，而当你需要为这些代码配置bean的时候），我推荐使用<strong>类型安全并且比XML更加强大的JavaConfig</strong>。最后，只有当你想要使用便利的XML命名空间，并且在JavaConfig中没有同样的实现时，才应该使用XML。</p></blockquote><p>未完待续…</p><h1 id="第4章-面向切面的Spring-Spring中的AOP"><a href="#第4章-面向切面的Spring-Spring中的AOP" class="headerlink" title="第4章  面向切面的Spring(Spring中的AOP)"></a>第4章  面向切面的Spring(Spring中的AOP)</h1><blockquote><p>软件系统中的一些功能就像我们家里的电表一样。这些功能需要用到应用程序的多个地方，但是我们又不想在每个点都明确调用它们。日志、安全和事务管理的确都很重要，但它们是否为应用对象主动参与的行为呢？<strong>如果让应用对象只关注于自己所针对的业务领域问题，而其他方面的问题由其他应用对象来处理，这会不会更好呢？</strong></p><p><strong>在软件开发中，散布于应用中多处的功能被称为横切关注点</strong>（crosscuttingconcern）。通常来讲，这些<strong>横切关注点从概念上是与应用的业务逻辑相分离的（但是往往会直接嵌入到应用的业务逻辑之中）。把这些横切关注点与业务逻辑相分离正是面向切面编程（AOP）所要解决的问题。</strong></p></blockquote><p>理解：各司其职，例如日志功能呢，虽然我们希望日志系统能够很好的帮我们记日志，但是日志系统的主要工作范畴。他就像财务，是替我们记账的。横切关注点串联起来，可以形成一个完整的面，该面相当于一个分布于应用中的微型系统。例如，日志，错误处理，事务管理等等。</p><blockquote><p><strong>DI有助于应用对象之间的解耦，而AOP可以实现横切关注点与它们所影响的对象之间的解耦。</strong></p></blockquote><h2 id="4-1-什么是面向切面编程"><a href="#4-1-什么是面向切面编程" class="headerlink" title="4.1 什么是面向切面编程"></a>4.1 什么是面向切面编程</h2><p><strong>Spring切面的实现原理</strong></p><blockquote><p>切面提供了取代继承和委托的另一种可选方案，而且在很多场景下更清晰简洁。<strong>在使用面向切面编程时，我们仍然在一个地方定义通用功能，但是可以通过声明的方式定义这个功能要以何种方式在何处应用，而无需修改受影响的类。**</strong>横切关注点可以被模块化为特殊的类，这些类被称为切面（aspect）<strong>。</strong></p><p><strong>这样做有两个好处：首先，现在每个关注点都集中于一个地方，而不是分散到多处代码中；其次，服务模块更简洁，因为它们只包含主要关注点（或核心功能）的代码，而次要关注点的代码被转移到切面中了。</strong></p></blockquote><h3 id="4-1-1-AOP相关术语"><a href="#4-1-1-AOP相关术语" class="headerlink" title="4.1.1 AOP相关术语"></a>4.1.1 AOP相关术语</h3><ul><li><p><strong>通知（Advice）–也叫增强</strong></p><blockquote><p>通知定义了切面是什么以及何时使用。除了描述切面要完成的工作，通知还解决了何时执行这个工作的问题。它应该应用在某个方法被调用之前？之后？之前和之后都调用？还是只在方法抛出异常时调用？</p></blockquote><p>Spring切面可以应用5种类型的通知：</p><ul><li><strong>前置通知</strong>（Before）：在目标方法被调用之前调用通知功能；</li><li><strong>后置通知</strong>（After）：在目标方法完成之后调用通知，此时不会关心方法的输出是什么；</li></ul></li><li><p><strong>连接点（Join point）</strong></p><blockquote><p>我们的应用可能也有数以千计的时机应用通知。这些时机被称为连接点。连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中，并添加新的行为。</p></blockquote><p>简单理解就是:所有可以被增强的方法</p><p>​</p></li><li><p><strong>切点（Poincut）</strong></p><blockquote><p>如果说通知定义了切面的“什么”和“何时”的话，那么切点就定义了“何处”。切点的定义会匹配通知所要织入的一个或多个连接点。我们通常使用明确的类和方法名称，或是利用正则表达式定义所匹配的类和方法名称来指定这些切点。有些AOP框架允许我们创建动态的切点，可以根据运行时的决策（比如方法的参数值）来决定是否应用通知。</p></blockquote><p>简单理解:可以被增强的方法有很多个,但是并不是所有的方法都需要被增强,从连接点中选取一部分必要的方法来增强.切点是连接点的子集。</p></li><li><p><strong>切面（Aspect）</strong></p><blockquote><p>切面是通知和切点的结合。通知和切点共同定义了切面的全部内容——它是什么，在何时和何处完成其功能。</p></blockquote><p>简单理解：切面就是通知（增强）和切点编织在一起。他知道在哪里应用增强以及增强的内容。例如：在管理员往数据库中插入一条记录的时候就将插入记录的相关细节记录到日志中去。</p></li><li><p><strong>引入（Introduction）</strong></p><blockquote><p>引入允许我们向现有的类添加新方法或属性。例如，我们可以创建一个Auditable通知类，该类记录了对象最后一次修改时的状态。这很简单，只需一个方法，setLastModified(Date)，和一个实例变量来保存这个状态。然后，这个新方法和实例变量就可以被引入到现有的类中，从而可以在无需修改这些现有的类的情况下，让它们具有新的行为和状态。</p></blockquote></li><li><p><strong>织入（Weaving）</strong></p><blockquote><p>织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入：</p><ul><li>编译期：切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。</li><li>类加载期：切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器（ClassLoader），它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ 5的加载时织入（load-timeweaving，LTW）就支持以这种方式织入切面。</li><li>运行期：切面在应用运行的某个时刻被织入。一般情况下，在织入切面时，AOP容器会为目标对象动态地创建一个代理对象。<strong>Spring AOP就是以这种方式织入切面的。</strong></li></ul></blockquote><p>简单理解：创建切面的过程</p></li></ul><h3 id="4-1-2-Spring对AOP的支持"><a href="#4-1-2-Spring对AOP的支持" class="headerlink" title="4.1.2 Spring对AOP的支持"></a>4.1.2 Spring对AOP的支持</h3><p><strong>Spring提供了4种类型的AOP支持：</strong></p><ul><li>基于代理的经典Spring AOP；</li><li>纯POJO切面；</li><li>@AspectJ注解驱动的切面；</li><li>注入式AspectJ切面（适用于Spring各版本）。</li></ul><p><strong>前三种都是Spring AOP实现的变体</strong>，Spring AOP构建在动态代理基础之上，因此，Spring对AOP的支持局限于方法拦截。</p><p>Spring中AOP的特点:</p><ul><li><p>Spring在运行时,也就是说当真正的需要被代理的对象时,才创建代理对象.即运行时织入.</p></li><li><p>Spring只支持方法级别的连接点.不支持字段和构造器接入点.</p><blockquote><p>但是方法拦截可以满足绝大部分的需求。如果需要方法拦截之外的连接点拦截功能，那么我们可以利用Aspect来补充Spring AOP的功能。</p></blockquote></li></ul><blockquote><p><strong>在Spring AOP中，要使用AspectJ的切点表达式语言来定义切点。</strong></p></blockquote><blockquote><p><strong>关于Spring AOP的AspectJ切点，最重要的一点就是Spring仅支持AspectJ切点指示器（pointcut designator）的一个子集</strong></p></blockquote><h2 id="4-2-编写切点"><a href="#4-2-编写切点" class="headerlink" title="4.2 编写切点"></a>4.2 编写切点</h2><p>例如: <code>execution(* com.lee.aop.LeeDao.*(..))</code></p><p>说明: </p><ul><li>第一个*代表返回任意类型</li><li>第二个*代表匹配LeeDao类中的所有的方法</li><li>(..)代表任意的参数</li></ul><p>除了execution之外还有以下这些<code>AspectJ指示器</code></p><ul><li><p><code>arg()</code> 限制连接点匹配参数为指定类型的执行方法</p></li><li><p><code>@args()</code>限制连接点匹配参数由指定注解标注的执行方法</p><p>例如: <code>execution(* com.lee.aop.LeeDao.findById(int)) &amp;&amp; args(num)</code>表示当调用findById的时候传入的参数同时会传入到通知方法中去,此时通知方法可以在方法参数列表中指定一个参数用来接收这个参数,必须要保证通知方法参数列表中的参数名称和<code>num</code>名称一致</p></li><li><p><code>execution()</code> 用于匹配是连接点的执行方法</p></li><li><p><code>this()</code>限制连接点匹配AOP代理的bean引用为指定类型的类</p></li><li><p><code>target</code> 限制连接点匹配目标对象为指定类型的类</p></li><li><p><code>@target()</code> 限制连接点匹配特定的执行对象，这些对象对应的类要具有指定类型的注解</p></li><li><p><code>within()</code> 限制连接点匹配指定的类型</p></li><li><p><code>@within()</code> 限制连接点匹配指定注解所标注的类型（当使用Spring AOP时，方法定义在由指定的注解所标注的类里）</p></li><li><p><code>@annotation</code> 限定匹配带有指定注解的连接点</p></li><li><p>Spring还引入了一个新的bean()指示器，它允许我们在切点表达式中使用bean的ID来标识bean。bean()使用bean ID或bean名称作为参数来限制切点只匹配特定的bean。</p><p>例如:<code>execution(* com.lee.aop.LeeDao. *(..)) and bean(&quot;leeDao1&quot;)</code>表示限定的bean的ID为<code>leeDao1</code></p></li></ul><p>使用示例:</p><p><code>execution(* com.lee.aop.LeeDao. *(..)) &amp;&amp;  within(com.lee.*)</code></p><p>解释:<code>&amp;&amp;</code> 表示逻辑与.还有<code>!</code>,表示非.<code>||</code>表示或.响应的都可以使用<code>and</code>,<code>not</code>,<code>or</code>来代替</p><p>​        <code>within</code>表示限制切点仅仅匹配com.lee包下的</p><h2 id="4-3-使用注解创建切面"><a href="#4-3-使用注解创建切面" class="headerlink" title="4.3 使用注解创建切面"></a>4.3 使用注解创建切面</h2><p>在类上进行标注:</p><ul><li><code>@Aspect</code>: 代表该类不仅是一个POJO类,还是一个切面</li></ul><p>在方法上进行标注:代表他们是通知(增强)</p><ul><li><code>@After</code> 通知方法会在目标方法返回或抛出异常后调用</li><li><code>@AfterReturning</code> 通知方法会在目标方法返回后调用</li><li><code>@AfterThrowing</code> 通知方法会在目标方法抛出异常后调用</li><li><code>@Around</code> 通知方法会将目标方法封装起来</li><li><code>@Before</code> 通知方法会在目标方法调用之前执行</li><li><code>@Pointcut</code> 定义一个公用的切点</li></ul><p>需要注意的是<code>@Around</code>环绕通知的使用方法</p><blockquote><p>关于这个新的通知方法，你首先注意到的可能是它接受<strong>ProceedingJoinPoint</strong>作为参数。这个对象是必须要有的，因为你要在通知中通过它来调用被通知的方法。通知方法中可以做任何的事情，当要将控制权交给被通知的方法时，它需要调用<strong>ProceedingJoinPoint</strong>的<strong>proceed()</strong>方法。</p></blockquote><p>​    <em>**</em></p><p><strong>通过注解引入新的功能:</strong></p><blockquote><p>一些编程语言，例如Ruby和Groovy，有开放类的理念。它们可以不用直接修改对象或类的定义就能够为对象或类增加新的方法。不过，Java并不是动态语言。一旦类编译完成了，我们就很难再为该类添加新的功了。</p></blockquote><p>实现方法</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></pre></td><td class="code"><pre><span class="line"><span class="meta">@Aspect</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">FoodFruitAppleAspect</span> </span>&#123;</span><br><span class="line">    <span class="comment">// value代表那种类型的bean需要引入新的接口,这里Fruit的子类将会引入新的接口</span></span><br><span class="line">    <span class="comment">// defaultImpl代表引入新的功能的实现类</span></span><br><span class="line">    <span class="meta">@DeclareParents</span>(value = <span class="string">"com.lee.aop.aopjoinnewfunction.Fruit+"</span>,</span><br><span class="line">            defaultImpl = FoodImpl.class)</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Food sFood;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在xml中配置</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">bean</span> <span class="attr">id</span>=<span class="string">"myApple"</span> <span class="attr">class</span>=<span class="string">"com.lee.aop.aopjoinnewfunction.Apple"</span>/&gt;</span></span><br><span class="line"><span class="comment">&lt;!--</span></span><br><span class="line"><span class="comment">在FoodFruitAppleAspect类中已经声明它作为一个切面,当Spring发现一个bean使</span></span><br><span class="line"><span class="comment">用了@Aspect注解时，Spring就会创建一个代理，然后将调用委托给</span></span><br><span class="line"><span class="comment">被代理的bean或被引入的实现，这取决于调用的方法属于被代理的</span></span><br><span class="line"><span class="comment">bean还是属于被引入的接口。</span></span><br><span class="line"><span class="comment">--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"foodFruitAppleAspect"</span> <span class="attr">class</span>=<span class="string">"com.lee.aop.aopjoinnewfunction.FoodFruitAppleAspect"</span>/&gt;</span></span><br></pre></td></tr></table></figure><p>使用:</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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">test1</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        ApplicationContext context = <span class="keyword">new</span> ClassPathXmlApplicationContext(<span class="string">"com/lee/aop/aopjoinnewfunction/NewApple.xml"</span>);</span><br><span class="line">        <span class="comment">// 虽然MyApple是一个Fruit的实现类,并没有显示的实现了Food接口,但是通过AOP切面的形式创建了代理  类,该代理类在运行时创建了代理对象</span></span><br><span class="line">        <span class="comment">// 该代理对象融合了新的功能</span></span><br><span class="line">        Food food = (Food) context.getBean(<span class="string">"myApple"</span>);</span><br><span class="line">        food.canEat();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="4-4-在xml中生命切面"><a href="#4-4-在xml中生命切面" class="headerlink" title="4.4 在xml中生命切面"></a>4.4 在xml中生命切面</h2><p>略</p><h2 id="4-5-注入AspectJ切面"><a href="#4-5-注入AspectJ切面" class="headerlink" title="4.5 注入AspectJ切面"></a>4.5 注入AspectJ切面</h2><p>上面的切面是Spring AOP的变体.</p><blockquote><p>虽然Spring AOP能够满足许多应用的切面需求，但是与AspectJ相比，Spring AOP 是一个功能比较弱的AOP解决方案。AspectJ提供了SpringAOP所不能支持的许多类型的切点。</p></blockquote><blockquote><p>例如，当我们需要在创建对象时应用通知，构造器切点就非常方便。不像某些其他面向对象语言中的构造器，Java构造器不同于其他的正常方法。这使得Spring基于代理的AOP无法把通知应用于对象的创建过程。</p><p>对于大部分功能来讲，AspectJ切面与Spring是相互独立的。虽然它们可以织入到任意的Java应用中，这也包括了Spring应用，但是在应用AspectJ切面时几乎不会涉及到Spring。</p></blockquote><h1 id="第10章-通过Spring和JDBC征服数据库"><a href="#第10章-通过Spring和JDBC征服数据库" class="headerlink" title="第10章 通过Spring和JDBC征服数据库"></a>第10章 通过Spring和JDBC征服数据库</h1><blockquote><p>SQLException的问题在于捕获到它的时候该如何处理。事实上，能够触发SQLException的问题通常是不能在catch代码块中解决的。大多数抛出SQLException的情况表明发生了致命性错误。如果应用程序不能连接到数据库，这通常意味着应用不能继续使用了。类似地，如果查询时出现了错误，那在运行时基本上也是无能为力。</p></blockquote><blockquote><p>SQLException并查看其属性才能获知问题根源的更多信息。这是因为SQLException被视为处理数据访问所有问题的通用异常。对于所有的数据访问问题都会抛出SQLException，而不是对每种可能的问题都会有不同的异常类型。</p></blockquote><blockquote><p>一方面，JDBC的异常体系过于简单了——实际上，它算不上一个体系。另一方面，Hibernate的异常体系是其本身所独有的。我们需要的数据访问异常要具有描述性而且又与特定的持久化框架无关。</p><p><strong>Spring所提供的平台无关的持久化异常</strong></p><p>Spring JDBC提供的数据访问异常体系解决了以上的两个问题。不同于JDBC，Spring提供了多个数据访问异常，分别描述了它们抛出时所对应的问题。表10.1对比了Spring的部分数据访问异常以及JDBC所提供的异常。</p></blockquote><h2 id="10-2-访问数据源"><a href="#10-2-访问数据源" class="headerlink" title="10.2 访问数据源"></a>10.2 访问数据源</h2><h3 id="10-2-1-使用JNDI配置数据源"><a href="#10-2-1-使用JNDI配置数据源" class="headerlink" title="10.2.1 使用JNDI配置数据源"></a>10.2.1 使用JNDI配置数据源</h3><p>(略)</p><h3 id="10-2-2-使用数据源连接池"><a href="#10-2-2-使用数据源连接池" class="headerlink" title="10.2.2 使用数据源连接池"></a>10.2.2 使用数据源连接池</h3><p>常见的有DBCP,c3p0等,配置上大体相同</p><h3 id="10-2-5-使用profile选择数据源"><a href="#10-2-5-使用profile选择数据源" class="headerlink" title="10.2.5 使用profile选择数据源"></a>10.2.5 使用profile选择数据源</h3><blockquote><p>实际上，我们很可能面临这样一种需求，那就是在某种环境下需要其中一种数据源，而在另外的环境中需要不同的数据源。</p><p>例如，对于开发期来说，<a href="jdbc:embedded-database" target="_blank" rel="noopener">jdbc:embedded-database</a>元素是很合适的，而在QA环境中，你可能希望使用DBCP的BasicDataSource，在生产部署环境下，可能需要使用<a href="jee:jndi-lookup" target="_blank" rel="noopener">jee:jndi-lookup</a>。</p></blockquote><p><strong>借助Spring的profile特性能够在运行时选择数据源</strong></p><h2 id="10-3-在Spring中使用JDBC"><a href="#10-3-在Spring中使用JDBC" class="headerlink" title="10.3 在Spring中使用JDBC"></a>10.3 在Spring中使用JDBC</h2><blockquote><p>JDBC不要求我们掌握其他框架的查询语言。它是建立在SQL之上的，而SQL本身就是数据访问语言。此外，与其他的技术相比，<strong>使用JDBC能够更好地对数据访问的性能进行调优</strong>。JDBC允许你使用数据库的所有特性，而这是其他框架不鼓励甚至禁止的。</p><p>再者，相对于持久层框架，<strong>JDBC能够让我们在更低的层次上处理数据</strong>，<strong>我们可以完全控制应用程序如何读取和管理数据，包括访问和管理数据库中单独的列</strong>。这种细粒度的数据访问方式在很多应用程序中是很方便的。例如在报表应用中，如果将数据组织为对象，而接下来唯一要做的就是将其解包为原始数据，那就没有太大意义了。</p></blockquote><p>理解:很多时候我们先将基本的功能实现了,再考虑优化问题,提高性能等.而使用持久层框架,它们帮我们做了很多封装,会隐藏很多细节,这样有针对性的优化就会付出很多成本.</p><blockquote><p>首先使代码正确的运行,然后再提高代码的速度.</p><p>摘自《Java并发编程实战》</p></blockquote>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;第1章-Spring之旅&quot;&gt;&lt;a href=&quot;#第1章-Spring之旅&quot; class=&quot;headerlink&quot; title=&quot;第1章 Spring之旅&quot;&gt;&lt;/a&gt;第1章 Spring之旅&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;两大核心&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
      
    
    </summary>
    
      <category term="Spring" scheme="https://blueleer.github.io/categories/Spring/"/>
    
    
      <category term="Spring" scheme="https://blueleer.github.io/tags/Spring/"/>
    
  </entry>
  
  <entry>
    <title>Spring加载resource时classpath*:与classpath:的区别</title>
    <link href="https://blueleer.github.io/2017/04/21/Spring%E5%8A%A0%E8%BD%BDresource%E6%97%B6classpath/"/>
    <id>https://blueleer.github.io/2017/04/21/Spring加载resource时classpath/</id>
    <published>2017-04-21T03:37:39.000Z</published>
    <updated>2018-06-07T11:17:40.975Z</updated>
    
    <content type="html"><![CDATA[<p>Spring加载context配置文件是从classpath加载进来的。</p><h3 id="What-is-classpath"><a href="#What-is-classpath" class="headerlink" title="What is classpath?"></a>What is classpath?</h3><ul><li><p>就是.java文件存放的根路径,在<code>intellij</code>中是<code>src</code>目录</p></li><li><p>我们也可以将配置文件单独放在一个文件夹下,例如<code>resources</code>文件夹,该文件夹和src目录是同级的.</p><ul><li><p>怎么创建这个文件夹呢?</p><ul><li><p>现在项目中创建一个和<code>src</code>同级的<code>directory</code>,名为<code>resources</code></p></li><li><p>右键该<code>resources</code>,然后<code>make Directory As</code>,然后选择<code>Source Root</code></p></li><li><p>此时你会发现该文件夹变颜色了,和src是一样的颜色</p></li><li><p>同时你也可以查看项目的配置问价<code>yourproject.xml</code>,例如,我的是这样的:</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></pre></td><td class="code"><pre><span class="line">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span><br><span class="line"><span class="tag">&lt;<span class="name">module</span> <span class="attr">type</span>=<span class="string">"JAVA_MODULE"</span> <span class="attr">version</span>=<span class="string">"4"</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">component</span> <span class="attr">name</span>=<span class="string">"FacetManager"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">facet</span> <span class="attr">type</span>=<span class="string">"Spring"</span> <span class="attr">name</span>=<span class="string">"Spring"</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">configuration</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">facet</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">component</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">component</span> <span class="attr">name</span>=<span class="string">"NewModuleRootManager"</span> <span class="attr">inherit-compiler-output</span>=<span class="string">"true"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">exclude-output</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">content</span> <span class="attr">url</span>=<span class="string">"file://$MODULE_DIR$"</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">sourceFolder</span> <span class="attr">url</span>=<span class="string">"file://$MODULE_DIR$/src"</span> <span class="attr">isTestSource</span>=<span class="string">"false"</span> /&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">sourceFolder</span> <span class="attr">url</span>=<span class="string">"file://$MODULE_DIR$/sources"</span> <span class="attr">isTestSource</span>=<span class="string">"false"</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">content</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">orderEntry</span> <span class="attr">type</span>=<span class="string">"inheritedJdk"</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">orderEntry</span> <span class="attr">type</span>=<span class="string">"sourceFolder"</span> <span class="attr">forTests</span>=<span class="string">"false"</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">orderEntry</span> <span class="attr">type</span>=<span class="string">"library"</span> <span class="attr">name</span>=<span class="string">"Spring-4.3.16.RELEASE"</span> <span class="attr">level</span>=<span class="string">"project"</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">orderEntry</span> <span class="attr">type</span>=<span class="string">"module-library"</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">library</span> <span class="attr">name</span>=<span class="string">"JUnit4"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">CLASSES</span>&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">root</span> <span class="attr">url</span>=<span class="string">"jar://$APPLICATION_HOME_DIR$/lib/junit-4.12.jar!/"</span> /&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">root</span> <span class="attr">url</span>=<span class="string">"jar://$APPLICATION_HOME_DIR$/lib/hamcrest-core-1.3.jar!/"</span> /&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">CLASSES</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">JAVADOC</span> /&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">SOURCES</span> /&gt;</span></span><br><span class="line">      <span class="tag">&lt;/<span class="name">library</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">orderEntry</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">component</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">module</span>&gt;</span></span><br></pre></td></tr></table></figure><p>其中可以清楚的看到<code>src</code>目录和<code>sources</code>都是<code>sourceFolder</code></p></li></ul></li></ul></li></ul><h3 id="classpath-和classpath-到底有什么区别呢"><a href="#classpath-和classpath-到底有什么区别呢" class="headerlink" title="classpath*:和classpath:到底有什么区别呢?"></a>classpath*:和classpath:到底有什么区别呢?</h3><ul><li><p>你先想想<strong>*</strong>通常用来是干嘛用的? 是不是通配符?</p><ul><li><strong>classpath*:</strong> 就是从多个jar文件,包括你自己的项目<code>src</code>目录下(src目录作为sourceroot)加载指定的问价,比如:</li></ul><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ApplicationContext context = <span class="keyword">new</span> ClassPathXmlApplicationContext(<span class="string">"classpath*:/bean.xml"</span>);</span><br><span class="line"><span class="comment">// 其中斜杠表示sourceroot的根目录(也可以不写),</span></span><br></pre></td></tr></table></figure><p>它从所有的classpath中查找这个bean.xml文件,所有符合条件的bean.xml文件都被加载进来了</p></li><li><p><strong>classpath:</strong> 如果存在多个满足条件的,第一个加载到了,就不管了</p></li></ul><p>参考:</p><p><a href="https://blog.csdn.net/kkdelta/article/details/5507799" target="_blank" rel="noopener">Spring加载resource时classpath*:与classpath:的区别</a></p><p>更多内容请点开上面的链接</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Spring加载context配置文件是从classpath加载进来的。&lt;/p&gt;
&lt;h3 id=&quot;What-is-classpath&quot;&gt;&lt;a href=&quot;#What-is-classpath&quot; class=&quot;headerlink&quot; title=&quot;What is classp
      
    
    </summary>
    
      <category term="JavaEE" scheme="https://blueleer.github.io/categories/JavaEE/"/>
    
    
      <category term="Spring" scheme="https://blueleer.github.io/tags/Spring/"/>
    
  </entry>
  
</feed>
