<div id="article_content" class="article_content tracking-ad" data-mod="popu_307" data-dsm="post">
<p>《Spring4实战 第4版》2016年4月新出版的,之前的第三版看起来还是不错的,所以看到新版就直接买下来。</p>
<p>英文版源码地址:<a target="_blank" href="https://www.manning.com/books/spring-in-action-fourth-edition">Spring in Action, Fourth Edition Covers Spring 4</a></p>
<p><img src="https://img-blog.youkuaiyun.com/20160504190501833" alt=""><br>
</p>
<p><br>
</p>
<p><strong><span style="font-size:18px">1.IOC装配Bean</span></strong></p>
<p>参考【<a href="http://lib.youkuaiyun.com/base/javaee" class="replace_word" title="Java EE知识库" target="_blank" style="color:#df3434; font-weight:bold;">spring</a>实战4 2.2】,作者提倡<span style="background-color:rgb(255,255,0)">无XML配置化</span>。</p>
<p><strong>1.1接口只有一个现实类</strong></p>
<p>可以自动装配</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 918px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">interface</span><span> CompactDisc { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">void</span><span> play(); </span></span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160504_1_4414705" name="code" class="java" style="display: none;">public interface CompactDisc {
void play();
}</pre>
<p></p>
<p><br>
</p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 1085px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.stereotype.Component; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SgtPeppers </span><span class="keyword">implements</span><span> CompactDisc { </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String title = </span><span class="string">"Sgt. Pepper's Lonely Hearts Club Band"</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> String artist = </span><span class="string">"http://blog.youkuaiyun.com/unix21"</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目SgtPeppers 】>>>>>>>>>>>>>>>>>Playing "</span><span> + title + </span><span class="string">" by "</span><span> + artist); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160504_2_891912" name="code" class="java" style="display: none;">import org.springframework.stereotype.Component;
@Component
public class SgtPeppers implements CompactDisc {
private String title = "Sgt. Pepper's Lonely Hearts Club Band";
private String artist = "http://blog.youkuaiyun.com/unix21";
public void play() {
System.out.println("【非常醒目SgtPeppers 】>>>>>>>>>>>>>>>>>Playing " + title + " by " + artist);
}
}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 1414px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_3" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.ComponentScan; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.context.annotation.Configuration; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="annotation">@Configuration</span><span> </span></span></li><li class="alt"><span><span class="annotation">@ComponentScan</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayerConfig { </span></span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160504_3_4653902" name="code" class="java" style="display: none;">import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class CDPlayerConfig {
}</pre>
<p><br>
</p>
<p>单元<a href="http://lib.youkuaiyun.com/base/softwaretest" class="replace_word" title="软件测试知识库" target="_blank" style="color:#df3434; font-weight:bold;">测试</a></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 1661px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_4" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_4" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> </span><span class="keyword">static</span><span> org.junit.Assert.*; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.junit.Rule; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.junit.Test; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.junit.runner.RunWith; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.beans.factory.annotation.Autowired; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.beans.factory.annotation.Qualifier; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.test.context.ContextConfiguration; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.test.context.junit4.SpringJUnit4ClassRunner; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = CDPlayerConfig.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayerTest { </span></span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Test</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class="alt"><span> cd.play(); </span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160504_4_52096" name="code" class="java" style="display: none;">import static org.junit.Assert.*;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayerTest {
@Autowired
private CompactDisc cd;
@Test
public void play() {
cd.play();
}
}</pre><br>
<img src="https://img-blog.youkuaiyun.com/20160504191146139" alt=""><br>
<br>
<br>
<strong>1.2 接口有多个实现类</strong>
<p>【参考 Spring实战4 3.3】<br>
故意再写一个实现类</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 2962px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_5" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_5" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.stereotype.Component; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SgtPeppersNew </span><span class="keyword">implements</span><span> CompactDisc { </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String title = </span><span class="string">"Sgt. Pepper's Lonely Hearts Club Band"</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> String artist = </span><span class="string">"http://blog.youkuaiyun.com/unix21"</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 SgtPeppersNew】>>>>>>>>>>>>>>>>>Playing "</span><span> + title + </span><span class="string">" by "</span><span> + artist); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160504_5_640741" name="code" class="java" style="display: none;">import org.springframework.stereotype.Component;
@Component
public class SgtPeppersNew implements CompactDisc {
private String title = "Sgt. Pepper's Lonely Hearts Club Band";
private String artist = "http://blog.youkuaiyun.com/unix21";
public void play() {
System.out.println("【非常醒目 SgtPeppersNew】>>>>>>>>>>>>>>>>>Playing " + title + " by " + artist);
}
}</pre><br>
<p>如果这个时候运行肯定会报错<span style="background-color:rgb(255,255,0)">NoUniqueBeanDefinitionException: No qualifying bean of type</span></p>
<p><br>
</p>
<p>解决方法有两种</p>
<p><strong>第一种</strong> 在实现类上 <strong>标识首选的bean</strong>,使用<span style="background-color:rgb(255,255,0)">@Primary</span></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 3395px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_6" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_6" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=6&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.Primary; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.stereotype.Component; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="annotation">@Component</span><span> </span></span></li><li class="alt"><span><span class="annotation">@Primary</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SgtPeppers </span><span class="keyword">implements</span><span> CompactDisc { </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String title = </span><span class="string">"Sgt. Pepper's Lonely Hearts Club Band"</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> String artist = </span><span class="string">"http://blog.youkuaiyun.com/unix21"</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目SgtPeppers 】>>>>>>>>>>>>>>>>>Playing "</span><span> + title + </span><span class="string">" by "</span><span> + artist); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160504_6_8129918" name="code" class="java" style="display: none;">import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
@Component
@Primary
public class SgtPeppers implements CompactDisc {
private String title = "Sgt. Pepper's Lonely Hearts Club Band";
private String artist = "http://blog.youkuaiyun.com/unix21";
public void play() {
System.out.println("【非常醒目SgtPeppers 】>>>>>>>>>>>>>>>>>Playing " + title + " by " + artist);
}
}</pre>
<p></p>
<p><br>
</p>
但是这种方法不方便精确定义。
<p><br>
<strong>第二种</strong> 使用<span style="background-color:rgb(255,255,0)">@Qualifier</span>注解</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 3838px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_7" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_7" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=7&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> </span><span class="keyword">static</span><span> org.junit.Assert.*; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.junit.Rule; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.junit.Test; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.junit.runner.RunWith; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.beans.factory.annotation.Autowired; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.beans.factory.annotation.Qualifier; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.test.context.ContextConfiguration; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.test.context.junit4.SpringJUnit4ClassRunner; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = CDPlayerConfig.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayerTest { </span></span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"sgtPeppersNew"</span><span>) </span></span></li><li class=""><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> cd.play(); </span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160504_7_3288132" name="code" class="java" style="display: none;">import static org.junit.Assert.*;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayerTest {
@Autowired
@Qualifier("sgtPeppersNew")
private CompactDisc cd;
@Test
public void play() {
cd.play();
}
}</pre><br>
<p><img src="https://img-blog.youkuaiyun.com/20160504192101534" alt=""></p>
<p>需要注意的是bean id的首字母是类名小写。</p>
<p><a target="_blank" href="http://blog.youkuaiyun.com/clerk0324/article/details/25198457">spring @Qualifier注解</a><br>
</p>
<p><br>
</p>
<p><strong>1.3 为组件扫描的bean命名</strong></p>
<p>【参考 Spring实战4 2.2.2】</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 5157px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_8" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_8" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=8&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.stereotype.Component; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@Component</span><span>(</span><span class="string">"spn"</span><span>) </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SgtPeppersNew </span><span class="keyword">implements</span><span> CompactDisc { </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_8_3459584" name="code" class="java" style="display: none;">import org.springframework.stereotype.Component;
@Component("spn")
public class SgtPeppersNew implements CompactDisc {</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 5324px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_9" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_9" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=9&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"spn"</span><span>) </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_9_7046851" name="code" class="java" style="display: none;">@Autowired
@Qualifier("spn")
private CompactDisc cd;</pre><br>
也可以使用<span style="background-color:rgb(255,255,0)">@Named</span>效果是一样的,这是java依赖注入规范
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 5499px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_10" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_10" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=10&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> javax.inject.Named; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@Named</span><span>(</span><span class="string">"spn"</span><span>) </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SgtPeppersNew </span><span class="keyword">implements</span><span> CompactDisc { </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_10_5301965" name="code" class="java" style="display: none;">import javax.inject.Named;
@Named("spn")
public class SgtPeppersNew implements CompactDisc {
</pre><br>
<p><strong>1.4 设定组件扫描的指定包</strong></p>
<p>【参考 Spring实战4 2.2.3】<br>
</p>
<p>如果<span style="background-color:rgb(255,255,0)">@ComponentScan</span>默认不设置只扫描配置类所在的包作为基础包。</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 5744px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_11" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_11" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=11&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Configuration</span><span> </span></span></li><li class=""><span><span class="annotation">@ComponentScan</span><span>(</span><span class="string">"blog.youkuaiyun.com.unix21"</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayerConfigTest { </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_11_7185248" name="code" class="java" style="display: none;">@Configuration
@ComponentScan("blog.youkuaiyun.com.unix21")
public class CDPlayerConfigTest {</pre>设置@ComponentScan的value属性就可以指明包名称。
<p></p>
<p><br>
</p>
<p>如果想更清晰的表明设置的是基础包<br>
@ComponentScan(basePackages="指定包")<br>
</p>
<p><br>
</p>
<p>指定多个</p>
<p>@ComponentScan(basePackages={"指定包1","指定包2"})</p>
<p><br>
</p>
<p>也可以将其指定为包中所包含的类或者接口</p>
<p>@ComponentScan(basePackages={"XXX.class","XX.class"})<br>
</p>
<p><br>
</p>
<p><strong>1.5 自动装配</strong></p>
<p>【参考 Spring实战4 2.2.4】<br>
</p>
<p>声明自动装配需要<span style="background-color:rgb(255,255,0)">@Autowired</span>注解</p>
<p><br>
</p>
<p>1.5.1 在<strong>构造方法</strong>上使用自动装配</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 6283px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_12" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_12" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=12&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = CDPlayerConfigTest.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayerFunTest { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"spn"</span><span>) </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> CDPlayer(CompactDisc cd) { </span></span></li><li class=""><span> <span class="keyword">this</span><span>.cd = cd; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Test</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class="alt"><span> cd.play(); </span></li><li class=""><span> System.out.println(<span class="string">"【占位符】CDPlayerFunTest"</span><span>); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_12_4119510" name="code" class="java" style="display: none;">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfigTest.class)
public class CDPlayerFunTest {
private CompactDisc cd;
@Autowired
@Qualifier("spn")
public void CDPlayer(CompactDisc cd) {
this.cd = cd;
}
@Test
public void play() {
cd.play();
System.out.println("【占位符】CDPlayerFunTest");
}
}</pre><br>
<p><img src="https://img-blog.youkuaiyun.com/20160505132913413" alt=""></p>
<p><br>
</p>
<p>另一种写法</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 7364px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_13" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_13" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=13&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayer </span><span class="keyword">implements</span><span> MediaPlayer { </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> CDPlayer(</span><span class="annotation">@Qualifier</span><span>(</span><span class="string">"spn"</span><span>)CompactDisc cd) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.cd = cd; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class="alt"><span> cd.play(); </span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_13_8343193" name="code" class="java" style="display: none;">@Component
public class CDPlayer implements MediaPlayer {
private CompactDisc cd;
@Autowired
public CDPlayer(@Qualifier("spn")CompactDisc cd) {
this.cd = cd;
}
public void play() {
cd.play();
}
}</pre><br>
<p><br>
</p>
<p>1.5.2 在<strong>属性Setter</strong>方法上使用自动装配<br>
</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 7763px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_14" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_14" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=14&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayer </span><span class="keyword">implements</span><span> MediaPlayer { </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"spn"</span><span>) </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setCompactDisc(CompactDisc cd) { </span></span></li><li class=""><span> <span class="keyword">this</span><span>.cd = cd; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> cd.play(); </span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_13_1313609" name="code" class="java" style="display: none;">@Component
public class CDPlayer implements MediaPlayer {
private CompactDisc cd;
@Autowired
@Qualifier("spn")
public void setCompactDisc(CompactDisc cd) {
this.cd = cd;
}
public void play() {
cd.play();
}
}</pre><br>
避免异常声明 <span style="background-color:rgb(255,255,0)">@Autowired(required = false)</span>,如果没有匹配的bean,Spring会让这个bean处于未装配转态,但是需要谨慎对待这个设置,代码需要做null检查。
<p></p>
<p></p>
<p>@Autowired是Spring特有的注解,可以替换为<span style="background-color:rgb(255,255,0)">@Inject</span>,@Inject来源自Jave依赖注入规范。<br>
</p>
<p><br>
</p>
<p><strong>1.6 创建自定义的限定符</strong></p>
<p>【参考 Spring实战4 3.3.2】<br>
</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 8266px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_15" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_15" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=15&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="annotation">@Qualifier</span><span>(</span><span class="string">"cold"</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> IceCream </span><span class="keyword">implements</span><span> CompactDisc { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">private</span><span> String title = </span><span class="string">"Sgt. Pepper's Lonely Hearts Club Band"</span><span>; </span></span></li><li class=""><span> <span class="keyword">private</span><span> String artist = </span><span class="string">"The Beatles"</span><span>; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class="alt"><span> System.out.println(<span class="string">"【非常醒目 IceCream】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Playing "</span><span> + title + </span><span class="string">" by "</span><span> + artist); </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_15_2230693" name="code" class="java" style="display: none;">@Component
@Qualifier("cold")
public class IceCream implements CompactDisc {
private String title = "Sgt. Pepper's Lonely Hearts Club Band";
private String artist = "The Beatles";
public void play() {
System.out.println("【非常醒目 IceCream】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Playing " + title + " by " + artist);
}
}</pre>
<p></p>
<p><br>
</p>
测试用例<br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 8585px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_16" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_16" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=16&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes=CDPlayerConfigTest.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayerLogTest { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> MediaPlayer player; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"sp"</span><span>) </span></span></li><li class=""><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"cold"</span><span>) </span></span></li><li class=""><span> <span class="keyword">private</span><span> CompactDisc cd2; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> cdShouldNotBeNull() { </span></span></li><li class=""><span> assertNotNull(cd); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Test</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class="alt"><span> player.play(); </span></li><li class=""><span> cd.play(); </span></li><li class="alt"><span> cd2.play(); </span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_16_7944531" name="code" class="java" style="display: none;">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfigTest.class)
public class CDPlayerLogTest {
@Autowired
private MediaPlayer player;
@Autowired
@Qualifier("sp")
private CompactDisc cd;
@Autowired
@Qualifier("cold")
private CompactDisc cd2;
@Test
public void cdShouldNotBeNull() {
assertNotNull(cd);
}
@Test
public void play() {
player.play();
cd.play();
cd2.play();
}
}</pre><br>
<p><img src="https://img-blog.youkuaiyun.com/20160505155611379" alt=""></p>
<p><br>
</p>
<p>好处:这样做的好处限定符不耦合类名,所以可以随意重构类名。</p>
<p>问题:重复的限定符出现在多个类上这是不允许的,因为<strong><a href="http://lib.youkuaiyun.com/base/java" class="replace_word" title="Java 知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java</a>不允许同一个条目上重复出现相同类型的多个注解</strong>。</p>
<p><br>
</p>
<p><strong>1.7 使用自定义限定符注解</strong></p>
<p>针对上述问题可以创建自定义的限定符注解。</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 9920px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_17" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_17" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=17&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Retention</span><span>(RetentionPolicy.RUNTIME) </span><span class="comment">// 注解会在class字节码文件中存在,在运行时可以通过反射获取到 </span><span> </span></span></li><li class=""><span><span class="annotation">@Target</span><span>({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})</span><span class="comment">//定义注解的作用目标**作用范围字段、枚举的常量/方法 </span><span> </span></span></li><li class="alt"><span><span class="annotation">@Qualifier</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">@interface</span><span> Cold {} </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_17_5027128" name="code" class="java" style="display: none;">@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})//定义注解的作用目标**作用范围字段、枚举的常量/方法
@Qualifier
public @interface Cold {}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 10105px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_18" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_18" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=18&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Retention</span><span>(RetentionPolicy.RUNTIME) </span><span class="comment">// 注解会在class字节码文件中存在,在运行时可以通过反射获取到 </span><span> </span></span></li><li class=""><span><span class="annotation">@Target</span><span>({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})</span><span class="comment">//定义注解的作用目标**作用范围字段、枚举的常量/方法 </span><span> </span></span></li><li class="alt"><span><span class="annotation">@Qualifier</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">@interface</span><span> Creamy {} </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_18_3216984" name="code" class="java" style="display: none;">@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})//定义注解的作用目标**作用范围字段、枚举的常量/方法
@Qualifier
public @interface Creamy {}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 10290px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_19" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_19" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=19&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Retention</span><span>(RetentionPolicy.RUNTIME) </span><span class="comment">// 注解会在class字节码文件中存在,在运行时可以通过反射获取到 </span><span> </span></span></li><li class=""><span><span class="annotation">@Target</span><span>({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})</span><span class="comment">//定义注解的作用目标**作用范围字段、枚举的常量/方法 </span><span> </span></span></li><li class="alt"><span><span class="annotation">@Qualifier</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">@interface</span><span> Fruity {} </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_19_3566431" name="code" class="java" style="display: none;">@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})//定义注解的作用目标**作用范围字段、枚举的常量/方法
@Qualifier
public @interface Fruity {}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 10475px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_20" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_20" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=20&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="annotation">@Cold</span><span> </span></span></li><li class="alt"><span><span class="annotation">@Creamy</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> IceCream </span><span class="keyword">implements</span><span> CompactDisc { </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String title = </span><span class="string">"Spring 实现 第4版 读书笔记"</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> String artist = </span><span class="string">"http://blog.youkuaiyun.com/unix21"</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 IceCream】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Playing "</span><span> + title + </span><span class="string">" by "</span><span> + artist); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_20_7263165" name="code" class="java" style="display: none;">@Component
@Cold
@Creamy
public class IceCream implements CompactDisc {
private String title = "Spring 实现 第4版 读书笔记";
private String artist = "http://blog.youkuaiyun.com/unix21";
public void play() {
System.out.println("【非常醒目 IceCream】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Playing " + title + " by " + artist);
}
}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 10786px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_21" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_21" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=21&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="annotation">@Cold</span><span> </span></span></li><li class="alt"><span><span class="annotation">@Fruity</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Popsicle </span><span class="keyword">implements</span><span> CompactDisc { </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String title = </span><span class="string">"Spring 实现 第4版 读书笔记"</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> String artist = </span><span class="string">"http://blog.youkuaiyun.com/unix21"</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 Popsicle】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Playing "</span><span> + title + </span><span class="string">" by "</span><span> + artist); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_21_7404869" name="code" class="java" style="display: none;">@Component
@Cold
@Fruity
public class Popsicle implements CompactDisc {
private String title = "Spring 实现 第4版 读书笔记";
private String artist = "http://blog.youkuaiyun.com/unix21";
public void play() {
System.out.println("【非常醒目 Popsicle】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Playing " + title + " by " + artist);
}
}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 11097px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_22" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_22" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=22&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = CDPlayerConfigTest.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayerLogTest { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> MediaPlayer player; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"sp"</span><span>) </span></span></li><li class=""><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Cold</span><span> </span></span></li><li class=""><span> <span class="annotation">@Creamy</span><span> </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> CompactDisc cd2; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="annotation">@Cold</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Fruity</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> CompactDisc cd3; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> cdShouldNotBeNull() { </span></span></li><li class=""><span> assertNotNull(cd); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Test</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class="alt"><span> player.play(); </span></li><li class=""><span> cd.play(); </span></li><li class="alt"><span> cd2.play(); </span></li><li class=""><span> cd3.play(); </span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_22_9182776" name="code" class="java" style="display: none;">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfigTest.class)
public class CDPlayerLogTest {
@Autowired
private MediaPlayer player;
@Autowired
@Qualifier("sp")
private CompactDisc cd;
@Autowired
@Cold
@Creamy
private CompactDisc cd2;
@Autowired
@Cold
@Fruity
private CompactDisc cd3;
@Test
public void cdShouldNotBeNull() {
assertNotNull(cd);
}
@Test
public void play() {
player.play();
cd.play();
cd2.play();
cd3.play();
}
}</pre><br>
<p><img src="https://img-blog.youkuaiyun.com/20160505163924501" alt=""></p>
<p><br>
</p>
<p><strong>1.8 bean的作用域</strong></p>
<p>Spring定义了多重作用域,singleton单例,prototype原型等</p>
<p>参考:<a target="_blank" href="http://www.cnblogs.com/qq78292959/p/3716827.html">spring中scope作用域</a></p>
<p>singleton单例:整个应用中,只创建bean的一个实例,默认Spring上下文中所有的bean都是单例。<br>
</p>
<p>prototype原型:每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。<br>
</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 12656px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_23" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_23" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=23&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Add </span><span class="keyword">implements</span><span> AddI { </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">int</span><span> a=</span><span class="number">0</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> Add() { </span></span></li><li class=""><span> a++; </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> getA() { </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 Add】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>a= "</span><span> +a+</span><span class="string">""</span><span>); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160506_23_4113982" name="code" class="java" style="display: none;">@Component
public class Add implements AddI {
public int a=0;
public void Add() {
a++;
}
public void getA() {
System.out.println("【非常醒目 Add】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>a= " +a+"");
}
}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 12967px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_24" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_24" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=24&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">interface</span><span> AddI { </span></span></li><li class=""><span><span class="keyword">void</span><span> Add(); </span></span></li><li class="alt"><span> <span class="keyword">void</span><span> getA(); </span></span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160506_24_7145624" name="code" class="java" style="display: none;">public interface AddI {
void Add();
void getA();
}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 13134px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_25" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_25" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=25&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayer </span><span class="keyword">implements</span><span> MediaPlayer { </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"sp"</span><span>) </span></span></li><li class=""><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> AddI a; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 CDPlayer】>>>"</span><span>); </span></span></li><li class="alt"><span> cd.play(); </span></li><li class=""><span> a.Add(); </span></li><li class="alt"><span> a.getA(); </span></li><li class=""><span> a.Add(); </span></li><li class="alt"><span> a.getA(); </span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 CDPlayer】<<<"</span><span>); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160506_25_1813470" name="code" class="java" style="display: none;">@Component
public class CDPlayer implements MediaPlayer {
@Autowired
@Qualifier("sp")
private CompactDisc cd;
@Autowired
private AddI a;
public void play() {
System.out.println("【非常醒目 CDPlayer】>>>");
cd.play();
a.Add();
a.getA();
a.Add();
a.getA();
System.out.println("【非常醒目 CDPlayer】<<<");
}
}</pre>
<p></p>
<p><br>
</p>
测试用例<br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 13615px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_26" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_26" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=26&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = CDPlayerConfigTest.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayerLogTest { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> MediaPlayer player; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"sp"</span><span>) </span></span></li><li class=""><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Cold</span><span> </span></span></li><li class=""><span> <span class="annotation">@Creamy</span><span> </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> CompactDisc cd2; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="annotation">@Cold</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Fruity</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> CompactDisc cd3; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> cdShouldNotBeNull() { </span></span></li><li class=""><span> assertNotNull(cd); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> AddI a; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> player.play(); </span></li><li class="alt"><span> cd.play(); </span></li><li class=""><span> cd2.play(); </span></li><li class="alt"><span> cd3.play(); </span></li><li class=""><span> a.getA(); </span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160506_26_1257063" name="code" class="java" style="display: none;">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfigTest.class)
public class CDPlayerLogTest {
@Autowired
private MediaPlayer player;
@Autowired
@Qualifier("sp")
private CompactDisc cd;
@Autowired
@Cold
@Creamy
private CompactDisc cd2;
@Autowired
@Cold
@Fruity
private CompactDisc cd3;
@Test
public void cdShouldNotBeNull() {
assertNotNull(cd);
}
@Autowired
private AddI a;
@Test
public void play() {
player.play();
cd.play();
cd2.play();
cd3.play();
a.getA();
}
}</pre><br>
<p><img src="https://img-blog.youkuaiyun.com/20160506173451878" alt=""></p>
<p><br>
</p>
<p>再写一个多线程</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 14964px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_27" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_27" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=27&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> ClientThread </span><span class="keyword">extends</span><span> Thread { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> AddI a; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> ClientThread(AddI a) { </span></span></li><li class=""><span> <span class="keyword">this</span><span>.a = a; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> run() { </span></span></li><li class=""><span> a.Add(); </span></li><li class="alt"><span> a.getA(); </span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160506_27_2961121" name="code" class="java" style="display: none;">public class ClientThread extends Thread {
@Autowired
private AddI a;
@Autowired
public ClientThread(AddI a) {
this.a = a;
}
public void run() {
a.Add();
a.getA();
}
}</pre><br>
调用多线程
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 15355px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_28" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_28" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=28&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = CDPlayerConfigTest.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SpringScopeTest { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> AddI a; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> Scope() { </span></span></li><li class=""><span> <span class="keyword">for</span><span> (</span><span class="keyword">int</span><span> i = </span><span class="number">0</span><span>; i < </span><span class="number">10</span><span>; i++) { </span></span></li><li class="alt"><span> ClientThread t = <span class="keyword">new</span><span> ClientThread(a); </span></span></li><li class=""><span> t.start(); </span></li><li class="alt"><span> } </span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160506_28_5992764" name="code" class="java" style="display: none;">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfigTest.class)
public class SpringScopeTest {
@Autowired
private AddI a;
@Test
public void Scope() {
for (int i = 0; i < 10; i++) {
ClientThread t = new ClientThread(a);
t.start();
}
}
}</pre><br>
<img src="https://img-blog.youkuaiyun.com/20160506174355306" alt=""><br>
<p>改为<span style="background-color:rgb(255,255,0)">SCOPE_PROTOTYPE</span></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 16430px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_29" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_29" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=29&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="annotation">@Scope</span><span>(ConfigurableBeanFactory.SCOPE_PROTOTYPE) </span></span></li><li class="alt"><span><span class="comment">//@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Add </span><span class="keyword">implements</span><span> AddI { </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">int</span><span> a=</span><span class="number">0</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> Add() { </span></span></li><li class=""><span> a++; </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> getA() { </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 Add】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>a= "</span><span> +a+</span><span class="string">""</span><span>); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160506_29_3314562" name="code" class="java" style="display: none;">@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
//@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class Add implements AddI {
public int a=0;
public void Add() {
a++;
}
public void getA() {
System.out.println("【非常醒目 Add】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>a= " +a+"");
}
}
</pre><br>
<img src="https://img-blog.youkuaiyun.com/20160506174802602" alt=""><br>
<p></p>
<p><img src="https://img-blog.youkuaiyun.com/20160506174808093" alt=""><br>
</p>
<p>看到差异了吧。</p>
<p><br>
</p>
<p>补充说明:<span style="background-color:rgb(255,255,0)">@Repository、@Service、@Controller 和 @Component</span>将类标识为Bean,都是一样的,用在不同的地方而已。</p>
<p><br>
</p>
<p><strong><span style="font-size:18px">2.AOP切面编程</span></strong></p>
<p>定义接口</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 18258px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_30" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_30" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=30&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">interface</span><span> PerformanceI { </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> perform(); </span></span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160511_30_1073147" name="code" class="java" style="display: none;">public interface PerformanceI {
public void perform();
}</pre><br>
实现类
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 18433px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_31" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_31" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=31&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.stereotype.Component; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Performance </span><span class="keyword">implements</span><span> PerformanceI{ </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> perform(){ </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 Performance perform 调用中】 By http://blog.youkuaiyun.com/unix21"</span><span>); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160511_31_9502982" name="code" class="java" style="display: none;">import org.springframework.stereotype.Component;
@Component
public class Performance implements PerformanceI{
public void perform(){
System.out.println("【非常醒目 Performance perform 调用中】 By http://blog.youkuaiyun.com/unix21");
}
}</pre><br>
定义切面
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 18698px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_32" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_32" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=32&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.aspectj.lang.annotation.After; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.aspectj.lang.annotation.AfterThrowing; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.aspectj.lang.annotation.Aspect; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.aspectj.lang.annotation.Before; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="annotation">@Aspect</span><span> </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> MyAspect { </span></span></li><li class=""><span> <span class="annotation">@Before</span><span>(</span><span class="string">"execution(* com.demo.PerformanceI.perform(..))"</span><span>) </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> before(){ </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 [方法调用前] 】"</span><span>); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@After</span><span>(</span><span class="string">"execution(* com.demo.PerformanceI.perform(..))"</span><span>) </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> after(){ </span></span></li><li class="alt"><span> System.out.println(<span class="string">"【非常醒目 [方法调用后] 】"</span><span>); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@AfterThrowing</span><span>(</span><span class="string">"execution(* com.demo.PerformanceI.perform(..))"</span><span>) </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> afterThrowing(){ </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 [方法异常后] 】"</span><span>); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160511_32_8281483" name="code" class="java" style="display: none;">import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class MyAspect {
@Before("execution(* com.demo.PerformanceI.perform(..))")
public void before(){
System.out.println("【非常醒目 [方法调用前] 】");
}
@After("execution(* com.demo.PerformanceI.perform(..))")
public void after(){
System.out.println("【非常醒目 [方法调用后] 】");
}
@AfterThrowing("execution(* com.demo.PerformanceI.perform(..))")
public void afterThrowing(){
System.out.println("【非常醒目 [方法异常后] 】");
}
}</pre><br>
配置文件
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 19215px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_33" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_33" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=33&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> com.demo.*; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.context.annotation.Bean; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.ComponentScan; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.context.annotation.Configuration; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.EnableAspectJAutoProxy; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@Configuration</span><span> </span></span></li><li class=""><span><span class="annotation">@EnableAspectJAutoProxy</span><span> </span></span></li><li class="alt"><span><span class="annotation">@ComponentScan</span><span>(</span><span class="string">"com.demo"</span><span>) </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> AppConfig { </span></span></li><li class="alt"><span> <span class="annotation">@Bean</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> MyAspect myAspect() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> MyAspect(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160511_33_963680" name="code" class="java" style="display: none;">import com.demo.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration
@EnableAspectJAutoProxy
@ComponentScan("com.demo")
public class AppConfig {
@Bean
public MyAspect myAspect() {
return new MyAspect();
}
}</pre>
<p></p>
<p><br>
</p>
测试用例
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 19624px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_34" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_34" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=34&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.junit.Test; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.junit.runner.RunWith; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.beans.factory.annotation.Autowired; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.test.context.ContextConfiguration; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.test.context.junit4.SpringJUnit4ClassRunner; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = AppConfig.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> MyTest { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> PerformanceI p1; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> p1.perform(); </span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160511_34_5805466" name="code" class="java" style="display: none;">import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class MyTest {
@Autowired
private PerformanceI p1;
@Test
public void play() {
p1.perform();
}
}</pre>
<p></p>
<p><br>
</p>
运行:<br>
<img src="https://img-blog.youkuaiyun.com/20160511192937830" alt=""><br>
<br>
<p>实现了方法调用前后的AOP效果。</p>
<p>这个Spring官方参考做的不错:<a target="_blank" href="http://docs.spring.io/spring/docs/4.2.5.RELEASE/javadoc-api/">http://docs.spring.io/spring/docs/4.2.5.RELEASE/javadoc-api/</a></p>
<p>这里选不同的版本:<a target="_blank" href="http://docs.spring.io/spring/docs/">http://docs.spring.io/spring/docs/</a></p>
<p><img src="https://img-blog.youkuaiyun.com/20160511193434097" alt=""><br>
</p>
<p><br>
</p>
<p><span style="font-size:18px">3.Spring MVC</span></p>
<p>DispatcherServlet是Spring MVC的核心,每当应用接受一个HTTP请求,由DispatcherServlet负责将请求分发给应用的其他组件。<br>
在旧版本中,DispatcherServlet之类的servlet一般在web.xml文件中配置;但是Spring 3.1引入了注解就无需再使用web.xml文件。<br>
</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 21375px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_35" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_35" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=35&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SpitterWebInitializer </span><span class="keyword">extends</span><span> AbstractAnnotationConfigDispatcherServletInitializer { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">protected</span><span> Class<?>[] getRootConfigClasses() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> Class<?>[]{RootConfig.</span><span class="keyword">class</span><span>}; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">protected</span><span> Class<?>[] getServletConfigClasses() { </span></span></li><li class=""><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> Class<?>[]{WebConfig.</span><span class="keyword">class</span><span>}; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">protected</span><span> String[] getServletMappings() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> String[]{</span><span class="string">"/"</span><span>}; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160512_35_673336" name="code" class="java" style="display: none;">import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class SpitterWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}</pre>
<p></p>
<p>AbstractAnnotationConfigDispatcherServletInitializer这个类负责配置DispatcherServlet、初始化Spring MVC容器和Spring容器。<br>
</p>
<br>
正如可以通过多种方式配置DispatcherServlet一样,也可以通过多种方式启动Spring MVC特性。原来我们一般在xml文件中使用<mvc:annotation-driven>元素启动注解驱动的Spring MVC特性。这里我们使用JavaConfig配置,最简单的Spring MVC配置类代码如下:<br>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 21908px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_36" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_36" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=36&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.Bean; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.context.annotation.ComponentScan; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.Configuration; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.web.servlet.ViewResolver; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.web.servlet.config.annotation.EnableWebMvc; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.web.servlet.view.InternalResourceViewResolver; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="annotation">@Configuration</span><span> </span></span></li><li class="alt"><span><span class="annotation">@EnableWebMvc</span><span> </span></span></li><li class=""><span><span class="annotation">@ComponentScan</span><span>(</span><span class="string">"com.xxx.controller"</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> WebConfig </span><span class="keyword">extends</span><span> WebMvcConfigurerAdapter{ </span></span></li><li class=""><span> <span class="annotation">@Bean</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> ViewResolver viewResolver() { </span><span class="comment">//配置JSP视图解析器</span><span> </span></span></li><li class=""><span> InternalResourceViewResolver resolver = <span class="keyword">new</span><span> InternalResourceViewResolver(); </span></span></li><li class="alt"><span> resolver.setPrefix(<span class="string">"/WEB-INF/views/"</span><span>); </span></span></li><li class=""><span> resolver.setSuffix(<span class="string">".jsp"</span><span>); </span></span></li><li class="alt"><span> <span class="comment">//可以在JSP页面中通过${}访问beans</span><span> </span></span></li><li class=""><span> resolver.setExposeContextBeansAsAttributes(<span class="keyword">true</span><span>); </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> resolver; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { </span></span></li><li class=""><span> configurer.enable(); <span class="comment">//配置静态文件处理</span><span> </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160512_36_6147194" name="code" class="java" style="display: none;">import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
@ComponentScan("com.xxx.controller")
public class WebConfig extends WebMvcConfigurerAdapter{
@Bean
public ViewResolver viewResolver() { //配置JSP视图解析器
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
//可以在JSP页面中通过${}访问beans
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable(); //配置静态文件处理
}
}</pre>@Configuration表示这是Java配置类;@EnableWebMvc注解用于启动Spring MVC特性。<br>
<br>
<p>通过@ComponentScan注解指定bean的自动发现机制作用的范围,被@Controller等注解修饰的web的bean将被发现并加载到spring mvc应用容器,这样就不需要在配置类中显式定义任何控制器bean了。<br>
<br>
通过@Bean注解添加一个ViewResolverbean,具体来说是InternalResourceViewResolver。</p>
<p><br>
</p>
<p>RootConfig的配置就非常简单了,唯一需要注意的是,它在设置扫描机制的时候,将之前WebConfig设置过的那个包排除了;也就是说,这两个扫描机制作用的范围正交。RootConfig的代码如下:<br>
</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 22715px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_37" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_37" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=37&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.ComponentScan; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.context.annotation.Configuration; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.FilterType; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.web.servlet.config.annotation.EnableWebMvc; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="annotation">@Configuration</span><span> </span></span></li><li class="alt"><span><span class="annotation">@ComponentScan</span><span>(basePackages = {</span><span class="string">"com.xxx.*"</span><span>}, </span></span></li><li class=""><span> excludeFilters = {<span class="annotation">@ComponentScan</span><span>.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.</span><span class="keyword">class</span><span>)}) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> RootConfig { </span></span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160512_37_9816687" name="code" class="java" style="display: none;">import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@ComponentScan(basePackages = {"com.xxx.*"},
excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)})
public class RootConfig {
}</pre>
<p></p>
<p><br>
</p>
写一个控制器,定义之前的IOC对象PerformanceI
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 23016px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_38" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_38" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=38&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Controller</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> HomeController { </span></span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> PerformanceI p1; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@RequestMapping</span><span>(value = </span><span class="string">"/home"</span><span>, method = RequestMethod.GET) </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> String home() { </span></span></li><li class=""><span> p1.perform(); </span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="string">"home"</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160512_38_3022272" name="code" class="java" style="display: none;">@Controller
public class HomeController {
@Autowired
private PerformanceI p1;
@RequestMapping(value = "/home", method = RequestMethod.GET)
public String home() {
p1.perform();
return "home";
}
}</pre>
<p></p>
<p><br>
</p>
在WEB-INF/views下新增模板文件home.jsp<br>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 483px; top: 23335px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_39" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_39" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=39&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span>%@page </span><span class="attribute">contentType</span><span>=</span><span class="attribute-value">"text/html"</span><span> </span><span class="attribute">pageEncoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span>%</span><span class="tag">></span><span> </span></span></li><li class=""><span><!DOCTYPE html<span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">html</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">head</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">meta</span><span> </span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">"Content-Type"</span><span> </span><span class="attribute">content</span><span>=</span><span class="attribute-value">"text/html; charset=UTF-8"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">title</span><span class="tag">></span><span>JSP Page</span><span class="tag"></</span><span class="tag-name">title</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">head</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">body</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">h1</span><span class="tag">></span><span>Spring4 & Sping MVC4 </span><span class="tag"></</span><span class="tag-name">h1</span><span class="tag">></span><span class="tag"><</span><span class="tag-name">p</span><span class="tag">></span><span>demo by http://blog.youkuaiyun.com/unix21</span><span class="tag"></</span><span class="tag-name">p</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">body</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">html</span><span class="tag">></span><span> </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160512_39_4309027" name="code" class="html" style="display: none;"><%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Spring4 & Sping MVC4 </h1><p>demo by http://blog.youkuaiyun.com/unix21</p>
</body>
</html></pre><br>
<img src="https://img-blog.youkuaiyun.com/20160512184441038" alt=""><br>
<br>
<p><br>
</p>
<p>下面这个是【第5章】的翻译 <a target="_blank" href="https://segmentfault.com/a/1190000004343063?_ea=575820">https://segmentfault.com/a/1190000004343063?_ea=575820</a></p>
<p><br>
</p>
<p><strong>默认首页</strong></p>
<p>我们希望用户访问域名直接到默认首页,那么需要删除网站web目录下的index.html。</p>
<p><em>tomcat会自动默认去寻找在webroot目录下面的index文件,如果要使用自定义方法,则要保证webroot下面没有index相关的文件。</em><br>
</p>
<p><img src="https://img-blog.youkuaiyun.com/20160524101148606" alt=""><br>
</p>
<p>自己写一个index</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 24611px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_40" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_40" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=40&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RequestMapping</span><span>(value = </span><span class="string">"/"</span><span>, method = RequestMethod.GET) </span></span></li><li class=""><span> <span class="keyword">public</span><span> String index() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="string">"index"</span><span>; </span></span></li><li class=""><span> } </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160524_40_7126367" name="code" class="java" style="display: none;">@RequestMapping(value = "/", method = RequestMethod.GET)
public String index() {
return "index";
}</pre><br>
再定义一个index.jsp即可
<p></p>
<p>具体请参考:<a target="_blank" href="http://blog.youkuaiyun.com/caiwenfeng_for_23/article/details/45486233">Spring MVC 下设置默认访问页面的3种方式</a></p>
<p><br>
</p>
<p><strong>映射多个地址</strong></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 24882px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_41" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_41" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=41&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RequestMapping</span><span>(value = {</span><span class="string">""</span><span>, </span><span class="string">"/"</span><span>,</span><span class="string">"index"</span><span>}, method = RequestMethod.GET) </span></span></li><li class=""><span> <span class="keyword">public</span><span> String index() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="string">"index"</span><span>; </span></span></li><li class=""><span> } </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160524_41_491318" name="code" class="java" style="display: none;"> @RequestMapping(value = {"", "/","index"}, method = RequestMethod.GET)
public String index() {
return "index";
}</pre>或者<br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 25049px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_42" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_42" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=42&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RequestMapping</span><span>({</span><span class="string">""</span><span>, </span><span class="string">"/"</span><span>,</span><span class="string">"index"</span><span>}) </span></span></li><li class=""><span> <span class="keyword">public</span><span> String index() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="string">"index"</span><span>; </span></span></li><li class=""><span> } </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160524_42_5333104" name="code" class="java" style="display: none;"> @RequestMapping({"", "/","index"})
public String index() {
return "index";
}</pre>
<p><br>
</p>
<p><strong>输出json</strong></p>
<p>形式一</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 25268px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_43" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_43" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=43&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@ResponseBody</span><span> </span></span></li><li class=""><span> <span class="annotation">@RequestMapping</span><span>(value = </span><span class="string">"/list"</span><span>, method = RequestMethod.GET,produces = </span><span class="string">"text/json;charset=UTF-8"</span><span>) </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> String h1(HttpServletRequest req, HttpServletResponse res) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class=""><span> UserBean user= ...; </span></li><li class="alt"><span> ObjectMapper mapper = <span class="keyword">new</span><span> ObjectMapper(); </span></span></li><li class=""><span> String js=mapper.writeValueAsString(user); </span></li><li class="alt"><span> <span class="keyword">return</span><span> js; </span></span></li><li class=""><span> } </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160524_43_3534685" name="code" class="java" style="display: none;">@ResponseBody
@RequestMapping(value = "/list", method = RequestMethod.GET,produces = "text/json;charset=UTF-8")
public String h1(HttpServletRequest req, HttpServletResponse res) throws Exception {
UserBean user= ...;
ObjectMapper mapper = new ObjectMapper();
String js=mapper.writeValueAsString(user);
return js;
}</pre>
<p></p>
<p><br>
</p>
形式二
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 25533px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_44" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_44" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=44&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@ResponseBody</span><span> </span></span></li><li class=""><span> <span class="annotation">@RequestMapping</span><span>(value = </span><span class="string">"/list"</span><span>, method = RequestMethod.GET) </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> list(HttpServletRequest req, HttpServletResponse res) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class=""><span> res.setContentType(<span class="string">"text/json;charset=UTF-8"</span><span>); </span></span></li><li class="alt"><span> UserBean user= ...; </span></li><li class=""><span> ObjectMapper mapper = <span class="keyword">new</span><span> ObjectMapper(); </span></span></li><li class="alt"><span> String js=mapper.writeValueAsString(user); </span></li><li class=""><span> PrintWriter pWriter = res.getWriter(); </span></li><li class="alt"><span> pWriter.write(js); </span></li><li class=""><span> } </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160524_44_6424624" name="code" class="java" style="display: none;">@ResponseBody
@RequestMapping(value = "/list", method = RequestMethod.GET)
public void list(HttpServletRequest req, HttpServletResponse res) throws Exception {
res.setContentType("text/json;charset=UTF-8");
UserBean user= ...;
ObjectMapper mapper = new ObjectMapper();
String js=mapper.writeValueAsString(user);
PrintWriter pWriter = res.getWriter();
pWriter.write(js);
}</pre>
<p></p>
<br>
<p></p>
<p><strong><span style="font-size:18px">4.Spring4整合MyBatis3</span></strong></p>
<p>说明:《Spring实战(第4版)》并没有提到MyBatis的整合,这个是我自己写的,写一起只为查看方便。</p>
<p>新建MybatisConfig文件</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 25886px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_45" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_45" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=45&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> javax.sql.DataSource; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.mybatis.spring.SqlSessionFactoryBean; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.mybatis.spring.mapper.MapperScannerConfigurer; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.context.annotation.Bean; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.Configuration; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.jdbc.datasource.DataSourceTransactionManager; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.jdbc.datasource.DriverManagerDataSource; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.transaction.PlatformTransactionManager; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.transaction.annotation.EnableTransactionManagement; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@Configuration</span><span> </span></span></li><li class=""><span><span class="annotation">@EnableTransactionManagement</span><span> </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> MybatisConfig { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Bean</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> DataSource dataSource() { </span></span></li><li class="alt"><span> DriverManagerDataSource dataSource = <span class="keyword">new</span><span> DriverManagerDataSource(); </span></span></li><li class=""><span> dataSource.setUsername(<span class="string">"admin"</span><span>); </span></span></li><li class="alt"><span> dataSource.setPassword(<span class="string">"admin"</span><span>); </span></span></li><li class=""><span> dataSource.setDriverClassName(<span class="string">"com.microsoft.sqlserver.jdbc.SQLServerDriver"</span><span>);</span><span class="comment">//如果其他数据库换对应的驱动即可</span><span> </span></span></li><li class="alt"><span> dataSource.setUrl(<span class="string">"jdbc:sqlserver://blog.youkuaiyun.com.unix21:3499;DatabaseName=testdb"</span><span>); </span></span></li><li class=""><span> <span class="keyword">return</span><span> dataSource; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Bean</span><span> </span></span></li><li class=""><span> MapperScannerConfigurer mpperScannnerConfigurer() { </span></li><li class="alt"><span> MapperScannerConfigurer msc = <span class="keyword">new</span><span> MapperScannerConfigurer(); </span></span></li><li class=""><span> msc.setSqlSessionFactoryBeanName(<span class="string">"sqlSessionFactory"</span><span>); </span></span></li><li class="alt"><span> msc.setBasePackage(<span class="string">"com.unix.mapper"</span><span>);</span><span class="comment">//自动扫描mapper包</span><span> </span></span></li><li class=""><span> <span class="keyword">return</span><span> msc; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Bean</span><span>(name = </span><span class="string">"sqlSessionFactory"</span><span>) </span></span></li><li class=""><span> SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) { </span></li><li class="alt"><span> SqlSessionFactoryBean ssfb = <span class="keyword">new</span><span> SqlSessionFactoryBean(); </span></span></li><li class=""><span> ssfb.setDataSource(dataSource); </span></li><li class="alt"><span> ssfb.setTypeAliasesPackage(<span class="string">"com.unix.bean"</span><span>);</span><span class="comment">//自动扫描bean包</span><span> </span></span></li><li class=""><span> <span class="keyword">return</span><span> ssfb; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Bean</span><span> </span></span></li><li class=""><span> PlatformTransactionManager transactionManager(DataSource dataSource) { </span></li><li class="alt"><span> DataSourceTransactionManager transactionManager = <span class="keyword">new</span><span> DataSourceTransactionManager(); </span></span></li><li class=""><span> transactionManager.setDataSource(dataSource); </span></li><li class="alt"><span> <span class="keyword">return</span><span> transactionManager; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160513_40_7431098" name="code" class="java" style="display: none;">import javax.sql.DataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
public class MybatisConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUsername("admin");
dataSource.setPassword("admin");
dataSource.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//如果其他数据库换对应的驱动即可
dataSource.setUrl("jdbc:sqlserver://blog.youkuaiyun.com.unix21:3499;DatabaseName=testdb");
return dataSource;
}
@Bean
MapperScannerConfigurer mpperScannnerConfigurer() {
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setSqlSessionFactoryBeanName("sqlSessionFactory");
msc.setBasePackage("com.unix.mapper");//自动扫描mapper包
return msc;
}
@Bean(name = "sqlSessionFactory")
SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
ssfb.setDataSource(dataSource);
ssfb.setTypeAliasesPackage("com.unix.bean");//自动扫描bean包
return ssfb;
}
@Bean
PlatformTransactionManager transactionManager(DataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}</pre><br>
新增一个mapper接口
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 26853px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_46" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_46" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=46&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">interface</span><span> SchoolMapper { </span></span></li><li class=""><span> <span class="annotation">@Select</span><span>(</span><span class="string">"select * from School where id =#{id}"</span><span>) </span></span></li><li class="alt"><span> School findById(<span class="annotation">@Param</span><span>(</span><span class="string">"id"</span><span>) </span><span class="keyword">int</span><span> id); </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Select</span><span>(</span><span class="string">"select * from School where Name like '${name}%'"</span><span>) </span></span></li><li class=""><span> List<School> findByName(<span class="annotation">@Param</span><span>(</span><span class="string">"name"</span><span>) String name); </span></span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160513_41_1782517" name="code" class="java" style="display: none;">public interface SchoolMapper {
@Select("select * from School where id =#{id}")
School findById(@Param("id") int id);
@Select("select * from School where Name like '${name}%'")
List<School> findByName(@Param("name") String name);
}</pre><br>
测试用例
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 27100px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_47" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_47" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=47&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = MybatisConfig.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="comment">//@TransactionConfiguration(defaultRollback=true)</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SchoolTest { </span></span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> SchoolMapper shoolDao; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> findById(){ </span></span></li><li class=""><span> School shool = shoolDao.findById(<span class="number">1</span><span>); </span></span></li><li class="alt"><span> Assert.assertNotNull(shool); </span></li><li class=""><span> System.out.println(shool.getName()); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Test</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> findByName(){ </span></span></li><li class="alt"><span> List<School> result = shoolDao.findByName(<span class="string">"苏州中学"</span><span>); </span></span></li><li class=""><span> Assert.assertNotNull(result); </span></li><li class="alt"><span> <span class="keyword">for</span><span> (School s : result) { </span></span></li><li class=""><span> System.out.println(s.getName()); </span></li><li class="alt"><span> } </span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160513_42_3036253" name="code" class="java" style="display: none;">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MybatisConfig.class)
//@TransactionConfiguration(defaultRollback=true)
public class SchoolTest {
@Autowired
private SchoolMapper shoolDao;
@Test
public void findById(){
School shool = shoolDao.findById(1);
Assert.assertNotNull(shool);
System.out.println(shool.getName());
}
@Test
public void findByName(){
List<School> result = shoolDao.findByName("苏州中学");
Assert.assertNotNull(result);
for (School s : result) {
System.out.println(s.getName());
}
}
}</pre>
<p><br>
</p>
<p><span style="font-size:18px"><strong>5.Spring4使用<a href="http://lib.youkuaiyun.com/base/redis" class="replace_word" title="Redis知识库" target="_blank" style="color:#df3434; font-weight:bold;">Redis</a></strong></span></p>
<p><a href="http://lib.youkuaiyun.com/base/redis" class="replace_word" title="Redis知识库" target="_blank" style="color:#df3434; font-weight:bold;">redis</a>在日常开发中已经成为了标配了,在spring4中使用redis非常简单,无需自己去写一个jedis的工厂方法连接池之类的代码,因为Spring已经写好了,你只需要引用spring-data-redis包即可</p>
<p></p>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 483px; top: 27687px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_48" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_48" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=48&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">dependency</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">groupId</span><span class="tag">></span><span>org.springframework.data</span><span class="tag"></</span><span class="tag-name">groupId</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">artifactId</span><span class="tag">></span><span>spring-data-redis</span><span class="tag"></</span><span class="tag-name">artifactId</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">version</span><span class="tag">></span><span>1.7.1.RELEASE</span><span class="tag"></</span><span class="tag-name">version</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">dependency</span><span class="tag">></span><span> </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160516_43_1714955" name="code" class="html" style="display: none;"><dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.7.1.RELEASE</version>
</dependency></pre><br>
Redis配置
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 27898px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_49" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_49" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=49&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Configuration</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> RedisConfig { </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Bean</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> RedisConnectionFactory redisCF() { </span></span></li><li class=""><span> JedisConnectionFactory cf = <span class="keyword">new</span><span> JedisConnectionFactory(); </span></span></li><li class="alt"><span> cf.setHostName(<span class="string">"127.0.0.1"</span><span>);</span><span class="comment">//服务器IP</span><span> </span></span></li><li class=""><span> cf.setPort(<span class="number">6379</span><span>);</span><span class="comment">//端口</span><span> </span></span></li><li class="alt"><span> cf.setPassword(<span class="string">"密码"</span><span>); </span></span></li><li class=""><span> <span class="keyword">return</span><span> cf; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Bean</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) { </span></span></li><li class="alt"><span> RedisTemplate<String, String> redis = <span class="keyword">new</span><span> RedisTemplate<String, String>(); </span></span></li><li class=""><span> redis.setConnectionFactory(cf); </span></li><li class="alt"><span> <span class="keyword">return</span><span> redis; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Bean</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> StringRedisTemplate stringRedisTemplate(RedisConnectionFactory cf) { </span></span></li><li class=""><span> StringRedisTemplate redis = <span class="keyword">new</span><span> StringRedisTemplate(); </span></span></li><li class="alt"><span> redis.setConnectionFactory(cf); </span></li><li class=""><span> <span class="keyword">return</span><span> redis; </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160516_44_7952964" name="code" class="java" style="display: none;">@Configuration
public class RedisConfig {
@Bean
public RedisConnectionFactory redisCF() {
JedisConnectionFactory cf = new JedisConnectionFactory();
cf.setHostName("127.0.0.1");//服务器IP
cf.setPort(6379);//端口
cf.setPassword("密码");
return cf;
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
RedisTemplate<String, String> redis = new RedisTemplate<String, String>();
redis.setConnectionFactory(cf);
return redis;
}
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory cf) {
StringRedisTemplate redis = new StringRedisTemplate();
redis.setConnectionFactory(cf);
return redis;
}
}</pre><br>
测试用例
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 28487px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_50" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_50" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=50&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = RedisConfig.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> RedisTest { </span></span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> StringRedisTemplate r1; </span></span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> get() { </span></span></li><li class=""><span> </span></li><li class="alt"><span> String foo=DateUtil.getNowTimeString(); </span></li><li class=""><span> r1.opsForValue().set(<span class="string">"foo"</span><span>, foo); </span></span></li><li class="alt"><span> </span></li><li class=""><span> foo=r1.opsForValue().get(<span class="string">"foo"</span><span>); </span></span></li><li class="alt"><span> System.out.println(<span class="string">"【Redis 测试>>>get set】"</span><span>+foo+</span><span class="string">"By http://blog.youkuaiyun.com/unix21"</span><span>); </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160516_45_5586413" name="code" class="java" style="display: none;">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = RedisConfig.class)
public class RedisTest {
@Autowired
private StringRedisTemplate r1;
@Test
public void get() {
String foo=DateUtil.getNowTimeString();
r1.opsForValue().set("foo", foo);
foo=r1.opsForValue().get("foo");
System.out.println("【Redis 测试>>>get set】"+foo+"By http://blog.youkuaiyun.com/unix21");
}
}</pre><br>
<p><img src="https://img-blog.youkuaiyun.com/20160516143826717" alt=""></p>
<p><br>
</p>
<p><span style="font-size:18px"><strong>6.Spring Security</strong></span></p>
<p><br>
</p>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 483px; top: 29368px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_51" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_51" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=51&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span>import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; </span></span></li><li class=""><span> </span></li><li class="alt"><span>public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer { </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160518_46_1523177" name="code" class="html" style="display: none;">import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer {
}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 29535px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_52" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_52" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=52&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Configuration</span><span> </span></span></li><li class=""><span><span class="annotation">@EnableWebMvcSecurity</span><span> </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SecuredConfig </span><span class="keyword">extends</span><span> WebSecurityConfigurerAdapter { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> configure(HttpSecurity http) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class="alt"><span> </span></li><li class=""><span> http </span></li><li class="alt"><span> .authorizeRequests() </span></li><li class=""><span> .anyRequest().authenticated() </span></li><li class="alt"><span> .and() </span></li><li class=""><span> .formLogin() </span></li><li class="alt"><span> .and() </span></li><li class=""><span> .httpBasic(); </span></li><li class="alt"><span> </span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160518_47_4729543" name="code" class="java" style="display: none;">@Configuration
@EnableWebMvcSecurity
public class SecuredConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
}
}</pre>
<p></p>
<p><br>
</p>
这个时候访问任何页面都会跳转到系统自带的登陆页面<br>
<p><img src="https://img-blog.youkuaiyun.com/20160518150056762" alt=""></p>
<p>基于内存的用户存储:</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 30153px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_53" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_53" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=53&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="comment">//基于内存的用户</span><span> </span></span></li><li class=""><span><span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span><span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> configure(AuthenticationManagerBuilder auth) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class=""><span> auth </span></li><li class="alt"><span> .inMemoryAuthentication() </span></li><li class=""><span> .withUser(<span class="string">"user1"</span><span>).password(</span><span class="string">"pass1"</span><span>).roles(</span><span class="string">"USER"</span><span>).and() </span></span></li><li class="alt"><span> .withUser(<span class="string">"user2"</span><span>).password(</span><span class="string">"pass2"</span><span>).roles(</span><span class="string">"USER"</span><span>,</span><span class="string">"ADMIN"</span><span>); </span></span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160518_48_5327040" name="code" class="java" style="display: none;"> //基于内存的用户
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user1").password("pass1").roles("USER").and()
.withUser("user2").password("pass2").roles("USER","ADMIN");
}</pre><br>
<br>
<p></p>
故意输错用户名密码就进不去<br>
<p><img src="https://img-blog.youkuaiyun.com/20160518150906754" alt=""></p>
<p><br>
</p>
<p>验证 <span style="background-color:rgb(255,255,0)">指定页面</span>+<span style="background-color:rgb(255,255,0)">指定权限</span></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 30691px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_54" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_54" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=54&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Override</span><span> </span></span></li><li class=""><span><span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> configure(HttpSecurity http) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class="alt"><span> http </span></li><li class=""><span> .authorizeRequests() </span></li><li class="alt"><span> .antMatchers(<span class="string">"/news"</span><span>).hasRole(</span><span class="string">"USER"</span><span>) </span></span></li><li class=""><span> .and() </span></li><li class="alt"><span> .formLogin() </span></li><li class=""><span> .and() </span></li><li class="alt"><span> .httpBasic(); </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160518_49_399932" name="code" class="java" style="display: none;"> @Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/news").hasRole("USER")
.and()
.formLogin()
.and()
.httpBasic();
}</pre><br>
<br>
<p></p>
<p></p>
<p><br>
</p>
我们设定/news需要User角色的用户可以看,其他页面随便看<br>
<p><img src="https://img-blog.youkuaiyun.com/20160518174042974" alt=""></p>
<p><br>
</p>
<p>我们用user2登陆,由于没权限返回403</p>
<p><img src="https://img-blog.youkuaiyun.com/20160518175007862?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""><br>
</p>
<p>只有用user1登陆才可以看到页面内容。</p>
<p><br>
</p>
<p><strong>自定义登陆页</strong></p>
<p>现实开发中不肯能用Spring提供的简易登陆页,除非是一个很小的内部系统。</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 31798px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_55" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_55" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=55&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Configuration</span><span> </span></span></li><li class=""><span><span class="annotation">@EnableWebMvcSecurity</span><span> </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SecuredConfig </span><span class="keyword">extends</span><span> WebSecurityConfigurerAdapter { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> configure(HttpSecurity http) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class="alt"><span> http </span></li><li class=""><span> .authorizeRequests() </span></li><li class="alt"><span> .antMatchers(<span class="string">"/news/*"</span><span>).hasRole(</span><span class="string">"USER"</span><span>) </span></span></li><li class=""><span> .and() </span></li><li class="alt"><span> .formLogin() </span></li><li class=""><span> .loginPage(<span class="string">"/login"</span><span>) </span></span></li><li class="alt"><span> .defaultSuccessUrl(<span class="string">"/"</span><span>) </span></span></li><li class=""><span> .failureUrl(<span class="string">"/login?error"</span><span>) </span></span></li><li class="alt"><span> .permitAll() </span></li><li class=""><span> .and() </span></li><li class="alt"><span> .httpBasic(); </span></li><li class=""><span> } </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160519_50_3876130" name="code" class="java" style="display: none;">@Configuration
@EnableWebMvcSecurity
public class SecuredConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/news/*").hasRole("USER")
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/")
.failureUrl("/login?error")
.permitAll()
.and()
.httpBasic();
}</pre><br>
.antMatchers("/news/*").hasRole("USER") :匹配 /news/以及/news/ 开头的所有页面 需要USER权限<br>
<p></p>
<p>.loginPage("/login") :自定义登陆页<br>
.defaultSuccessUrl("/") :默认成功页,如果没有权限则跳转到该页面</p>
<p> .failureUrl("/login?error") :默认失败页面<br>
</p>
<p><br>
</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 32347px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_56" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_56" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=56&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="comment">// 1. /login 登录页面的常规显示</span><span> </span></span></li><li class=""><span><span class="comment">// 2. /login?error 登录验证失败的展示</span><span> </span></span></li><li class="alt"><span><span class="comment">// 3. /login?logout 注销登录的处理</span><span> </span></span></li><li class=""><span><span class="annotation">@RequestMapping</span><span>(value = </span><span class="string">"/login"</span><span>, method = RequestMethod.GET) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> ModelAndView login( </span></span></li><li class=""><span> <span class="annotation">@RequestParam</span><span>(value = </span><span class="string">"error"</span><span>, required = </span><span class="keyword">false</span><span>) String error, </span></span></li><li class="alt"><span> <span class="annotation">@RequestParam</span><span>(value = </span><span class="string">"logout"</span><span>, required = </span><span class="keyword">false</span><span>) String logout) { </span></span></li><li class=""><span> </span></li><li class="alt"><span> ModelAndView model = <span class="keyword">new</span><span> ModelAndView(); </span></span></li><li class=""><span> <span class="keyword">if</span><span> (error != </span><span class="keyword">null</span><span>) { </span></span></li><li class="alt"><span> model.addObject(<span class="string">"error"</span><span>, </span><span class="string">"用户名密码不对!"</span><span>); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">if</span><span> (logout != </span><span class="keyword">null</span><span>) { </span></span></li><li class="alt"><span> model.addObject(<span class="string">"msg"</span><span>, </span><span class="string">"You've been logged out successfully."</span><span>); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> model.setViewName(<span class="string">"login"</span><span>); </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">return</span><span> model; </span></span></li><li class=""><span> </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160519_51_5130649" name="code" class="java" style="display: none;">
// 1. /login 登录页面的常规显示
// 2. /login?error 登录验证失败的展示
// 3. /login?logout 注销登录的处理
@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView login(
@RequestParam(value = "error", required = false) String error,
@RequestParam(value = "logout", required = false) String logout) {
ModelAndView model = new ModelAndView();
if (error != null) {
model.addObject("error", "用户名密码不对!");
}
if (logout != null) {
model.addObject("msg", "You've been logged out successfully.");
}
model.setViewName("login");
return model;
}</pre><br>
login.jsp
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 32846px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_57" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_57" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=57&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span><%</span><span class="annotation">@page</span><span> contentType=</span><span class="string">"text/html"</span><span> pageEncoding=</span><span class="string">"UTF-8"</span><span>%> </span></span></li><li class=""><span><html> </span></li><li class="alt"><span> <head> </span></li><li class=""><span> <title>登陆</title> </span></li><li class="alt"><span> </head> </span></li><li class=""><span> <body οnlοad=<span class="string">'document.f.username.focus();'</span><span>> </span></span></li><li class="alt"><span> <h3>登陆页</h3> </span></li><li class=""><span> <c:<span class="keyword">if</span><span> test=</span><span class="string">"${not empty error}"</span><span>> </span></span></li><li class="alt"><span> <div style=<span class="string">"color: red"</span><span>>${error}</div> </span></span></li><li class=""><span> </c:<span class="keyword">if</span><span>> </span></span></li><li class="alt"><span> <c:<span class="keyword">if</span><span> test=</span><span class="string">"${not empty msg}"</span><span>> </span></span></li><li class=""><span> <div>${msg}</div> </span></li><li class="alt"><span> </c:<span class="keyword">if</span><span>> </span></span></li><li class=""><span> <form name=<span class="string">'f'</span><span> action=</span><span class="string">'/gkweb/login'</span><span> method=</span><span class="string">'POST'</span><span>> </span></span></li><li class="alt"><span> <table> </span></li><li class=""><span> <tr><td>用户名:</td><td><input type=<span class="string">'text'</span><span> name=</span><span class="string">'username'</span><span> value=</span><span class="string">''</span><span>></td></tr> </span></span></li><li class="alt"><span> <tr><td>密码:</td><td><input type=<span class="string">'password'</span><span> name=</span><span class="string">'password'</span><span>/></td></tr> </span></span></li><li class=""><span> <tr><td colspan=<span class="string">'2'</span><span>><input name=</span><span class="string">"submit"</span><span> type=</span><span class="string">"submit"</span><span> value=</span><span class="string">"登陆"</span><span>/></td></tr> </span></span></li><li class="alt"><span> </table> </span></li><li class=""><span> <input type=<span class="string">"hidden"</span><span> name=</span><span class="string">"${_csrf.parameterName}"</span><span> </span></span></li><li class="alt"><span> value=<span class="string">"${_csrf.token}"</span><span> /> </span></span></li><li class=""><span> </form> </span></li><li class="alt"><span> </body> </span></li><li class=""><span></html> </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160519_52_1160915" name="code" class="java" style="display: none;"><%@page contentType="text/html" pageEncoding="UTF-8"%>
<html>
<head>
<title>登陆</title>
</head>
<body οnlοad='document.f.username.focus();'>
<h3>登陆页</h3>
<c:if test="${not empty error}">
<div style="color: red">${error}</div>
</c:if>
<c:if test="${not empty msg}">
<div>${msg}</div>
</c:if>
<form name='f' action='/gkweb/login' method='POST'>
<table>
<tr><td>用户名:</td><td><input type='text' name='username' value=''></td></tr>
<tr><td>密码:</td><td><input type='password' name='password'/></td></tr>
<tr><td colspan='2'><input name="submit" type="submit" value="登陆"/></td></tr>
</table>
<input type="hidden" name="${_csrf.parameterName}"
value="${_csrf.token}" />
</form>
</body>
</html></pre>此处参考:<a target="_blank" href="http://www.mkyong.com/spring-security/spring-security-form-login-example/">http://www.mkyong.com/spring-security/spring-security-form-login-example/</a>
<p></p>
<p><img src="https://img-blog.youkuaiyun.com/20160519115530515" alt=""><img src="https://img-blog.youkuaiyun.com/20160519115538285" alt=""></p>
<p><br>
</p>
<p>配置多个页面权限控制</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 33602px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_58" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_58" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=58&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>.antMatchers(</span><span class="string">"/news/*"</span><span>,</span><span class="string">"/user/*"</span><span>).hasRole(</span><span class="string">"USER"</span><span>) </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160519_53_5908456" name="code" class="java" style="display: none;">.antMatchers("/news/*","/user/*").hasRole("USER")</pre>
<p>写法二</p>
<p></p>
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><b>[cpp]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 475px; top: 33715px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_59" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_59" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=59&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span>.antMatchers(</span><span class="string">"/news/*"</span><span>).hasRole(</span><span class="string">"USER"</span><span>) </span></span></li><li class=""><span>.antMatchers(<span class="string">"/user/*"</span><span>).hasRole(</span><span class="string">"USER"</span><span>) </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_54_8112833" name="code" class="cpp" style="display: none;">.antMatchers("/news/*").hasRole("USER")
.antMatchers("/user/*").hasRole("USER")</pre>可以将任意多的antMatchers(),anyRequest()连接起来,但是这些规则会按给定的顺序发挥作用,所以需要将<strong>最为具体的请求路径放在最前面</strong>,而最不具体的路径anyRequest()放在后面,不然不具体的就会覆盖掉具体的。<br>
<br>
<p></p>
<br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 33924px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_60" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_60" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=60&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Override</span><span> </span></span></li><li class=""><span><span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> configure(HttpSecurity http) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class="alt"><span> http </span></li><li class=""><span> .authorizeRequests() </span></li><li class="alt"><span> .antMatchers(<span class="string">"/"</span><span>, </span><span class="string">"/home"</span><span>).permitAll() </span></span></li><li class=""><span> .anyRequest().authenticated() </span></li><li class="alt"><span> .and() </span></li><li class=""><span> .formLogin() </span></li><li class="alt"><span> .loginPage(<span class="string">"/login"</span><span>) </span></span></li><li class=""><span> .defaultSuccessUrl(<span class="string">"/helloadmin"</span><span>) </span></span></li><li class="alt"><span> .permitAll() </span></li><li class=""><span> .and() </span></li><li class="alt"><span> .logout() </span></li><li class=""><span> .permitAll(); </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160519_54_5838149" name="code" class="java" style="display: none;"> @Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/helloadmin")
.permitAll()
.and()
.logout()
.permitAll();
}</pre><br>
<p>对URL进行权限配置,使得"/", "/home"不需要登录就可以访问,其他需要登录。登录的地址是'/login',当登录成功后将跳转到/helloadmin页面,并且登录、登出页面都是不需要登录就可以访问的。</p>
<p>参考:<a target="_blank" href="http://www.tianmaying.com/tutorial/spring-security">使用Spring Security进行权限验证</a></p>
<p></p>
<p><br>
</p>
<p><strong>.httpBasic()</strong></p>
<p>支持弹窗就是windows自带的认证框进行认证。由于不好扩展这个基本没什么用,可以不用。</p>
<p><br>
</p>
<p><strong>.rememberMe()</strong></p>
<p>记住我的状态</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 34523px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_61" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_61" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=61&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>.rememberMe().key(</span><span class="string">"web"</span><span>) </span></span></li><li class=""><span> .tokenValiditySeconds(<span class="number">1209600</span><span>); </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_55_5929473" name="code" class="java" style="display: none;">.rememberMe().key("web")
.tokenValiditySeconds(1209600);</pre><br>
<p><img src="https://img-blog.youkuaiyun.com/20160520095339422" alt=""></p>
<p><strong>.logout()</strong><br>
</p>
<p>注销功能</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 34876px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_62" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_62" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=62&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> configure(HttpSecurity http) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class="alt"><span> http </span></li><li class=""><span> .authorizeRequests() </span></li><li class="alt"><span> .antMatchers(<span class="string">"/news/*"</span><span>).hasRole(</span><span class="string">"USER"</span><span>) </span></span></li><li class=""><span> .and() </span></li><li class="alt"><span> .formLogin() </span></li><li class=""><span> .loginPage(<span class="string">"/login"</span><span>) </span></span></li><li class="alt"><span> .defaultSuccessUrl(<span class="string">"/"</span><span>) </span></span></li><li class=""><span> .failureUrl(<span class="string">"/login?error"</span><span>) </span></span></li><li class="alt"><span> .usernameParameter(<span class="string">"username"</span><span>) </span></span></li><li class=""><span> .passwordParameter(<span class="string">"password"</span><span>) </span></span></li><li class="alt"><span> .and() </span></li><li class=""><span> .logout() </span></li><li class="alt"><span> .logoutSuccessUrl(<span class="string">"/login?logout"</span><span>) </span></span></li><li class=""><span> .and() </span></li><li class="alt"><span> .rememberMe().key(<span class="string">"gkweb"</span><span>) </span></span></li><li class=""><span> .tokenValiditySeconds(<span class="number">1209600</span><span>); </span></span></li><li class="alt"><span> } </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_56_4614253" name="code" class="java" style="display: none;"> @Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/news/*").hasRole("USER")
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/")
.failureUrl("/login?error")
.usernameParameter("username")
.passwordParameter("password")
.and()
.logout()
.logoutSuccessUrl("/login?logout")
.and()
.rememberMe().key("gkweb")
.tokenValiditySeconds(1209600);
}</pre><br>
注销就是页面给用户一个链接或者按钮
<p></p>
<p><strong>1.使用jstl声明</strong>退出路径</p>
<p>引用jar包</p>
<p></p>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 483px; top: 35391px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_63" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_63" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=63&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">dependency</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">groupId</span><span class="tag">></span><span>jstl</span><span class="tag"></</span><span class="tag-name">groupId</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">artifactId</span><span class="tag">></span><span>jstl</span><span class="tag"></</span><span class="tag-name">artifactId</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">version</span><span class="tag">></span><span>1.2</span><span class="tag"></</span><span class="tag-name">version</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">dependency</span><span class="tag">></span><span> </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_57_1724314" name="code" class="html" style="display: none;"><dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency></pre><br>
<p></p>
<p></p>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 483px; top: 35576px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_64" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_64" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=64&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span>%@ taglib </span><span class="attribute">uri</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsp/jstl/core"</span><span> </span><span class="attribute">prefix</span><span>=</span><span class="attribute-value">"c"</span><span> %</span><span class="tag">></span><span> </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_58_470578" name="code" class="html" style="display: none;"><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %></pre><div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 483px; top: 35645px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_65" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_65" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=65&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">c:url</span><span> </span><span class="attribute">var</span><span>=</span><span class="attribute-value">"logoutUrl"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"/logout"</span><span class="tag">/></span><span> </span></span></li><li class=""><span><span class="tag"><</span><span class="tag-name">form</span><span> </span><span class="attribute">action</span><span>=</span><span class="attribute-value">"${logoutUrl}"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">method</span><span>=</span><span class="attribute-value">"post"</span><span class="tag">></span><span> </span></span></li><li class=""><span><span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"submit"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">value</span><span>=</span><span class="attribute-value">"Log out"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span><span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"hidden"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">name</span><span>=</span><span class="attribute-value">"${_csrf.parameterName}"</span><span> </span></span></li><li class=""><span> <span class="attribute">value</span><span>=</span><span class="attribute-value">"${_csrf.token}"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">form</span><span class="tag">></span><span> </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_59_8452691" name="code" class="html" style="display: none;"><c:url var="logoutUrl" value="/logout"/>
<form action="${logoutUrl}"
method="post">
<input type="submit"
value="Log out" />
<input type="hidden"
name="${_csrf.parameterName}"
value="${_csrf.token}"/>
</form></pre><br>
<br>
<strong>2.硬编码</strong>退出路径
<p></p>
<p></p>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 483px; top: 35954px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_66" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_66" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=66&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">form</span><span> </span><span class="attribute">action</span><span>=</span><span class="attribute-value">"${pageContext.request.contextPath}/logout"</span><span> </span><span class="attribute">method</span><span>=</span><span class="attribute-value">"post"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"submit"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"Logout"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"hidden"</span><span> </span></span></li><li class=""><span> <span class="attribute">name</span><span>=</span><span class="attribute-value">"${_csrf.parameterName}"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">value</span><span>=</span><span class="attribute-value">"${_csrf.token}"</span><span class="tag">/></span><span> </span></span></li><li class=""><span><span class="tag"></</span><span class="tag-name">form</span><span class="tag">></span><span> </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_60_5247108" name="code" class="html" style="display: none;"><form action="${pageContext.request.contextPath}/logout" method="post">
<input type="submit" value="Logout" />
<input type="hidden"
name="${_csrf.parameterName}"
value="${_csrf.token}"/>
</form></pre><br>
<p>3.链接退出</p>
<p></p>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 483px; top: 36183px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_67" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_67" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=67&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">script</span><span class="tag">></span><span> </span></span></li><li class=""><span> function formSubmit() { </span></li><li class="alt"><span> document.getElementById("logoutForm").submit(); </span></li><li class=""><span> } </span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">script</span><span class="tag">></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">form</span><span> </span><span class="attribute">action</span><span>=</span><span class="attribute-value">"${pageContext.request.contextPath}/logout"</span><span> </span><span class="attribute">method</span><span>=</span><span class="attribute-value">"post"</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"logoutForm"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">c:if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"${pageContext.request.userPrincipal.name != null}"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">h2</span><span class="tag">></span><span> </span></span></li><li class=""><span> Welcome : ${pageContext.request.userPrincipal.name} | <span class="tag"><</span><span class="tag-name">a</span><span> </span><span class="attribute">href</span><span>=</span><span class="attribute-value">"javascript:formSubmit()"</span><span class="tag">></span><span> 退出1-链接</span><span class="tag"></</span><span class="tag-name">a</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">h2</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">c:if</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"submit"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"退出1-按钮"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"hidden"</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"${_csrf.parameterName}"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"${_csrf.token}"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">form</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">c:url</span><span> </span><span class="attribute">var</span><span>=</span><span class="attribute-value">"logoutUrl"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"/logout"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">form</span><span> </span><span class="attribute">action</span><span>=</span><span class="attribute-value">"${logoutUrl}"</span><span> </span><span class="attribute">method</span><span>=</span><span class="attribute-value">"post"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">c:if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"${pageContext.request.userPrincipal.name != null}"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">h2</span><span class="tag">></span><span> </span></span></li><li class=""><span> Welcome : ${pageContext.request.userPrincipal.name} | <span class="tag"><</span><span class="tag-name">a</span><span> </span><span class="attribute">href</span><span>=</span><span class="attribute-value">"javascript:formSubmit()"</span><span class="tag">></span><span> 退出2-链接</span><span class="tag"></</span><span class="tag-name">a</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">h2</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">c:if</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"submit"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"退出2-按钮"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"hidden"</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"${_csrf.parameterName}"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"${_csrf.token}"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">form</span><span class="tag">></span><span> </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_62_4876958" name="code" class="html" style="display: none;"><script>
function formSubmit() {
document.getElementById("logoutForm").submit();
}
</script>
<form action="${pageContext.request.contextPath}/logout" method="post" id="logoutForm">
<c:if test="${pageContext.request.userPrincipal.name != null}">
<h2>
Welcome : ${pageContext.request.userPrincipal.name} | <a href="javascript:formSubmit()"> 退出1-链接</a>
</h2>
</c:if>
<input type="submit" value="退出1-按钮" />
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form>
<c:url var="logoutUrl" value="/logout"/>
<form action="${logoutUrl}" method="post">
<c:if test="${pageContext.request.userPrincipal.name != null}">
<h2>
Welcome : ${pageContext.request.userPrincipal.name} | <a href="javascript:formSubmit()"> 退出2-链接</a>
</h2>
</c:if>
<input type="submit" value="退出2-按钮" />
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form></pre><br>
<p><strong>自定义的用户服务</strong></p>
<p>实际开发肯定是需要去<a href="http://lib.youkuaiyun.com/base/mysql" class="replace_word" title="MySQL知识库" target="_blank" style="color:#df3434; font-weight:bold;">数据库</a>或者其他地方查询用户账号密码等</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 36834px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_68" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_68" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=68&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> configure(AuthenticationManagerBuilder auth) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class="alt"><span> auth.userDetailsService(<span class="keyword">new</span><span> CustomUserDetailsService(userDao)); </span></span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_63_1349123" name="code" class="java" style="display: none;">@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(new CustomUserDetailsService(userDao));
}</pre>
<p></p>
<p><br>
</p>
<span style="color:#ff0000"><strong>注意:CustomUserDetailsService需要的bean一定要从userDetailsService调用CustomUserDetailsService的构造器传递过去,</strong></span>
<p><span style="color:#ff0000"><strong>而不能直接在CustomUserDetailsService使用@Autowired注解出来。</strong></span><br>
</p>
<p>CustomUserDetailsService集成的接口UserDetailsService无需自己重新定义,参考 <a target="_blank" href="http://blog.youkuaiyun.com/unix21/article/details/51450976">泛型推断类型不符合上限</a></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 37105px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_69" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_69" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=69&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CustomUserDetailsService </span><span class="keyword">implements</span><span> UserDetailsService { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">private</span><span> </span><span class="keyword">final</span><span> UserMapper userDao; </span></span></li><li class=""><span> <span class="keyword">public</span><span> CustomUserDetailsService(UserMapper u) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.userDao = u; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> UserDetails loadUserByUsername(String username) </span><span class="keyword">throws</span><span> UsernameNotFoundException { </span></span></li><li class=""><span> UserBean user = userDao.findByName(username); </span></li><li class="alt"><span> <span class="keyword">if</span><span> (user == </span><span class="keyword">null</span><span>) { </span></span></li><li class=""><span> <span class="keyword">throw</span><span> </span><span class="keyword">new</span><span> UsernameNotFoundException(</span><span class="string">"没有找到对应用户"</span><span>); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> List<SimpleGrantedAuthority> authorities = <span class="keyword">new</span><span> ArrayList<>(); </span></span></li><li class="alt"><span> authorities.add(<span class="keyword">new</span><span> SimpleGrantedAuthority(user.getUtype().toString())); </span></span></li><li class=""><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> org.springframework.security.core.userdetails.User(user.getUserName(), user.getPassword(), authorities); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_64_8699163" name="code" class="java" style="display: none;">public class CustomUserDetailsService implements UserDetailsService {
private final UserMapper userDao;
public CustomUserDetailsService(UserMapper u) {
this.userDao = u;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserBean user = userDao.findByName(username);
if (user == null) {
throw new UsernameNotFoundException("没有找到对应用户");
}
List<SimpleGrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority(user.getUtype().toString()));
return new org.springframework.security.core.userdetails.User(user.getUserName(), user.getPassword(), authorities);
}
}</pre><br>
<p></p>
<p><strong>跨站攻击</strong></p>
<p>Spring Security3.2开始默认是开启的的,如果有特殊要求可以关闭跨站防御</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 37576px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_70" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_70" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=70&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>.csrf().disable(); </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160523_65_5466165" name="code" class="java" style="display: none;">.csrf().disable();</pre><br>
<br>
<p><strong>多权限组合</strong></p>
<p>需要注意要以页面为单位,不然下面的配置会和上面的冲突</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 37767px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_71" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_71" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=71&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>.authorizeRequests() </span></span></li><li class=""><span> .antMatchers(<span class="string">"/news/*"</span><span>,</span><span class="string">"/school/*"</span><span>).hasAnyRole(</span><span class="string">"1"</span><span>,</span><span class="string">"4"</span><span>) </span></span></li><li class="alt"><span> .antMatchers(<span class="string">"/goods/*"</span><span>).hasRole(</span><span class="string">"4"</span><span>) </span></span></li><li class=""><span> .and() </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160523_66_400534" name="code" class="java" style="display: none;">.authorizeRequests()
.antMatchers("/news/*","/school/*").hasAnyRole("1","4")
.antMatchers("/goods/*").hasRole("4")
.and()</pre><br>
<p><br>
<strong>自定义403页面</strong></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 37986px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_72" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_72" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=72&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>http.authorizeRequests() </span></span></li><li class=""><span> .antMatchers(<span class="string">"/admin/**"</span><span>).access(</span><span class="string">"hasRole('ROLE_ADMIN')"</span><span>) </span></span></li><li class="alt"><span> .and().formLogin() </span></li><li class=""><span> .loginPage(<span class="string">"/login"</span><span>).failureUrl(</span><span class="string">"/login?error"</span><span>) </span></span></li><li class="alt"><span> .usernameParameter(<span class="string">"username"</span><span>) </span></span></li><li class=""><span> .passwordParameter(<span class="string">"password"</span><span>) </span></span></li><li class="alt"><span> .and().logout().logoutSuccessUrl(<span class="string">"/login?logout"</span><span>) </span></span></li><li class=""><span> .and() </span></li><li class="alt"><span> .exceptionHandling().accessDeniedPage(<span class="string">"/403"</span><span>) </span></span></li><li class=""><span> } </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160523_67_5798687" name="code" class="java" style="display: none;">http.authorizeRequests()
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.and().formLogin()
.loginPage("/login").failureUrl("/login?error")
.usernameParameter("username")
.passwordParameter("password")
.and().logout().logoutSuccessUrl("/login?logout")
.and()
.exceptionHandling().accessDeniedPage("/403")
}</pre>
<p></p>
<p>然后自己写一个SpringMVC的/403页面即可</p>
参考:<a target="_blank" href="http://www.mkyong.com/spring-security/customize-http-403-access-denied-page-in-spring-security/">Spring Security : Customize 403 access denied page</a><br>
<p><br>
</p>
<p><strong>自定义404页面</strong></p>
<p>其实这个是SpringMVC干的事情,非常简单</p>
<p>定义一个</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 38391px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_73" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_73" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=73&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RequestMapping</span><span>(value = </span><span class="string">"*"</span><span>, method = RequestMethod.GET) </span></span></li><li class=""><span><span class="keyword">public</span><span> String my404() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="string">"404"</span><span>; </span></span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160523_68_7906442" name="code" class="java" style="display: none;"> @RequestMapping(value = "*", method = RequestMethod.GET)
public String my404() {
return "404";
}</pre><br>
<br>
<p><strong>POST参数中文乱码的解决</strong></p>
<p>注意,如果没有使用Springsecurity,那么可以直接在SpingWebInitializer定义一个getServletFilters()</p>
<p>如下:</p>
<p></p><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 38662px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_74" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_74" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=74&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> javax.servlet.Filter; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.web.filter.CharacterEncodingFilter; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SpingWebInitializer </span><span class="keyword">extends</span><span> AbstractAnnotationConfigDispatcherServletInitializer { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">protected</span><span> Class<?>[] getRootConfigClasses() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> Class<?>[]{RootConfig.</span><span class="keyword">class</span><span>}; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">protected</span><span> Class<?>[] getServletConfigClasses() { </span></span></li><li class=""><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> Class<?>[]{WebConfig.</span><span class="keyword">class</span><span>}; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">protected</span><span> String[] getServletMappings() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> String[]{</span><span class="string">"/"</span><span>}; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">protected</span><span> Filter[] getServletFilters() { </span></span></li><li class=""><span> CharacterEncodingFilter characterEncodingFilter = <span class="keyword">new</span><span> CharacterEncodingFilter(); </span></span></li><li class="alt"><span> characterEncodingFilter.setEncoding(<span class="string">"UTF-8"</span><span>); </span></span></li><li class=""><span> characterEncodingFilter.setForceEncoding(<span class="keyword">true</span><span>); </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> Filter[] { characterEncodingFilter}; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160727_74_1500266" name="code" class="java" style="display: none;">import javax.servlet.Filter;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class SpingWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return new Filter[] { characterEncodingFilter};
}
}</pre><p></p>
<p><br>
</p>
如果使用了Springsecurity,那么需要在Springsecurity的配置文件里配置,因为<strong>CharacterEncodingFilter 需要在 SecurityFilter之前启动</strong>
<p></p><div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><b>[cpp]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 475px; top: 39305px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_75" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_75" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=75&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SecuredConfig extends WebSecurityConfigurerAdapter { </span></span></li><li class=""><span>@Override </span></li><li class="alt"><span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> configure(HttpSecurity http) throws Exception { </span></span></li><li class=""><span> <span class="comment">//The CharacterEncodingFilter must be started before SecurityFilter. I moved it to security configuration:</span><span> </span></span></li><li class="alt"><span> CharacterEncodingFilter encodingFilter = <span class="keyword">new</span><span> CharacterEncodingFilter(); </span></span></li><li class=""><span> encodingFilter.setEncoding(<span class="string">"UTF-8"</span><span>); </span></span></li><li class="alt"><span> encodingFilter.setForceEncoding(<span class="keyword">true</span><span>); </span></span></li><li class=""><span> http.addFilterBefore(encodingFilter,CsrfFilter.<span class="keyword">class</span><span>); </span></span></li><li class="alt"><span>... ... </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160727_75_2993983" name="code" class="cpp" style="display: none;">public class SecuredConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//The CharacterEncodingFilter must be started before SecurityFilter. I moved it to security configuration:
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding("UTF-8");
encodingFilter.setForceEncoding(true);
http.addFilterBefore(encodingFilter,CsrfFilter.class);
... ...</pre><br>
<br>
<br>
<p></p>
<p></p>
</div>
<p>《Spring4实战 第4版》2016年4月新出版的,之前的第三版看起来还是不错的,所以看到新版就直接买下来。</p>
<p>英文版源码地址:<a target="_blank" href="https://www.manning.com/books/spring-in-action-fourth-edition">Spring in Action, Fourth Edition Covers Spring 4</a></p>
<p><img src="https://img-blog.youkuaiyun.com/20160504190501833" alt=""><br>
</p>
<p><br>
</p>
<p><strong><span style="font-size:18px">1.IOC装配Bean</span></strong></p>
<p>参考【<a href="http://lib.youkuaiyun.com/base/javaee" class="replace_word" title="Java EE知识库" target="_blank" style="color:#df3434; font-weight:bold;">spring</a>实战4 2.2】,作者提倡<span style="background-color:rgb(255,255,0)">无XML配置化</span>。</p>
<p><strong>1.1接口只有一个现实类</strong></p>
<p>可以自动装配</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 918px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">interface</span><span> CompactDisc { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">void</span><span> play(); </span></span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160504_1_4414705" name="code" class="java" style="display: none;">public interface CompactDisc {
void play();
}</pre>
<p></p>
<p><br>
</p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 1085px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.stereotype.Component; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SgtPeppers </span><span class="keyword">implements</span><span> CompactDisc { </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String title = </span><span class="string">"Sgt. Pepper's Lonely Hearts Club Band"</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> String artist = </span><span class="string">"http://blog.youkuaiyun.com/unix21"</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目SgtPeppers 】>>>>>>>>>>>>>>>>>Playing "</span><span> + title + </span><span class="string">" by "</span><span> + artist); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160504_2_891912" name="code" class="java" style="display: none;">import org.springframework.stereotype.Component;
@Component
public class SgtPeppers implements CompactDisc {
private String title = "Sgt. Pepper's Lonely Hearts Club Band";
private String artist = "http://blog.youkuaiyun.com/unix21";
public void play() {
System.out.println("【非常醒目SgtPeppers 】>>>>>>>>>>>>>>>>>Playing " + title + " by " + artist);
}
}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 1414px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_3" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.ComponentScan; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.context.annotation.Configuration; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="annotation">@Configuration</span><span> </span></span></li><li class="alt"><span><span class="annotation">@ComponentScan</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayerConfig { </span></span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160504_3_4653902" name="code" class="java" style="display: none;">import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class CDPlayerConfig {
}</pre>
<p><br>
</p>
<p>单元<a href="http://lib.youkuaiyun.com/base/softwaretest" class="replace_word" title="软件测试知识库" target="_blank" style="color:#df3434; font-weight:bold;">测试</a></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 1661px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_4" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_4" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> </span><span class="keyword">static</span><span> org.junit.Assert.*; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.junit.Rule; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.junit.Test; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.junit.runner.RunWith; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.beans.factory.annotation.Autowired; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.beans.factory.annotation.Qualifier; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.test.context.ContextConfiguration; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.test.context.junit4.SpringJUnit4ClassRunner; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = CDPlayerConfig.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayerTest { </span></span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Test</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class="alt"><span> cd.play(); </span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160504_4_52096" name="code" class="java" style="display: none;">import static org.junit.Assert.*;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayerTest {
@Autowired
private CompactDisc cd;
@Test
public void play() {
cd.play();
}
}</pre><br>
<img src="https://img-blog.youkuaiyun.com/20160504191146139" alt=""><br>
<br>
<br>
<strong>1.2 接口有多个实现类</strong>
<p>【参考 Spring实战4 3.3】<br>
故意再写一个实现类</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 2962px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_5" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_5" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.stereotype.Component; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SgtPeppersNew </span><span class="keyword">implements</span><span> CompactDisc { </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String title = </span><span class="string">"Sgt. Pepper's Lonely Hearts Club Band"</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> String artist = </span><span class="string">"http://blog.youkuaiyun.com/unix21"</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 SgtPeppersNew】>>>>>>>>>>>>>>>>>Playing "</span><span> + title + </span><span class="string">" by "</span><span> + artist); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160504_5_640741" name="code" class="java" style="display: none;">import org.springframework.stereotype.Component;
@Component
public class SgtPeppersNew implements CompactDisc {
private String title = "Sgt. Pepper's Lonely Hearts Club Band";
private String artist = "http://blog.youkuaiyun.com/unix21";
public void play() {
System.out.println("【非常醒目 SgtPeppersNew】>>>>>>>>>>>>>>>>>Playing " + title + " by " + artist);
}
}</pre><br>
<p>如果这个时候运行肯定会报错<span style="background-color:rgb(255,255,0)">NoUniqueBeanDefinitionException: No qualifying bean of type</span></p>
<p><br>
</p>
<p>解决方法有两种</p>
<p><strong>第一种</strong> 在实现类上 <strong>标识首选的bean</strong>,使用<span style="background-color:rgb(255,255,0)">@Primary</span></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 3395px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_6" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_6" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=6&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.Primary; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.stereotype.Component; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="annotation">@Component</span><span> </span></span></li><li class="alt"><span><span class="annotation">@Primary</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SgtPeppers </span><span class="keyword">implements</span><span> CompactDisc { </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String title = </span><span class="string">"Sgt. Pepper's Lonely Hearts Club Band"</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> String artist = </span><span class="string">"http://blog.youkuaiyun.com/unix21"</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目SgtPeppers 】>>>>>>>>>>>>>>>>>Playing "</span><span> + title + </span><span class="string">" by "</span><span> + artist); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160504_6_8129918" name="code" class="java" style="display: none;">import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
@Component
@Primary
public class SgtPeppers implements CompactDisc {
private String title = "Sgt. Pepper's Lonely Hearts Club Band";
private String artist = "http://blog.youkuaiyun.com/unix21";
public void play() {
System.out.println("【非常醒目SgtPeppers 】>>>>>>>>>>>>>>>>>Playing " + title + " by " + artist);
}
}</pre>
<p></p>
<p><br>
</p>
但是这种方法不方便精确定义。
<p><br>
<strong>第二种</strong> 使用<span style="background-color:rgb(255,255,0)">@Qualifier</span>注解</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 3838px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_7" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_7" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=7&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> </span><span class="keyword">static</span><span> org.junit.Assert.*; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.junit.Rule; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.junit.Test; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.junit.runner.RunWith; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.beans.factory.annotation.Autowired; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.beans.factory.annotation.Qualifier; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.test.context.ContextConfiguration; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.test.context.junit4.SpringJUnit4ClassRunner; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = CDPlayerConfig.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayerTest { </span></span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"sgtPeppersNew"</span><span>) </span></span></li><li class=""><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> cd.play(); </span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160504_7_3288132" name="code" class="java" style="display: none;">import static org.junit.Assert.*;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayerTest {
@Autowired
@Qualifier("sgtPeppersNew")
private CompactDisc cd;
@Test
public void play() {
cd.play();
}
}</pre><br>
<p><img src="https://img-blog.youkuaiyun.com/20160504192101534" alt=""></p>
<p>需要注意的是bean id的首字母是类名小写。</p>
<p><a target="_blank" href="http://blog.youkuaiyun.com/clerk0324/article/details/25198457">spring @Qualifier注解</a><br>
</p>
<p><br>
</p>
<p><strong>1.3 为组件扫描的bean命名</strong></p>
<p>【参考 Spring实战4 2.2.2】</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 5157px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_8" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_8" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=8&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.stereotype.Component; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@Component</span><span>(</span><span class="string">"spn"</span><span>) </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SgtPeppersNew </span><span class="keyword">implements</span><span> CompactDisc { </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_8_3459584" name="code" class="java" style="display: none;">import org.springframework.stereotype.Component;
@Component("spn")
public class SgtPeppersNew implements CompactDisc {</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 5324px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_9" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_9" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=9&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"spn"</span><span>) </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_9_7046851" name="code" class="java" style="display: none;">@Autowired
@Qualifier("spn")
private CompactDisc cd;</pre><br>
也可以使用<span style="background-color:rgb(255,255,0)">@Named</span>效果是一样的,这是java依赖注入规范
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 5499px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_10" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_10" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=10&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> javax.inject.Named; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@Named</span><span>(</span><span class="string">"spn"</span><span>) </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SgtPeppersNew </span><span class="keyword">implements</span><span> CompactDisc { </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_10_5301965" name="code" class="java" style="display: none;">import javax.inject.Named;
@Named("spn")
public class SgtPeppersNew implements CompactDisc {
</pre><br>
<p><strong>1.4 设定组件扫描的指定包</strong></p>
<p>【参考 Spring实战4 2.2.3】<br>
</p>
<p>如果<span style="background-color:rgb(255,255,0)">@ComponentScan</span>默认不设置只扫描配置类所在的包作为基础包。</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 5744px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_11" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_11" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=11&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Configuration</span><span> </span></span></li><li class=""><span><span class="annotation">@ComponentScan</span><span>(</span><span class="string">"blog.youkuaiyun.com.unix21"</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayerConfigTest { </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_11_7185248" name="code" class="java" style="display: none;">@Configuration
@ComponentScan("blog.youkuaiyun.com.unix21")
public class CDPlayerConfigTest {</pre>设置@ComponentScan的value属性就可以指明包名称。
<p></p>
<p><br>
</p>
<p>如果想更清晰的表明设置的是基础包<br>
@ComponentScan(basePackages="指定包")<br>
</p>
<p><br>
</p>
<p>指定多个</p>
<p>@ComponentScan(basePackages={"指定包1","指定包2"})</p>
<p><br>
</p>
<p>也可以将其指定为包中所包含的类或者接口</p>
<p>@ComponentScan(basePackages={"XXX.class","XX.class"})<br>
</p>
<p><br>
</p>
<p><strong>1.5 自动装配</strong></p>
<p>【参考 Spring实战4 2.2.4】<br>
</p>
<p>声明自动装配需要<span style="background-color:rgb(255,255,0)">@Autowired</span>注解</p>
<p><br>
</p>
<p>1.5.1 在<strong>构造方法</strong>上使用自动装配</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 6283px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_12" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_12" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=12&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = CDPlayerConfigTest.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayerFunTest { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"spn"</span><span>) </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> CDPlayer(CompactDisc cd) { </span></span></li><li class=""><span> <span class="keyword">this</span><span>.cd = cd; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Test</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class="alt"><span> cd.play(); </span></li><li class=""><span> System.out.println(<span class="string">"【占位符】CDPlayerFunTest"</span><span>); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_12_4119510" name="code" class="java" style="display: none;">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfigTest.class)
public class CDPlayerFunTest {
private CompactDisc cd;
@Autowired
@Qualifier("spn")
public void CDPlayer(CompactDisc cd) {
this.cd = cd;
}
@Test
public void play() {
cd.play();
System.out.println("【占位符】CDPlayerFunTest");
}
}</pre><br>
<p><img src="https://img-blog.youkuaiyun.com/20160505132913413" alt=""></p>
<p><br>
</p>
<p>另一种写法</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 7364px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_13" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_13" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=13&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayer </span><span class="keyword">implements</span><span> MediaPlayer { </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> CDPlayer(</span><span class="annotation">@Qualifier</span><span>(</span><span class="string">"spn"</span><span>)CompactDisc cd) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.cd = cd; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class="alt"><span> cd.play(); </span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_13_8343193" name="code" class="java" style="display: none;">@Component
public class CDPlayer implements MediaPlayer {
private CompactDisc cd;
@Autowired
public CDPlayer(@Qualifier("spn")CompactDisc cd) {
this.cd = cd;
}
public void play() {
cd.play();
}
}</pre><br>
<p><br>
</p>
<p>1.5.2 在<strong>属性Setter</strong>方法上使用自动装配<br>
</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 7763px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_14" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_14" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=14&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayer </span><span class="keyword">implements</span><span> MediaPlayer { </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"spn"</span><span>) </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setCompactDisc(CompactDisc cd) { </span></span></li><li class=""><span> <span class="keyword">this</span><span>.cd = cd; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> cd.play(); </span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_13_1313609" name="code" class="java" style="display: none;">@Component
public class CDPlayer implements MediaPlayer {
private CompactDisc cd;
@Autowired
@Qualifier("spn")
public void setCompactDisc(CompactDisc cd) {
this.cd = cd;
}
public void play() {
cd.play();
}
}</pre><br>
避免异常声明 <span style="background-color:rgb(255,255,0)">@Autowired(required = false)</span>,如果没有匹配的bean,Spring会让这个bean处于未装配转态,但是需要谨慎对待这个设置,代码需要做null检查。
<p></p>
<p></p>
<p>@Autowired是Spring特有的注解,可以替换为<span style="background-color:rgb(255,255,0)">@Inject</span>,@Inject来源自Jave依赖注入规范。<br>
</p>
<p><br>
</p>
<p><strong>1.6 创建自定义的限定符</strong></p>
<p>【参考 Spring实战4 3.3.2】<br>
</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 8266px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_15" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_15" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=15&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="annotation">@Qualifier</span><span>(</span><span class="string">"cold"</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> IceCream </span><span class="keyword">implements</span><span> CompactDisc { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">private</span><span> String title = </span><span class="string">"Sgt. Pepper's Lonely Hearts Club Band"</span><span>; </span></span></li><li class=""><span> <span class="keyword">private</span><span> String artist = </span><span class="string">"The Beatles"</span><span>; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class="alt"><span> System.out.println(<span class="string">"【非常醒目 IceCream】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Playing "</span><span> + title + </span><span class="string">" by "</span><span> + artist); </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_15_2230693" name="code" class="java" style="display: none;">@Component
@Qualifier("cold")
public class IceCream implements CompactDisc {
private String title = "Sgt. Pepper's Lonely Hearts Club Band";
private String artist = "The Beatles";
public void play() {
System.out.println("【非常醒目 IceCream】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Playing " + title + " by " + artist);
}
}</pre>
<p></p>
<p><br>
</p>
测试用例<br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 8585px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_16" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_16" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=16&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes=CDPlayerConfigTest.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayerLogTest { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> MediaPlayer player; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"sp"</span><span>) </span></span></li><li class=""><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"cold"</span><span>) </span></span></li><li class=""><span> <span class="keyword">private</span><span> CompactDisc cd2; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> cdShouldNotBeNull() { </span></span></li><li class=""><span> assertNotNull(cd); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Test</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class="alt"><span> player.play(); </span></li><li class=""><span> cd.play(); </span></li><li class="alt"><span> cd2.play(); </span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_16_7944531" name="code" class="java" style="display: none;">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfigTest.class)
public class CDPlayerLogTest {
@Autowired
private MediaPlayer player;
@Autowired
@Qualifier("sp")
private CompactDisc cd;
@Autowired
@Qualifier("cold")
private CompactDisc cd2;
@Test
public void cdShouldNotBeNull() {
assertNotNull(cd);
}
@Test
public void play() {
player.play();
cd.play();
cd2.play();
}
}</pre><br>
<p><img src="https://img-blog.youkuaiyun.com/20160505155611379" alt=""></p>
<p><br>
</p>
<p>好处:这样做的好处限定符不耦合类名,所以可以随意重构类名。</p>
<p>问题:重复的限定符出现在多个类上这是不允许的,因为<strong><a href="http://lib.youkuaiyun.com/base/java" class="replace_word" title="Java 知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java</a>不允许同一个条目上重复出现相同类型的多个注解</strong>。</p>
<p><br>
</p>
<p><strong>1.7 使用自定义限定符注解</strong></p>
<p>针对上述问题可以创建自定义的限定符注解。</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 9920px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_17" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_17" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=17&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Retention</span><span>(RetentionPolicy.RUNTIME) </span><span class="comment">// 注解会在class字节码文件中存在,在运行时可以通过反射获取到 </span><span> </span></span></li><li class=""><span><span class="annotation">@Target</span><span>({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})</span><span class="comment">//定义注解的作用目标**作用范围字段、枚举的常量/方法 </span><span> </span></span></li><li class="alt"><span><span class="annotation">@Qualifier</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">@interface</span><span> Cold {} </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_17_5027128" name="code" class="java" style="display: none;">@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})//定义注解的作用目标**作用范围字段、枚举的常量/方法
@Qualifier
public @interface Cold {}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 10105px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_18" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_18" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=18&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Retention</span><span>(RetentionPolicy.RUNTIME) </span><span class="comment">// 注解会在class字节码文件中存在,在运行时可以通过反射获取到 </span><span> </span></span></li><li class=""><span><span class="annotation">@Target</span><span>({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})</span><span class="comment">//定义注解的作用目标**作用范围字段、枚举的常量/方法 </span><span> </span></span></li><li class="alt"><span><span class="annotation">@Qualifier</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">@interface</span><span> Creamy {} </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_18_3216984" name="code" class="java" style="display: none;">@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})//定义注解的作用目标**作用范围字段、枚举的常量/方法
@Qualifier
public @interface Creamy {}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 10290px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_19" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_19" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=19&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Retention</span><span>(RetentionPolicy.RUNTIME) </span><span class="comment">// 注解会在class字节码文件中存在,在运行时可以通过反射获取到 </span><span> </span></span></li><li class=""><span><span class="annotation">@Target</span><span>({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})</span><span class="comment">//定义注解的作用目标**作用范围字段、枚举的常量/方法 </span><span> </span></span></li><li class="alt"><span><span class="annotation">@Qualifier</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">@interface</span><span> Fruity {} </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_19_3566431" name="code" class="java" style="display: none;">@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})//定义注解的作用目标**作用范围字段、枚举的常量/方法
@Qualifier
public @interface Fruity {}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 10475px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_20" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_20" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=20&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="annotation">@Cold</span><span> </span></span></li><li class="alt"><span><span class="annotation">@Creamy</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> IceCream </span><span class="keyword">implements</span><span> CompactDisc { </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String title = </span><span class="string">"Spring 实现 第4版 读书笔记"</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> String artist = </span><span class="string">"http://blog.youkuaiyun.com/unix21"</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 IceCream】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Playing "</span><span> + title + </span><span class="string">" by "</span><span> + artist); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_20_7263165" name="code" class="java" style="display: none;">@Component
@Cold
@Creamy
public class IceCream implements CompactDisc {
private String title = "Spring 实现 第4版 读书笔记";
private String artist = "http://blog.youkuaiyun.com/unix21";
public void play() {
System.out.println("【非常醒目 IceCream】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Playing " + title + " by " + artist);
}
}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 10786px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_21" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_21" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=21&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="annotation">@Cold</span><span> </span></span></li><li class="alt"><span><span class="annotation">@Fruity</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Popsicle </span><span class="keyword">implements</span><span> CompactDisc { </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String title = </span><span class="string">"Spring 实现 第4版 读书笔记"</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> String artist = </span><span class="string">"http://blog.youkuaiyun.com/unix21"</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 Popsicle】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Playing "</span><span> + title + </span><span class="string">" by "</span><span> + artist); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_21_7404869" name="code" class="java" style="display: none;">@Component
@Cold
@Fruity
public class Popsicle implements CompactDisc {
private String title = "Spring 实现 第4版 读书笔记";
private String artist = "http://blog.youkuaiyun.com/unix21";
public void play() {
System.out.println("【非常醒目 Popsicle】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Playing " + title + " by " + artist);
}
}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 11097px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_22" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_22" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=22&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = CDPlayerConfigTest.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayerLogTest { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> MediaPlayer player; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"sp"</span><span>) </span></span></li><li class=""><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Cold</span><span> </span></span></li><li class=""><span> <span class="annotation">@Creamy</span><span> </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> CompactDisc cd2; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="annotation">@Cold</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Fruity</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> CompactDisc cd3; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> cdShouldNotBeNull() { </span></span></li><li class=""><span> assertNotNull(cd); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Test</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class="alt"><span> player.play(); </span></li><li class=""><span> cd.play(); </span></li><li class="alt"><span> cd2.play(); </span></li><li class=""><span> cd3.play(); </span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160505_22_9182776" name="code" class="java" style="display: none;">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfigTest.class)
public class CDPlayerLogTest {
@Autowired
private MediaPlayer player;
@Autowired
@Qualifier("sp")
private CompactDisc cd;
@Autowired
@Cold
@Creamy
private CompactDisc cd2;
@Autowired
@Cold
@Fruity
private CompactDisc cd3;
@Test
public void cdShouldNotBeNull() {
assertNotNull(cd);
}
@Test
public void play() {
player.play();
cd.play();
cd2.play();
cd3.play();
}
}</pre><br>
<p><img src="https://img-blog.youkuaiyun.com/20160505163924501" alt=""></p>
<p><br>
</p>
<p><strong>1.8 bean的作用域</strong></p>
<p>Spring定义了多重作用域,singleton单例,prototype原型等</p>
<p>参考:<a target="_blank" href="http://www.cnblogs.com/qq78292959/p/3716827.html">spring中scope作用域</a></p>
<p>singleton单例:整个应用中,只创建bean的一个实例,默认Spring上下文中所有的bean都是单例。<br>
</p>
<p>prototype原型:每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。<br>
</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 12656px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_23" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_23" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=23&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Add </span><span class="keyword">implements</span><span> AddI { </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">int</span><span> a=</span><span class="number">0</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> Add() { </span></span></li><li class=""><span> a++; </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> getA() { </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 Add】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>a= "</span><span> +a+</span><span class="string">""</span><span>); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160506_23_4113982" name="code" class="java" style="display: none;">@Component
public class Add implements AddI {
public int a=0;
public void Add() {
a++;
}
public void getA() {
System.out.println("【非常醒目 Add】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>a= " +a+"");
}
}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 12967px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_24" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_24" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=24&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">interface</span><span> AddI { </span></span></li><li class=""><span><span class="keyword">void</span><span> Add(); </span></span></li><li class="alt"><span> <span class="keyword">void</span><span> getA(); </span></span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160506_24_7145624" name="code" class="java" style="display: none;">public interface AddI {
void Add();
void getA();
}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 13134px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_25" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_25" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=25&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayer </span><span class="keyword">implements</span><span> MediaPlayer { </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"sp"</span><span>) </span></span></li><li class=""><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> AddI a; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 CDPlayer】>>>"</span><span>); </span></span></li><li class="alt"><span> cd.play(); </span></li><li class=""><span> a.Add(); </span></li><li class="alt"><span> a.getA(); </span></li><li class=""><span> a.Add(); </span></li><li class="alt"><span> a.getA(); </span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 CDPlayer】<<<"</span><span>); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160506_25_1813470" name="code" class="java" style="display: none;">@Component
public class CDPlayer implements MediaPlayer {
@Autowired
@Qualifier("sp")
private CompactDisc cd;
@Autowired
private AddI a;
public void play() {
System.out.println("【非常醒目 CDPlayer】>>>");
cd.play();
a.Add();
a.getA();
a.Add();
a.getA();
System.out.println("【非常醒目 CDPlayer】<<<");
}
}</pre>
<p></p>
<p><br>
</p>
测试用例<br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 13615px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_26" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_26" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=26&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = CDPlayerConfigTest.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CDPlayerLogTest { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> MediaPlayer player; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"sp"</span><span>) </span></span></li><li class=""><span> <span class="keyword">private</span><span> CompactDisc cd; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Cold</span><span> </span></span></li><li class=""><span> <span class="annotation">@Creamy</span><span> </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> CompactDisc cd2; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="annotation">@Cold</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Fruity</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> CompactDisc cd3; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> cdShouldNotBeNull() { </span></span></li><li class=""><span> assertNotNull(cd); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> AddI a; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> player.play(); </span></li><li class="alt"><span> cd.play(); </span></li><li class=""><span> cd2.play(); </span></li><li class="alt"><span> cd3.play(); </span></li><li class=""><span> a.getA(); </span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160506_26_1257063" name="code" class="java" style="display: none;">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfigTest.class)
public class CDPlayerLogTest {
@Autowired
private MediaPlayer player;
@Autowired
@Qualifier("sp")
private CompactDisc cd;
@Autowired
@Cold
@Creamy
private CompactDisc cd2;
@Autowired
@Cold
@Fruity
private CompactDisc cd3;
@Test
public void cdShouldNotBeNull() {
assertNotNull(cd);
}
@Autowired
private AddI a;
@Test
public void play() {
player.play();
cd.play();
cd2.play();
cd3.play();
a.getA();
}
}</pre><br>
<p><img src="https://img-blog.youkuaiyun.com/20160506173451878" alt=""></p>
<p><br>
</p>
<p>再写一个多线程</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 14964px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_27" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_27" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=27&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> ClientThread </span><span class="keyword">extends</span><span> Thread { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> AddI a; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> ClientThread(AddI a) { </span></span></li><li class=""><span> <span class="keyword">this</span><span>.a = a; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> run() { </span></span></li><li class=""><span> a.Add(); </span></li><li class="alt"><span> a.getA(); </span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160506_27_2961121" name="code" class="java" style="display: none;">public class ClientThread extends Thread {
@Autowired
private AddI a;
@Autowired
public ClientThread(AddI a) {
this.a = a;
}
public void run() {
a.Add();
a.getA();
}
}</pre><br>
调用多线程
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 15355px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_28" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_28" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=28&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = CDPlayerConfigTest.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SpringScopeTest { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> AddI a; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> Scope() { </span></span></li><li class=""><span> <span class="keyword">for</span><span> (</span><span class="keyword">int</span><span> i = </span><span class="number">0</span><span>; i < </span><span class="number">10</span><span>; i++) { </span></span></li><li class="alt"><span> ClientThread t = <span class="keyword">new</span><span> ClientThread(a); </span></span></li><li class=""><span> t.start(); </span></li><li class="alt"><span> } </span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160506_28_5992764" name="code" class="java" style="display: none;">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfigTest.class)
public class SpringScopeTest {
@Autowired
private AddI a;
@Test
public void Scope() {
for (int i = 0; i < 10; i++) {
ClientThread t = new ClientThread(a);
t.start();
}
}
}</pre><br>
<img src="https://img-blog.youkuaiyun.com/20160506174355306" alt=""><br>
<p>改为<span style="background-color:rgb(255,255,0)">SCOPE_PROTOTYPE</span></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 16430px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_29" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_29" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=29&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="annotation">@Scope</span><span>(ConfigurableBeanFactory.SCOPE_PROTOTYPE) </span></span></li><li class="alt"><span><span class="comment">//@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Add </span><span class="keyword">implements</span><span> AddI { </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">int</span><span> a=</span><span class="number">0</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> Add() { </span></span></li><li class=""><span> a++; </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> getA() { </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 Add】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>a= "</span><span> +a+</span><span class="string">""</span><span>); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160506_29_3314562" name="code" class="java" style="display: none;">@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
//@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class Add implements AddI {
public int a=0;
public void Add() {
a++;
}
public void getA() {
System.out.println("【非常醒目 Add】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>a= " +a+"");
}
}
</pre><br>
<img src="https://img-blog.youkuaiyun.com/20160506174802602" alt=""><br>
<p></p>
<p><img src="https://img-blog.youkuaiyun.com/20160506174808093" alt=""><br>
</p>
<p>看到差异了吧。</p>
<p><br>
</p>
<p>补充说明:<span style="background-color:rgb(255,255,0)">@Repository、@Service、@Controller 和 @Component</span>将类标识为Bean,都是一样的,用在不同的地方而已。</p>
<p><br>
</p>
<p><strong><span style="font-size:18px">2.AOP切面编程</span></strong></p>
<p>定义接口</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 18258px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_30" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_30" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=30&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">interface</span><span> PerformanceI { </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> perform(); </span></span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160511_30_1073147" name="code" class="java" style="display: none;">public interface PerformanceI {
public void perform();
}</pre><br>
实现类
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 18433px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_31" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_31" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=31&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.stereotype.Component; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@Component</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Performance </span><span class="keyword">implements</span><span> PerformanceI{ </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> perform(){ </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 Performance perform 调用中】 By http://blog.youkuaiyun.com/unix21"</span><span>); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160511_31_9502982" name="code" class="java" style="display: none;">import org.springframework.stereotype.Component;
@Component
public class Performance implements PerformanceI{
public void perform(){
System.out.println("【非常醒目 Performance perform 调用中】 By http://blog.youkuaiyun.com/unix21");
}
}</pre><br>
定义切面
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 18698px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_32" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_32" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=32&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.aspectj.lang.annotation.After; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.aspectj.lang.annotation.AfterThrowing; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.aspectj.lang.annotation.Aspect; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.aspectj.lang.annotation.Before; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="annotation">@Aspect</span><span> </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> MyAspect { </span></span></li><li class=""><span> <span class="annotation">@Before</span><span>(</span><span class="string">"execution(* com.demo.PerformanceI.perform(..))"</span><span>) </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> before(){ </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 [方法调用前] 】"</span><span>); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@After</span><span>(</span><span class="string">"execution(* com.demo.PerformanceI.perform(..))"</span><span>) </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> after(){ </span></span></li><li class="alt"><span> System.out.println(<span class="string">"【非常醒目 [方法调用后] 】"</span><span>); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@AfterThrowing</span><span>(</span><span class="string">"execution(* com.demo.PerformanceI.perform(..))"</span><span>) </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> afterThrowing(){ </span></span></li><li class=""><span> System.out.println(<span class="string">"【非常醒目 [方法异常后] 】"</span><span>); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160511_32_8281483" name="code" class="java" style="display: none;">import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class MyAspect {
@Before("execution(* com.demo.PerformanceI.perform(..))")
public void before(){
System.out.println("【非常醒目 [方法调用前] 】");
}
@After("execution(* com.demo.PerformanceI.perform(..))")
public void after(){
System.out.println("【非常醒目 [方法调用后] 】");
}
@AfterThrowing("execution(* com.demo.PerformanceI.perform(..))")
public void afterThrowing(){
System.out.println("【非常醒目 [方法异常后] 】");
}
}</pre><br>
配置文件
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 19215px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_33" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_33" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=33&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> com.demo.*; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.context.annotation.Bean; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.ComponentScan; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.context.annotation.Configuration; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.EnableAspectJAutoProxy; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@Configuration</span><span> </span></span></li><li class=""><span><span class="annotation">@EnableAspectJAutoProxy</span><span> </span></span></li><li class="alt"><span><span class="annotation">@ComponentScan</span><span>(</span><span class="string">"com.demo"</span><span>) </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> AppConfig { </span></span></li><li class="alt"><span> <span class="annotation">@Bean</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> MyAspect myAspect() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> MyAspect(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160511_33_963680" name="code" class="java" style="display: none;">import com.demo.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration
@EnableAspectJAutoProxy
@ComponentScan("com.demo")
public class AppConfig {
@Bean
public MyAspect myAspect() {
return new MyAspect();
}
}</pre>
<p></p>
<p><br>
</p>
测试用例
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 19624px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_34" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_34" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=34&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.junit.Test; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.junit.runner.RunWith; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.beans.factory.annotation.Autowired; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.test.context.ContextConfiguration; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.test.context.junit4.SpringJUnit4ClassRunner; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = AppConfig.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> MyTest { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> PerformanceI p1; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> play() { </span></span></li><li class=""><span> p1.perform(); </span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160511_34_5805466" name="code" class="java" style="display: none;">import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class MyTest {
@Autowired
private PerformanceI p1;
@Test
public void play() {
p1.perform();
}
}</pre>
<p></p>
<p><br>
</p>
运行:<br>
<img src="https://img-blog.youkuaiyun.com/20160511192937830" alt=""><br>
<br>
<p>实现了方法调用前后的AOP效果。</p>
<p>这个Spring官方参考做的不错:<a target="_blank" href="http://docs.spring.io/spring/docs/4.2.5.RELEASE/javadoc-api/">http://docs.spring.io/spring/docs/4.2.5.RELEASE/javadoc-api/</a></p>
<p>这里选不同的版本:<a target="_blank" href="http://docs.spring.io/spring/docs/">http://docs.spring.io/spring/docs/</a></p>
<p><img src="https://img-blog.youkuaiyun.com/20160511193434097" alt=""><br>
</p>
<p><br>
</p>
<p><span style="font-size:18px">3.Spring MVC</span></p>
<p>DispatcherServlet是Spring MVC的核心,每当应用接受一个HTTP请求,由DispatcherServlet负责将请求分发给应用的其他组件。<br>
在旧版本中,DispatcherServlet之类的servlet一般在web.xml文件中配置;但是Spring 3.1引入了注解就无需再使用web.xml文件。<br>
</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 21375px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_35" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_35" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=35&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SpitterWebInitializer </span><span class="keyword">extends</span><span> AbstractAnnotationConfigDispatcherServletInitializer { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">protected</span><span> Class<?>[] getRootConfigClasses() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> Class<?>[]{RootConfig.</span><span class="keyword">class</span><span>}; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">protected</span><span> Class<?>[] getServletConfigClasses() { </span></span></li><li class=""><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> Class<?>[]{WebConfig.</span><span class="keyword">class</span><span>}; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">protected</span><span> String[] getServletMappings() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> String[]{</span><span class="string">"/"</span><span>}; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160512_35_673336" name="code" class="java" style="display: none;">import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class SpitterWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}</pre>
<p></p>
<p>AbstractAnnotationConfigDispatcherServletInitializer这个类负责配置DispatcherServlet、初始化Spring MVC容器和Spring容器。<br>
</p>
<br>
正如可以通过多种方式配置DispatcherServlet一样,也可以通过多种方式启动Spring MVC特性。原来我们一般在xml文件中使用<mvc:annotation-driven>元素启动注解驱动的Spring MVC特性。这里我们使用JavaConfig配置,最简单的Spring MVC配置类代码如下:<br>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 21908px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_36" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_36" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=36&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.Bean; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.context.annotation.ComponentScan; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.Configuration; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.web.servlet.ViewResolver; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.web.servlet.config.annotation.EnableWebMvc; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.web.servlet.view.InternalResourceViewResolver; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="annotation">@Configuration</span><span> </span></span></li><li class="alt"><span><span class="annotation">@EnableWebMvc</span><span> </span></span></li><li class=""><span><span class="annotation">@ComponentScan</span><span>(</span><span class="string">"com.xxx.controller"</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> WebConfig </span><span class="keyword">extends</span><span> WebMvcConfigurerAdapter{ </span></span></li><li class=""><span> <span class="annotation">@Bean</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> ViewResolver viewResolver() { </span><span class="comment">//配置JSP视图解析器</span><span> </span></span></li><li class=""><span> InternalResourceViewResolver resolver = <span class="keyword">new</span><span> InternalResourceViewResolver(); </span></span></li><li class="alt"><span> resolver.setPrefix(<span class="string">"/WEB-INF/views/"</span><span>); </span></span></li><li class=""><span> resolver.setSuffix(<span class="string">".jsp"</span><span>); </span></span></li><li class="alt"><span> <span class="comment">//可以在JSP页面中通过${}访问beans</span><span> </span></span></li><li class=""><span> resolver.setExposeContextBeansAsAttributes(<span class="keyword">true</span><span>); </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> resolver; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { </span></span></li><li class=""><span> configurer.enable(); <span class="comment">//配置静态文件处理</span><span> </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160512_36_6147194" name="code" class="java" style="display: none;">import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
@ComponentScan("com.xxx.controller")
public class WebConfig extends WebMvcConfigurerAdapter{
@Bean
public ViewResolver viewResolver() { //配置JSP视图解析器
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
//可以在JSP页面中通过${}访问beans
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable(); //配置静态文件处理
}
}</pre>@Configuration表示这是Java配置类;@EnableWebMvc注解用于启动Spring MVC特性。<br>
<br>
<p>通过@ComponentScan注解指定bean的自动发现机制作用的范围,被@Controller等注解修饰的web的bean将被发现并加载到spring mvc应用容器,这样就不需要在配置类中显式定义任何控制器bean了。<br>
<br>
通过@Bean注解添加一个ViewResolverbean,具体来说是InternalResourceViewResolver。</p>
<p><br>
</p>
<p>RootConfig的配置就非常简单了,唯一需要注意的是,它在设置扫描机制的时候,将之前WebConfig设置过的那个包排除了;也就是说,这两个扫描机制作用的范围正交。RootConfig的代码如下:<br>
</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 22715px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_37" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_37" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=37&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.ComponentScan; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.context.annotation.Configuration; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.FilterType; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.web.servlet.config.annotation.EnableWebMvc; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="annotation">@Configuration</span><span> </span></span></li><li class="alt"><span><span class="annotation">@ComponentScan</span><span>(basePackages = {</span><span class="string">"com.xxx.*"</span><span>}, </span></span></li><li class=""><span> excludeFilters = {<span class="annotation">@ComponentScan</span><span>.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.</span><span class="keyword">class</span><span>)}) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> RootConfig { </span></span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160512_37_9816687" name="code" class="java" style="display: none;">import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@ComponentScan(basePackages = {"com.xxx.*"},
excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)})
public class RootConfig {
}</pre>
<p></p>
<p><br>
</p>
写一个控制器,定义之前的IOC对象PerformanceI
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 23016px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_38" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_38" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=38&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Controller</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> HomeController { </span></span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> PerformanceI p1; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@RequestMapping</span><span>(value = </span><span class="string">"/home"</span><span>, method = RequestMethod.GET) </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> String home() { </span></span></li><li class=""><span> p1.perform(); </span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="string">"home"</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160512_38_3022272" name="code" class="java" style="display: none;">@Controller
public class HomeController {
@Autowired
private PerformanceI p1;
@RequestMapping(value = "/home", method = RequestMethod.GET)
public String home() {
p1.perform();
return "home";
}
}</pre>
<p></p>
<p><br>
</p>
在WEB-INF/views下新增模板文件home.jsp<br>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 483px; top: 23335px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_39" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_39" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=39&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span>%@page </span><span class="attribute">contentType</span><span>=</span><span class="attribute-value">"text/html"</span><span> </span><span class="attribute">pageEncoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span>%</span><span class="tag">></span><span> </span></span></li><li class=""><span><!DOCTYPE html<span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">html</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">head</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">meta</span><span> </span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">"Content-Type"</span><span> </span><span class="attribute">content</span><span>=</span><span class="attribute-value">"text/html; charset=UTF-8"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">title</span><span class="tag">></span><span>JSP Page</span><span class="tag"></</span><span class="tag-name">title</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">head</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">body</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">h1</span><span class="tag">></span><span>Spring4 & Sping MVC4 </span><span class="tag"></</span><span class="tag-name">h1</span><span class="tag">></span><span class="tag"><</span><span class="tag-name">p</span><span class="tag">></span><span>demo by http://blog.youkuaiyun.com/unix21</span><span class="tag"></</span><span class="tag-name">p</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">body</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">html</span><span class="tag">></span><span> </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160512_39_4309027" name="code" class="html" style="display: none;"><%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Spring4 & Sping MVC4 </h1><p>demo by http://blog.youkuaiyun.com/unix21</p>
</body>
</html></pre><br>
<img src="https://img-blog.youkuaiyun.com/20160512184441038" alt=""><br>
<br>
<p><br>
</p>
<p>下面这个是【第5章】的翻译 <a target="_blank" href="https://segmentfault.com/a/1190000004343063?_ea=575820">https://segmentfault.com/a/1190000004343063?_ea=575820</a></p>
<p><br>
</p>
<p><strong>默认首页</strong></p>
<p>我们希望用户访问域名直接到默认首页,那么需要删除网站web目录下的index.html。</p>
<p><em>tomcat会自动默认去寻找在webroot目录下面的index文件,如果要使用自定义方法,则要保证webroot下面没有index相关的文件。</em><br>
</p>
<p><img src="https://img-blog.youkuaiyun.com/20160524101148606" alt=""><br>
</p>
<p>自己写一个index</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 24611px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_40" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_40" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=40&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RequestMapping</span><span>(value = </span><span class="string">"/"</span><span>, method = RequestMethod.GET) </span></span></li><li class=""><span> <span class="keyword">public</span><span> String index() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="string">"index"</span><span>; </span></span></li><li class=""><span> } </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160524_40_7126367" name="code" class="java" style="display: none;">@RequestMapping(value = "/", method = RequestMethod.GET)
public String index() {
return "index";
}</pre><br>
再定义一个index.jsp即可
<p></p>
<p>具体请参考:<a target="_blank" href="http://blog.youkuaiyun.com/caiwenfeng_for_23/article/details/45486233">Spring MVC 下设置默认访问页面的3种方式</a></p>
<p><br>
</p>
<p><strong>映射多个地址</strong></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 24882px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_41" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_41" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=41&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RequestMapping</span><span>(value = {</span><span class="string">""</span><span>, </span><span class="string">"/"</span><span>,</span><span class="string">"index"</span><span>}, method = RequestMethod.GET) </span></span></li><li class=""><span> <span class="keyword">public</span><span> String index() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="string">"index"</span><span>; </span></span></li><li class=""><span> } </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160524_41_491318" name="code" class="java" style="display: none;"> @RequestMapping(value = {"", "/","index"}, method = RequestMethod.GET)
public String index() {
return "index";
}</pre>或者<br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 25049px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_42" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_42" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=42&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RequestMapping</span><span>({</span><span class="string">""</span><span>, </span><span class="string">"/"</span><span>,</span><span class="string">"index"</span><span>}) </span></span></li><li class=""><span> <span class="keyword">public</span><span> String index() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="string">"index"</span><span>; </span></span></li><li class=""><span> } </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160524_42_5333104" name="code" class="java" style="display: none;"> @RequestMapping({"", "/","index"})
public String index() {
return "index";
}</pre>
<p><br>
</p>
<p><strong>输出json</strong></p>
<p>形式一</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 25268px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_43" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_43" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=43&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@ResponseBody</span><span> </span></span></li><li class=""><span> <span class="annotation">@RequestMapping</span><span>(value = </span><span class="string">"/list"</span><span>, method = RequestMethod.GET,produces = </span><span class="string">"text/json;charset=UTF-8"</span><span>) </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> String h1(HttpServletRequest req, HttpServletResponse res) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class=""><span> UserBean user= ...; </span></li><li class="alt"><span> ObjectMapper mapper = <span class="keyword">new</span><span> ObjectMapper(); </span></span></li><li class=""><span> String js=mapper.writeValueAsString(user); </span></li><li class="alt"><span> <span class="keyword">return</span><span> js; </span></span></li><li class=""><span> } </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160524_43_3534685" name="code" class="java" style="display: none;">@ResponseBody
@RequestMapping(value = "/list", method = RequestMethod.GET,produces = "text/json;charset=UTF-8")
public String h1(HttpServletRequest req, HttpServletResponse res) throws Exception {
UserBean user= ...;
ObjectMapper mapper = new ObjectMapper();
String js=mapper.writeValueAsString(user);
return js;
}</pre>
<p></p>
<p><br>
</p>
形式二
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 25533px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_44" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_44" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=44&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@ResponseBody</span><span> </span></span></li><li class=""><span> <span class="annotation">@RequestMapping</span><span>(value = </span><span class="string">"/list"</span><span>, method = RequestMethod.GET) </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> list(HttpServletRequest req, HttpServletResponse res) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class=""><span> res.setContentType(<span class="string">"text/json;charset=UTF-8"</span><span>); </span></span></li><li class="alt"><span> UserBean user= ...; </span></li><li class=""><span> ObjectMapper mapper = <span class="keyword">new</span><span> ObjectMapper(); </span></span></li><li class="alt"><span> String js=mapper.writeValueAsString(user); </span></li><li class=""><span> PrintWriter pWriter = res.getWriter(); </span></li><li class="alt"><span> pWriter.write(js); </span></li><li class=""><span> } </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160524_44_6424624" name="code" class="java" style="display: none;">@ResponseBody
@RequestMapping(value = "/list", method = RequestMethod.GET)
public void list(HttpServletRequest req, HttpServletResponse res) throws Exception {
res.setContentType("text/json;charset=UTF-8");
UserBean user= ...;
ObjectMapper mapper = new ObjectMapper();
String js=mapper.writeValueAsString(user);
PrintWriter pWriter = res.getWriter();
pWriter.write(js);
}</pre>
<p></p>
<br>
<p></p>
<p><strong><span style="font-size:18px">4.Spring4整合MyBatis3</span></strong></p>
<p>说明:《Spring实战(第4版)》并没有提到MyBatis的整合,这个是我自己写的,写一起只为查看方便。</p>
<p>新建MybatisConfig文件</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 25886px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_45" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_45" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=45&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> javax.sql.DataSource; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.mybatis.spring.SqlSessionFactoryBean; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.mybatis.spring.mapper.MapperScannerConfigurer; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.context.annotation.Bean; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.context.annotation.Configuration; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.jdbc.datasource.DataSourceTransactionManager; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.jdbc.datasource.DriverManagerDataSource; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.transaction.PlatformTransactionManager; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.transaction.annotation.EnableTransactionManagement; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="annotation">@Configuration</span><span> </span></span></li><li class=""><span><span class="annotation">@EnableTransactionManagement</span><span> </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> MybatisConfig { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Bean</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> DataSource dataSource() { </span></span></li><li class="alt"><span> DriverManagerDataSource dataSource = <span class="keyword">new</span><span> DriverManagerDataSource(); </span></span></li><li class=""><span> dataSource.setUsername(<span class="string">"admin"</span><span>); </span></span></li><li class="alt"><span> dataSource.setPassword(<span class="string">"admin"</span><span>); </span></span></li><li class=""><span> dataSource.setDriverClassName(<span class="string">"com.microsoft.sqlserver.jdbc.SQLServerDriver"</span><span>);</span><span class="comment">//如果其他数据库换对应的驱动即可</span><span> </span></span></li><li class="alt"><span> dataSource.setUrl(<span class="string">"jdbc:sqlserver://blog.youkuaiyun.com.unix21:3499;DatabaseName=testdb"</span><span>); </span></span></li><li class=""><span> <span class="keyword">return</span><span> dataSource; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Bean</span><span> </span></span></li><li class=""><span> MapperScannerConfigurer mpperScannnerConfigurer() { </span></li><li class="alt"><span> MapperScannerConfigurer msc = <span class="keyword">new</span><span> MapperScannerConfigurer(); </span></span></li><li class=""><span> msc.setSqlSessionFactoryBeanName(<span class="string">"sqlSessionFactory"</span><span>); </span></span></li><li class="alt"><span> msc.setBasePackage(<span class="string">"com.unix.mapper"</span><span>);</span><span class="comment">//自动扫描mapper包</span><span> </span></span></li><li class=""><span> <span class="keyword">return</span><span> msc; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Bean</span><span>(name = </span><span class="string">"sqlSessionFactory"</span><span>) </span></span></li><li class=""><span> SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) { </span></li><li class="alt"><span> SqlSessionFactoryBean ssfb = <span class="keyword">new</span><span> SqlSessionFactoryBean(); </span></span></li><li class=""><span> ssfb.setDataSource(dataSource); </span></li><li class="alt"><span> ssfb.setTypeAliasesPackage(<span class="string">"com.unix.bean"</span><span>);</span><span class="comment">//自动扫描bean包</span><span> </span></span></li><li class=""><span> <span class="keyword">return</span><span> ssfb; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Bean</span><span> </span></span></li><li class=""><span> PlatformTransactionManager transactionManager(DataSource dataSource) { </span></li><li class="alt"><span> DataSourceTransactionManager transactionManager = <span class="keyword">new</span><span> DataSourceTransactionManager(); </span></span></li><li class=""><span> transactionManager.setDataSource(dataSource); </span></li><li class="alt"><span> <span class="keyword">return</span><span> transactionManager; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160513_40_7431098" name="code" class="java" style="display: none;">import javax.sql.DataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
public class MybatisConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUsername("admin");
dataSource.setPassword("admin");
dataSource.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//如果其他数据库换对应的驱动即可
dataSource.setUrl("jdbc:sqlserver://blog.youkuaiyun.com.unix21:3499;DatabaseName=testdb");
return dataSource;
}
@Bean
MapperScannerConfigurer mpperScannnerConfigurer() {
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setSqlSessionFactoryBeanName("sqlSessionFactory");
msc.setBasePackage("com.unix.mapper");//自动扫描mapper包
return msc;
}
@Bean(name = "sqlSessionFactory")
SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
ssfb.setDataSource(dataSource);
ssfb.setTypeAliasesPackage("com.unix.bean");//自动扫描bean包
return ssfb;
}
@Bean
PlatformTransactionManager transactionManager(DataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}</pre><br>
新增一个mapper接口
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 26853px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_46" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_46" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=46&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">interface</span><span> SchoolMapper { </span></span></li><li class=""><span> <span class="annotation">@Select</span><span>(</span><span class="string">"select * from School where id =#{id}"</span><span>) </span></span></li><li class="alt"><span> School findById(<span class="annotation">@Param</span><span>(</span><span class="string">"id"</span><span>) </span><span class="keyword">int</span><span> id); </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Select</span><span>(</span><span class="string">"select * from School where Name like '${name}%'"</span><span>) </span></span></li><li class=""><span> List<School> findByName(<span class="annotation">@Param</span><span>(</span><span class="string">"name"</span><span>) String name); </span></span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160513_41_1782517" name="code" class="java" style="display: none;">public interface SchoolMapper {
@Select("select * from School where id =#{id}")
School findById(@Param("id") int id);
@Select("select * from School where Name like '${name}%'")
List<School> findByName(@Param("name") String name);
}</pre><br>
测试用例
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 27100px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_47" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_47" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=47&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = MybatisConfig.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="comment">//@TransactionConfiguration(defaultRollback=true)</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SchoolTest { </span></span></li><li class="alt"><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class=""><span> <span class="keyword">private</span><span> SchoolMapper shoolDao; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> findById(){ </span></span></li><li class=""><span> School shool = shoolDao.findById(<span class="number">1</span><span>); </span></span></li><li class="alt"><span> Assert.assertNotNull(shool); </span></li><li class=""><span> System.out.println(shool.getName()); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Test</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> findByName(){ </span></span></li><li class="alt"><span> List<School> result = shoolDao.findByName(<span class="string">"苏州中学"</span><span>); </span></span></li><li class=""><span> Assert.assertNotNull(result); </span></li><li class="alt"><span> <span class="keyword">for</span><span> (School s : result) { </span></span></li><li class=""><span> System.out.println(s.getName()); </span></li><li class="alt"><span> } </span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160513_42_3036253" name="code" class="java" style="display: none;">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MybatisConfig.class)
//@TransactionConfiguration(defaultRollback=true)
public class SchoolTest {
@Autowired
private SchoolMapper shoolDao;
@Test
public void findById(){
School shool = shoolDao.findById(1);
Assert.assertNotNull(shool);
System.out.println(shool.getName());
}
@Test
public void findByName(){
List<School> result = shoolDao.findByName("苏州中学");
Assert.assertNotNull(result);
for (School s : result) {
System.out.println(s.getName());
}
}
}</pre>
<p><br>
</p>
<p><span style="font-size:18px"><strong>5.Spring4使用<a href="http://lib.youkuaiyun.com/base/redis" class="replace_word" title="Redis知识库" target="_blank" style="color:#df3434; font-weight:bold;">Redis</a></strong></span></p>
<p><a href="http://lib.youkuaiyun.com/base/redis" class="replace_word" title="Redis知识库" target="_blank" style="color:#df3434; font-weight:bold;">redis</a>在日常开发中已经成为了标配了,在spring4中使用redis非常简单,无需自己去写一个jedis的工厂方法连接池之类的代码,因为Spring已经写好了,你只需要引用spring-data-redis包即可</p>
<p></p>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 483px; top: 27687px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_48" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_48" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=48&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">dependency</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">groupId</span><span class="tag">></span><span>org.springframework.data</span><span class="tag"></</span><span class="tag-name">groupId</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">artifactId</span><span class="tag">></span><span>spring-data-redis</span><span class="tag"></</span><span class="tag-name">artifactId</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">version</span><span class="tag">></span><span>1.7.1.RELEASE</span><span class="tag"></</span><span class="tag-name">version</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">dependency</span><span class="tag">></span><span> </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160516_43_1714955" name="code" class="html" style="display: none;"><dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.7.1.RELEASE</version>
</dependency></pre><br>
Redis配置
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 27898px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_49" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_49" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=49&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Configuration</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> RedisConfig { </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Bean</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> RedisConnectionFactory redisCF() { </span></span></li><li class=""><span> JedisConnectionFactory cf = <span class="keyword">new</span><span> JedisConnectionFactory(); </span></span></li><li class="alt"><span> cf.setHostName(<span class="string">"127.0.0.1"</span><span>);</span><span class="comment">//服务器IP</span><span> </span></span></li><li class=""><span> cf.setPort(<span class="number">6379</span><span>);</span><span class="comment">//端口</span><span> </span></span></li><li class="alt"><span> cf.setPassword(<span class="string">"密码"</span><span>); </span></span></li><li class=""><span> <span class="keyword">return</span><span> cf; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Bean</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) { </span></span></li><li class="alt"><span> RedisTemplate<String, String> redis = <span class="keyword">new</span><span> RedisTemplate<String, String>(); </span></span></li><li class=""><span> redis.setConnectionFactory(cf); </span></li><li class="alt"><span> <span class="keyword">return</span><span> redis; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Bean</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> StringRedisTemplate stringRedisTemplate(RedisConnectionFactory cf) { </span></span></li><li class=""><span> StringRedisTemplate redis = <span class="keyword">new</span><span> StringRedisTemplate(); </span></span></li><li class="alt"><span> redis.setConnectionFactory(cf); </span></li><li class=""><span> <span class="keyword">return</span><span> redis; </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160516_44_7952964" name="code" class="java" style="display: none;">@Configuration
public class RedisConfig {
@Bean
public RedisConnectionFactory redisCF() {
JedisConnectionFactory cf = new JedisConnectionFactory();
cf.setHostName("127.0.0.1");//服务器IP
cf.setPort(6379);//端口
cf.setPassword("密码");
return cf;
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
RedisTemplate<String, String> redis = new RedisTemplate<String, String>();
redis.setConnectionFactory(cf);
return redis;
}
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory cf) {
StringRedisTemplate redis = new StringRedisTemplate();
redis.setConnectionFactory(cf);
return redis;
}
}</pre><br>
测试用例
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 28487px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_50" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_50" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=50&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(classes = RedisConfig.</span><span class="keyword">class</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> RedisTest { </span></span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> StringRedisTemplate r1; </span></span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> get() { </span></span></li><li class=""><span> </span></li><li class="alt"><span> String foo=DateUtil.getNowTimeString(); </span></li><li class=""><span> r1.opsForValue().set(<span class="string">"foo"</span><span>, foo); </span></span></li><li class="alt"><span> </span></li><li class=""><span> foo=r1.opsForValue().get(<span class="string">"foo"</span><span>); </span></span></li><li class="alt"><span> System.out.println(<span class="string">"【Redis 测试>>>get set】"</span><span>+foo+</span><span class="string">"By http://blog.youkuaiyun.com/unix21"</span><span>); </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160516_45_5586413" name="code" class="java" style="display: none;">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = RedisConfig.class)
public class RedisTest {
@Autowired
private StringRedisTemplate r1;
@Test
public void get() {
String foo=DateUtil.getNowTimeString();
r1.opsForValue().set("foo", foo);
foo=r1.opsForValue().get("foo");
System.out.println("【Redis 测试>>>get set】"+foo+"By http://blog.youkuaiyun.com/unix21");
}
}</pre><br>
<p><img src="https://img-blog.youkuaiyun.com/20160516143826717" alt=""></p>
<p><br>
</p>
<p><span style="font-size:18px"><strong>6.Spring Security</strong></span></p>
<p><br>
</p>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 483px; top: 29368px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_51" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_51" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=51&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span>import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; </span></span></li><li class=""><span> </span></li><li class="alt"><span>public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer { </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160518_46_1523177" name="code" class="html" style="display: none;">import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer {
}</pre><br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 29535px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_52" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_52" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=52&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Configuration</span><span> </span></span></li><li class=""><span><span class="annotation">@EnableWebMvcSecurity</span><span> </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SecuredConfig </span><span class="keyword">extends</span><span> WebSecurityConfigurerAdapter { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> configure(HttpSecurity http) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class="alt"><span> </span></li><li class=""><span> http </span></li><li class="alt"><span> .authorizeRequests() </span></li><li class=""><span> .anyRequest().authenticated() </span></li><li class="alt"><span> .and() </span></li><li class=""><span> .formLogin() </span></li><li class="alt"><span> .and() </span></li><li class=""><span> .httpBasic(); </span></li><li class="alt"><span> </span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160518_47_4729543" name="code" class="java" style="display: none;">@Configuration
@EnableWebMvcSecurity
public class SecuredConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
}
}</pre>
<p></p>
<p><br>
</p>
这个时候访问任何页面都会跳转到系统自带的登陆页面<br>
<p><img src="https://img-blog.youkuaiyun.com/20160518150056762" alt=""></p>
<p>基于内存的用户存储:</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 30153px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_53" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_53" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=53&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="comment">//基于内存的用户</span><span> </span></span></li><li class=""><span><span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span><span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> configure(AuthenticationManagerBuilder auth) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class=""><span> auth </span></li><li class="alt"><span> .inMemoryAuthentication() </span></li><li class=""><span> .withUser(<span class="string">"user1"</span><span>).password(</span><span class="string">"pass1"</span><span>).roles(</span><span class="string">"USER"</span><span>).and() </span></span></li><li class="alt"><span> .withUser(<span class="string">"user2"</span><span>).password(</span><span class="string">"pass2"</span><span>).roles(</span><span class="string">"USER"</span><span>,</span><span class="string">"ADMIN"</span><span>); </span></span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160518_48_5327040" name="code" class="java" style="display: none;"> //基于内存的用户
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user1").password("pass1").roles("USER").and()
.withUser("user2").password("pass2").roles("USER","ADMIN");
}</pre><br>
<br>
<p></p>
故意输错用户名密码就进不去<br>
<p><img src="https://img-blog.youkuaiyun.com/20160518150906754" alt=""></p>
<p><br>
</p>
<p>验证 <span style="background-color:rgb(255,255,0)">指定页面</span>+<span style="background-color:rgb(255,255,0)">指定权限</span></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 30691px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_54" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_54" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=54&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Override</span><span> </span></span></li><li class=""><span><span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> configure(HttpSecurity http) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class="alt"><span> http </span></li><li class=""><span> .authorizeRequests() </span></li><li class="alt"><span> .antMatchers(<span class="string">"/news"</span><span>).hasRole(</span><span class="string">"USER"</span><span>) </span></span></li><li class=""><span> .and() </span></li><li class="alt"><span> .formLogin() </span></li><li class=""><span> .and() </span></li><li class="alt"><span> .httpBasic(); </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160518_49_399932" name="code" class="java" style="display: none;"> @Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/news").hasRole("USER")
.and()
.formLogin()
.and()
.httpBasic();
}</pre><br>
<br>
<p></p>
<p></p>
<p><br>
</p>
我们设定/news需要User角色的用户可以看,其他页面随便看<br>
<p><img src="https://img-blog.youkuaiyun.com/20160518174042974" alt=""></p>
<p><br>
</p>
<p>我们用user2登陆,由于没权限返回403</p>
<p><img src="https://img-blog.youkuaiyun.com/20160518175007862?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""><br>
</p>
<p>只有用user1登陆才可以看到页面内容。</p>
<p><br>
</p>
<p><strong>自定义登陆页</strong></p>
<p>现实开发中不肯能用Spring提供的简易登陆页,除非是一个很小的内部系统。</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 31798px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_55" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_55" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=55&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Configuration</span><span> </span></span></li><li class=""><span><span class="annotation">@EnableWebMvcSecurity</span><span> </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SecuredConfig </span><span class="keyword">extends</span><span> WebSecurityConfigurerAdapter { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> configure(HttpSecurity http) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class="alt"><span> http </span></li><li class=""><span> .authorizeRequests() </span></li><li class="alt"><span> .antMatchers(<span class="string">"/news/*"</span><span>).hasRole(</span><span class="string">"USER"</span><span>) </span></span></li><li class=""><span> .and() </span></li><li class="alt"><span> .formLogin() </span></li><li class=""><span> .loginPage(<span class="string">"/login"</span><span>) </span></span></li><li class="alt"><span> .defaultSuccessUrl(<span class="string">"/"</span><span>) </span></span></li><li class=""><span> .failureUrl(<span class="string">"/login?error"</span><span>) </span></span></li><li class="alt"><span> .permitAll() </span></li><li class=""><span> .and() </span></li><li class="alt"><span> .httpBasic(); </span></li><li class=""><span> } </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160519_50_3876130" name="code" class="java" style="display: none;">@Configuration
@EnableWebMvcSecurity
public class SecuredConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/news/*").hasRole("USER")
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/")
.failureUrl("/login?error")
.permitAll()
.and()
.httpBasic();
}</pre><br>
.antMatchers("/news/*").hasRole("USER") :匹配 /news/以及/news/ 开头的所有页面 需要USER权限<br>
<p></p>
<p>.loginPage("/login") :自定义登陆页<br>
.defaultSuccessUrl("/") :默认成功页,如果没有权限则跳转到该页面</p>
<p> .failureUrl("/login?error") :默认失败页面<br>
</p>
<p><br>
</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 32347px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_56" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_56" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=56&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="comment">// 1. /login 登录页面的常规显示</span><span> </span></span></li><li class=""><span><span class="comment">// 2. /login?error 登录验证失败的展示</span><span> </span></span></li><li class="alt"><span><span class="comment">// 3. /login?logout 注销登录的处理</span><span> </span></span></li><li class=""><span><span class="annotation">@RequestMapping</span><span>(value = </span><span class="string">"/login"</span><span>, method = RequestMethod.GET) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> ModelAndView login( </span></span></li><li class=""><span> <span class="annotation">@RequestParam</span><span>(value = </span><span class="string">"error"</span><span>, required = </span><span class="keyword">false</span><span>) String error, </span></span></li><li class="alt"><span> <span class="annotation">@RequestParam</span><span>(value = </span><span class="string">"logout"</span><span>, required = </span><span class="keyword">false</span><span>) String logout) { </span></span></li><li class=""><span> </span></li><li class="alt"><span> ModelAndView model = <span class="keyword">new</span><span> ModelAndView(); </span></span></li><li class=""><span> <span class="keyword">if</span><span> (error != </span><span class="keyword">null</span><span>) { </span></span></li><li class="alt"><span> model.addObject(<span class="string">"error"</span><span>, </span><span class="string">"用户名密码不对!"</span><span>); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">if</span><span> (logout != </span><span class="keyword">null</span><span>) { </span></span></li><li class="alt"><span> model.addObject(<span class="string">"msg"</span><span>, </span><span class="string">"You've been logged out successfully."</span><span>); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> model.setViewName(<span class="string">"login"</span><span>); </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">return</span><span> model; </span></span></li><li class=""><span> </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160519_51_5130649" name="code" class="java" style="display: none;">
// 1. /login 登录页面的常规显示
// 2. /login?error 登录验证失败的展示
// 3. /login?logout 注销登录的处理
@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView login(
@RequestParam(value = "error", required = false) String error,
@RequestParam(value = "logout", required = false) String logout) {
ModelAndView model = new ModelAndView();
if (error != null) {
model.addObject("error", "用户名密码不对!");
}
if (logout != null) {
model.addObject("msg", "You've been logged out successfully.");
}
model.setViewName("login");
return model;
}</pre><br>
login.jsp
<p></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 32846px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_57" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_57" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=57&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span><%</span><span class="annotation">@page</span><span> contentType=</span><span class="string">"text/html"</span><span> pageEncoding=</span><span class="string">"UTF-8"</span><span>%> </span></span></li><li class=""><span><html> </span></li><li class="alt"><span> <head> </span></li><li class=""><span> <title>登陆</title> </span></li><li class="alt"><span> </head> </span></li><li class=""><span> <body οnlοad=<span class="string">'document.f.username.focus();'</span><span>> </span></span></li><li class="alt"><span> <h3>登陆页</h3> </span></li><li class=""><span> <c:<span class="keyword">if</span><span> test=</span><span class="string">"${not empty error}"</span><span>> </span></span></li><li class="alt"><span> <div style=<span class="string">"color: red"</span><span>>${error}</div> </span></span></li><li class=""><span> </c:<span class="keyword">if</span><span>> </span></span></li><li class="alt"><span> <c:<span class="keyword">if</span><span> test=</span><span class="string">"${not empty msg}"</span><span>> </span></span></li><li class=""><span> <div>${msg}</div> </span></li><li class="alt"><span> </c:<span class="keyword">if</span><span>> </span></span></li><li class=""><span> <form name=<span class="string">'f'</span><span> action=</span><span class="string">'/gkweb/login'</span><span> method=</span><span class="string">'POST'</span><span>> </span></span></li><li class="alt"><span> <table> </span></li><li class=""><span> <tr><td>用户名:</td><td><input type=<span class="string">'text'</span><span> name=</span><span class="string">'username'</span><span> value=</span><span class="string">''</span><span>></td></tr> </span></span></li><li class="alt"><span> <tr><td>密码:</td><td><input type=<span class="string">'password'</span><span> name=</span><span class="string">'password'</span><span>/></td></tr> </span></span></li><li class=""><span> <tr><td colspan=<span class="string">'2'</span><span>><input name=</span><span class="string">"submit"</span><span> type=</span><span class="string">"submit"</span><span> value=</span><span class="string">"登陆"</span><span>/></td></tr> </span></span></li><li class="alt"><span> </table> </span></li><li class=""><span> <input type=<span class="string">"hidden"</span><span> name=</span><span class="string">"${_csrf.parameterName}"</span><span> </span></span></li><li class="alt"><span> value=<span class="string">"${_csrf.token}"</span><span> /> </span></span></li><li class=""><span> </form> </span></li><li class="alt"><span> </body> </span></li><li class=""><span></html> </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160519_52_1160915" name="code" class="java" style="display: none;"><%@page contentType="text/html" pageEncoding="UTF-8"%>
<html>
<head>
<title>登陆</title>
</head>
<body οnlοad='document.f.username.focus();'>
<h3>登陆页</h3>
<c:if test="${not empty error}">
<div style="color: red">${error}</div>
</c:if>
<c:if test="${not empty msg}">
<div>${msg}</div>
</c:if>
<form name='f' action='/gkweb/login' method='POST'>
<table>
<tr><td>用户名:</td><td><input type='text' name='username' value=''></td></tr>
<tr><td>密码:</td><td><input type='password' name='password'/></td></tr>
<tr><td colspan='2'><input name="submit" type="submit" value="登陆"/></td></tr>
</table>
<input type="hidden" name="${_csrf.parameterName}"
value="${_csrf.token}" />
</form>
</body>
</html></pre>此处参考:<a target="_blank" href="http://www.mkyong.com/spring-security/spring-security-form-login-example/">http://www.mkyong.com/spring-security/spring-security-form-login-example/</a>
<p></p>
<p><img src="https://img-blog.youkuaiyun.com/20160519115530515" alt=""><img src="https://img-blog.youkuaiyun.com/20160519115538285" alt=""></p>
<p><br>
</p>
<p>配置多个页面权限控制</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 33602px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_58" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_58" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=58&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>.antMatchers(</span><span class="string">"/news/*"</span><span>,</span><span class="string">"/user/*"</span><span>).hasRole(</span><span class="string">"USER"</span><span>) </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160519_53_5908456" name="code" class="java" style="display: none;">.antMatchers("/news/*","/user/*").hasRole("USER")</pre>
<p>写法二</p>
<p></p>
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><b>[cpp]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 475px; top: 33715px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_59" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_59" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=59&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span>.antMatchers(</span><span class="string">"/news/*"</span><span>).hasRole(</span><span class="string">"USER"</span><span>) </span></span></li><li class=""><span>.antMatchers(<span class="string">"/user/*"</span><span>).hasRole(</span><span class="string">"USER"</span><span>) </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_54_8112833" name="code" class="cpp" style="display: none;">.antMatchers("/news/*").hasRole("USER")
.antMatchers("/user/*").hasRole("USER")</pre>可以将任意多的antMatchers(),anyRequest()连接起来,但是这些规则会按给定的顺序发挥作用,所以需要将<strong>最为具体的请求路径放在最前面</strong>,而最不具体的路径anyRequest()放在后面,不然不具体的就会覆盖掉具体的。<br>
<br>
<p></p>
<br>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 33924px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_60" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_60" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=60&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Override</span><span> </span></span></li><li class=""><span><span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> configure(HttpSecurity http) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class="alt"><span> http </span></li><li class=""><span> .authorizeRequests() </span></li><li class="alt"><span> .antMatchers(<span class="string">"/"</span><span>, </span><span class="string">"/home"</span><span>).permitAll() </span></span></li><li class=""><span> .anyRequest().authenticated() </span></li><li class="alt"><span> .and() </span></li><li class=""><span> .formLogin() </span></li><li class="alt"><span> .loginPage(<span class="string">"/login"</span><span>) </span></span></li><li class=""><span> .defaultSuccessUrl(<span class="string">"/helloadmin"</span><span>) </span></span></li><li class="alt"><span> .permitAll() </span></li><li class=""><span> .and() </span></li><li class="alt"><span> .logout() </span></li><li class=""><span> .permitAll(); </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160519_54_5838149" name="code" class="java" style="display: none;"> @Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/helloadmin")
.permitAll()
.and()
.logout()
.permitAll();
}</pre><br>
<p>对URL进行权限配置,使得"/", "/home"不需要登录就可以访问,其他需要登录。登录的地址是'/login',当登录成功后将跳转到/helloadmin页面,并且登录、登出页面都是不需要登录就可以访问的。</p>
<p>参考:<a target="_blank" href="http://www.tianmaying.com/tutorial/spring-security">使用Spring Security进行权限验证</a></p>
<p></p>
<p><br>
</p>
<p><strong>.httpBasic()</strong></p>
<p>支持弹窗就是windows自带的认证框进行认证。由于不好扩展这个基本没什么用,可以不用。</p>
<p><br>
</p>
<p><strong>.rememberMe()</strong></p>
<p>记住我的状态</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 34523px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_61" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_61" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=61&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>.rememberMe().key(</span><span class="string">"web"</span><span>) </span></span></li><li class=""><span> .tokenValiditySeconds(<span class="number">1209600</span><span>); </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_55_5929473" name="code" class="java" style="display: none;">.rememberMe().key("web")
.tokenValiditySeconds(1209600);</pre><br>
<p><img src="https://img-blog.youkuaiyun.com/20160520095339422" alt=""></p>
<p><strong>.logout()</strong><br>
</p>
<p>注销功能</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 34876px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_62" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_62" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=62&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> configure(HttpSecurity http) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class="alt"><span> http </span></li><li class=""><span> .authorizeRequests() </span></li><li class="alt"><span> .antMatchers(<span class="string">"/news/*"</span><span>).hasRole(</span><span class="string">"USER"</span><span>) </span></span></li><li class=""><span> .and() </span></li><li class="alt"><span> .formLogin() </span></li><li class=""><span> .loginPage(<span class="string">"/login"</span><span>) </span></span></li><li class="alt"><span> .defaultSuccessUrl(<span class="string">"/"</span><span>) </span></span></li><li class=""><span> .failureUrl(<span class="string">"/login?error"</span><span>) </span></span></li><li class="alt"><span> .usernameParameter(<span class="string">"username"</span><span>) </span></span></li><li class=""><span> .passwordParameter(<span class="string">"password"</span><span>) </span></span></li><li class="alt"><span> .and() </span></li><li class=""><span> .logout() </span></li><li class="alt"><span> .logoutSuccessUrl(<span class="string">"/login?logout"</span><span>) </span></span></li><li class=""><span> .and() </span></li><li class="alt"><span> .rememberMe().key(<span class="string">"gkweb"</span><span>) </span></span></li><li class=""><span> .tokenValiditySeconds(<span class="number">1209600</span><span>); </span></span></li><li class="alt"><span> } </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_56_4614253" name="code" class="java" style="display: none;"> @Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/news/*").hasRole("USER")
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/")
.failureUrl("/login?error")
.usernameParameter("username")
.passwordParameter("password")
.and()
.logout()
.logoutSuccessUrl("/login?logout")
.and()
.rememberMe().key("gkweb")
.tokenValiditySeconds(1209600);
}</pre><br>
注销就是页面给用户一个链接或者按钮
<p></p>
<p><strong>1.使用jstl声明</strong>退出路径</p>
<p>引用jar包</p>
<p></p>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 483px; top: 35391px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_63" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_63" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=63&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">dependency</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">groupId</span><span class="tag">></span><span>jstl</span><span class="tag"></</span><span class="tag-name">groupId</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">artifactId</span><span class="tag">></span><span>jstl</span><span class="tag"></</span><span class="tag-name">artifactId</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">version</span><span class="tag">></span><span>1.2</span><span class="tag"></</span><span class="tag-name">version</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">dependency</span><span class="tag">></span><span> </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_57_1724314" name="code" class="html" style="display: none;"><dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency></pre><br>
<p></p>
<p></p>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 483px; top: 35576px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_64" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_64" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=64&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span>%@ taglib </span><span class="attribute">uri</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsp/jstl/core"</span><span> </span><span class="attribute">prefix</span><span>=</span><span class="attribute-value">"c"</span><span> %</span><span class="tag">></span><span> </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_58_470578" name="code" class="html" style="display: none;"><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %></pre><div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 483px; top: 35645px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_65" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_65" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=65&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">c:url</span><span> </span><span class="attribute">var</span><span>=</span><span class="attribute-value">"logoutUrl"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"/logout"</span><span class="tag">/></span><span> </span></span></li><li class=""><span><span class="tag"><</span><span class="tag-name">form</span><span> </span><span class="attribute">action</span><span>=</span><span class="attribute-value">"${logoutUrl}"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">method</span><span>=</span><span class="attribute-value">"post"</span><span class="tag">></span><span> </span></span></li><li class=""><span><span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"submit"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">value</span><span>=</span><span class="attribute-value">"Log out"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span><span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"hidden"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">name</span><span>=</span><span class="attribute-value">"${_csrf.parameterName}"</span><span> </span></span></li><li class=""><span> <span class="attribute">value</span><span>=</span><span class="attribute-value">"${_csrf.token}"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">form</span><span class="tag">></span><span> </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_59_8452691" name="code" class="html" style="display: none;"><c:url var="logoutUrl" value="/logout"/>
<form action="${logoutUrl}"
method="post">
<input type="submit"
value="Log out" />
<input type="hidden"
name="${_csrf.parameterName}"
value="${_csrf.token}"/>
</form></pre><br>
<br>
<strong>2.硬编码</strong>退出路径
<p></p>
<p></p>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 483px; top: 35954px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_66" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_66" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=66&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">form</span><span> </span><span class="attribute">action</span><span>=</span><span class="attribute-value">"${pageContext.request.contextPath}/logout"</span><span> </span><span class="attribute">method</span><span>=</span><span class="attribute-value">"post"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"submit"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"Logout"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"hidden"</span><span> </span></span></li><li class=""><span> <span class="attribute">name</span><span>=</span><span class="attribute-value">"${_csrf.parameterName}"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">value</span><span>=</span><span class="attribute-value">"${_csrf.token}"</span><span class="tag">/></span><span> </span></span></li><li class=""><span><span class="tag"></</span><span class="tag-name">form</span><span class="tag">></span><span> </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_60_5247108" name="code" class="html" style="display: none;"><form action="${pageContext.request.contextPath}/logout" method="post">
<input type="submit" value="Logout" />
<input type="hidden"
name="${_csrf.parameterName}"
value="${_csrf.token}"/>
</form></pre><br>
<p>3.链接退出</p>
<p></p>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 483px; top: 36183px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_67" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_67" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=67&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">script</span><span class="tag">></span><span> </span></span></li><li class=""><span> function formSubmit() { </span></li><li class="alt"><span> document.getElementById("logoutForm").submit(); </span></li><li class=""><span> } </span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">script</span><span class="tag">></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">form</span><span> </span><span class="attribute">action</span><span>=</span><span class="attribute-value">"${pageContext.request.contextPath}/logout"</span><span> </span><span class="attribute">method</span><span>=</span><span class="attribute-value">"post"</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"logoutForm"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">c:if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"${pageContext.request.userPrincipal.name != null}"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">h2</span><span class="tag">></span><span> </span></span></li><li class=""><span> Welcome : ${pageContext.request.userPrincipal.name} | <span class="tag"><</span><span class="tag-name">a</span><span> </span><span class="attribute">href</span><span>=</span><span class="attribute-value">"javascript:formSubmit()"</span><span class="tag">></span><span> 退出1-链接</span><span class="tag"></</span><span class="tag-name">a</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">h2</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">c:if</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"submit"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"退出1-按钮"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"hidden"</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"${_csrf.parameterName}"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"${_csrf.token}"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">form</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">c:url</span><span> </span><span class="attribute">var</span><span>=</span><span class="attribute-value">"logoutUrl"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"/logout"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">form</span><span> </span><span class="attribute">action</span><span>=</span><span class="attribute-value">"${logoutUrl}"</span><span> </span><span class="attribute">method</span><span>=</span><span class="attribute-value">"post"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">c:if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"${pageContext.request.userPrincipal.name != null}"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">h2</span><span class="tag">></span><span> </span></span></li><li class=""><span> Welcome : ${pageContext.request.userPrincipal.name} | <span class="tag"><</span><span class="tag-name">a</span><span> </span><span class="attribute">href</span><span>=</span><span class="attribute-value">"javascript:formSubmit()"</span><span class="tag">></span><span> 退出2-链接</span><span class="tag"></</span><span class="tag-name">a</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">h2</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">c:if</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"submit"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"退出2-按钮"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"hidden"</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"${_csrf.parameterName}"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"${_csrf.token}"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">form</span><span class="tag">></span><span> </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_62_4876958" name="code" class="html" style="display: none;"><script>
function formSubmit() {
document.getElementById("logoutForm").submit();
}
</script>
<form action="${pageContext.request.contextPath}/logout" method="post" id="logoutForm">
<c:if test="${pageContext.request.userPrincipal.name != null}">
<h2>
Welcome : ${pageContext.request.userPrincipal.name} | <a href="javascript:formSubmit()"> 退出1-链接</a>
</h2>
</c:if>
<input type="submit" value="退出1-按钮" />
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form>
<c:url var="logoutUrl" value="/logout"/>
<form action="${logoutUrl}" method="post">
<c:if test="${pageContext.request.userPrincipal.name != null}">
<h2>
Welcome : ${pageContext.request.userPrincipal.name} | <a href="javascript:formSubmit()"> 退出2-链接</a>
</h2>
</c:if>
<input type="submit" value="退出2-按钮" />
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form></pre><br>
<p><strong>自定义的用户服务</strong></p>
<p>实际开发肯定是需要去<a href="http://lib.youkuaiyun.com/base/mysql" class="replace_word" title="MySQL知识库" target="_blank" style="color:#df3434; font-weight:bold;">数据库</a>或者其他地方查询用户账号密码等</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 36834px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_68" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_68" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=68&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> configure(AuthenticationManagerBuilder auth) </span><span class="keyword">throws</span><span> Exception { </span></span></li><li class="alt"><span> auth.userDetailsService(<span class="keyword">new</span><span> CustomUserDetailsService(userDao)); </span></span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_63_1349123" name="code" class="java" style="display: none;">@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(new CustomUserDetailsService(userDao));
}</pre>
<p></p>
<p><br>
</p>
<span style="color:#ff0000"><strong>注意:CustomUserDetailsService需要的bean一定要从userDetailsService调用CustomUserDetailsService的构造器传递过去,</strong></span>
<p><span style="color:#ff0000"><strong>而不能直接在CustomUserDetailsService使用@Autowired注解出来。</strong></span><br>
</p>
<p>CustomUserDetailsService集成的接口UserDetailsService无需自己重新定义,参考 <a target="_blank" href="http://blog.youkuaiyun.com/unix21/article/details/51450976">泛型推断类型不符合上限</a></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 37105px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_69" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_69" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=69&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CustomUserDetailsService </span><span class="keyword">implements</span><span> UserDetailsService { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">private</span><span> </span><span class="keyword">final</span><span> UserMapper userDao; </span></span></li><li class=""><span> <span class="keyword">public</span><span> CustomUserDetailsService(UserMapper u) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.userDao = u; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> UserDetails loadUserByUsername(String username) </span><span class="keyword">throws</span><span> UsernameNotFoundException { </span></span></li><li class=""><span> UserBean user = userDao.findByName(username); </span></li><li class="alt"><span> <span class="keyword">if</span><span> (user == </span><span class="keyword">null</span><span>) { </span></span></li><li class=""><span> <span class="keyword">throw</span><span> </span><span class="keyword">new</span><span> UsernameNotFoundException(</span><span class="string">"没有找到对应用户"</span><span>); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> List<SimpleGrantedAuthority> authorities = <span class="keyword">new</span><span> ArrayList<>(); </span></span></li><li class="alt"><span> authorities.add(<span class="keyword">new</span><span> SimpleGrantedAuthority(user.getUtype().toString())); </span></span></li><li class=""><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> org.springframework.security.core.userdetails.User(user.getUserName(), user.getPassword(), authorities); </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160520_64_8699163" name="code" class="java" style="display: none;">public class CustomUserDetailsService implements UserDetailsService {
private final UserMapper userDao;
public CustomUserDetailsService(UserMapper u) {
this.userDao = u;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserBean user = userDao.findByName(username);
if (user == null) {
throw new UsernameNotFoundException("没有找到对应用户");
}
List<SimpleGrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority(user.getUtype().toString()));
return new org.springframework.security.core.userdetails.User(user.getUserName(), user.getPassword(), authorities);
}
}</pre><br>
<p></p>
<p><strong>跨站攻击</strong></p>
<p>Spring Security3.2开始默认是开启的的,如果有特殊要求可以关闭跨站防御</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 37576px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_70" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_70" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=70&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>.csrf().disable(); </span></span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160523_65_5466165" name="code" class="java" style="display: none;">.csrf().disable();</pre><br>
<br>
<p><strong>多权限组合</strong></p>
<p>需要注意要以页面为单位,不然下面的配置会和上面的冲突</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 37767px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_71" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_71" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=71&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>.authorizeRequests() </span></span></li><li class=""><span> .antMatchers(<span class="string">"/news/*"</span><span>,</span><span class="string">"/school/*"</span><span>).hasAnyRole(</span><span class="string">"1"</span><span>,</span><span class="string">"4"</span><span>) </span></span></li><li class="alt"><span> .antMatchers(<span class="string">"/goods/*"</span><span>).hasRole(</span><span class="string">"4"</span><span>) </span></span></li><li class=""><span> .and() </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160523_66_400534" name="code" class="java" style="display: none;">.authorizeRequests()
.antMatchers("/news/*","/school/*").hasAnyRole("1","4")
.antMatchers("/goods/*").hasRole("4")
.and()</pre><br>
<p><br>
<strong>自定义403页面</strong></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 37986px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_72" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_72" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=72&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>http.authorizeRequests() </span></span></li><li class=""><span> .antMatchers(<span class="string">"/admin/**"</span><span>).access(</span><span class="string">"hasRole('ROLE_ADMIN')"</span><span>) </span></span></li><li class="alt"><span> .and().formLogin() </span></li><li class=""><span> .loginPage(<span class="string">"/login"</span><span>).failureUrl(</span><span class="string">"/login?error"</span><span>) </span></span></li><li class="alt"><span> .usernameParameter(<span class="string">"username"</span><span>) </span></span></li><li class=""><span> .passwordParameter(<span class="string">"password"</span><span>) </span></span></li><li class="alt"><span> .and().logout().logoutSuccessUrl(<span class="string">"/login?logout"</span><span>) </span></span></li><li class=""><span> .and() </span></li><li class="alt"><span> .exceptionHandling().accessDeniedPage(<span class="string">"/403"</span><span>) </span></span></li><li class=""><span> } </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160523_67_5798687" name="code" class="java" style="display: none;">http.authorizeRequests()
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.and().formLogin()
.loginPage("/login").failureUrl("/login?error")
.usernameParameter("username")
.passwordParameter("password")
.and().logout().logoutSuccessUrl("/login?logout")
.and()
.exceptionHandling().accessDeniedPage("/403")
}</pre>
<p></p>
<p>然后自己写一个SpringMVC的/403页面即可</p>
参考:<a target="_blank" href="http://www.mkyong.com/spring-security/customize-http-403-access-denied-page-in-spring-security/">Spring Security : Customize 403 access denied page</a><br>
<p><br>
</p>
<p><strong>自定义404页面</strong></p>
<p>其实这个是SpringMVC干的事情,非常简单</p>
<p>定义一个</p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 38391px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_73" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_73" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=73&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@RequestMapping</span><span>(value = </span><span class="string">"*"</span><span>, method = RequestMethod.GET) </span></span></li><li class=""><span><span class="keyword">public</span><span> String my404() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="string">"404"</span><span>; </span></span></li><li class=""><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160523_68_7906442" name="code" class="java" style="display: none;"> @RequestMapping(value = "*", method = RequestMethod.GET)
public String my404() {
return "404";
}</pre><br>
<br>
<p><strong>POST参数中文乱码的解决</strong></p>
<p>注意,如果没有使用Springsecurity,那么可以直接在SpingWebInitializer定义一个getServletFilters()</p>
<p>如下:</p>
<p></p><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 481px; top: 38662px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_74" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_74" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=74&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> javax.servlet.Filter; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.web.filter.CharacterEncodingFilter; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SpingWebInitializer </span><span class="keyword">extends</span><span> AbstractAnnotationConfigDispatcherServletInitializer { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">protected</span><span> Class<?>[] getRootConfigClasses() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> Class<?>[]{RootConfig.</span><span class="keyword">class</span><span>}; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">protected</span><span> Class<?>[] getServletConfigClasses() { </span></span></li><li class=""><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> Class<?>[]{WebConfig.</span><span class="keyword">class</span><span>}; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">protected</span><span> String[] getServletMappings() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> String[]{</span><span class="string">"/"</span><span>}; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">protected</span><span> Filter[] getServletFilters() { </span></span></li><li class=""><span> CharacterEncodingFilter characterEncodingFilter = <span class="keyword">new</span><span> CharacterEncodingFilter(); </span></span></li><li class="alt"><span> characterEncodingFilter.setEncoding(<span class="string">"UTF-8"</span><span>); </span></span></li><li class=""><span> characterEncodingFilter.setForceEncoding(<span class="keyword">true</span><span>); </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> Filter[] { characterEncodingFilter}; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160727_74_1500266" name="code" class="java" style="display: none;">import javax.servlet.Filter;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class SpingWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return new Filter[] { characterEncodingFilter};
}
}</pre><p></p>
<p><br>
</p>
如果使用了Springsecurity,那么需要在Springsecurity的配置文件里配置,因为<strong>CharacterEncodingFilter 需要在 SecurityFilter之前启动</strong>
<p></p><div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><b>[cpp]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 475px; top: 39305px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_75" src="http://static.blog.youkuaiyun.com/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_75" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=75&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SecuredConfig extends WebSecurityConfigurerAdapter { </span></span></li><li class=""><span>@Override </span></li><li class="alt"><span> <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> configure(HttpSecurity http) throws Exception { </span></span></li><li class=""><span> <span class="comment">//The CharacterEncodingFilter must be started before SecurityFilter. I moved it to security configuration:</span><span> </span></span></li><li class="alt"><span> CharacterEncodingFilter encodingFilter = <span class="keyword">new</span><span> CharacterEncodingFilter(); </span></span></li><li class=""><span> encodingFilter.setEncoding(<span class="string">"UTF-8"</span><span>); </span></span></li><li class="alt"><span> encodingFilter.setForceEncoding(<span class="keyword">true</span><span>); </span></span></li><li class=""><span> http.addFilterBefore(encodingFilter,CsrfFilter.<span class="keyword">class</span><span>); </span></span></li><li class="alt"><span>... ... </span></li></ol></div><pre code_snippet_id="1672099" snippet_file_name="blog_20160727_75_2993983" name="code" class="cpp" style="display: none;">public class SecuredConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//The CharacterEncodingFilter must be started before SecurityFilter. I moved it to security configuration:
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding("UTF-8");
encodingFilter.setForceEncoding(true);
http.addFilterBefore(encodingFilter,CsrfFilter.class);
... ...</pre><br>
<br>
<br>
<p></p>
<p></p>
</div>