<!-- 面包屑end -->
<div class="detail-title-wrap">
<h1 class="detail-title">
<span class="d-t js-title">三分钟学会@Autowired@Qualifier@Primary注解</span>
</h1>
<div class="dc-profile clearfix">
<div class="l">
<span class="spacer">2018.10.08 20:24</span>
<span class="spacer spacer-2">154浏览</span>
</div>
<div class="r path-right-box">
<div class="rinfo l"> </div>
</div>
</div>
</div> <!-- 手记详情 -->
<div class="detail-content-wrap">
<div class="detail-content js-lookimg"> <div><p>今天主要简单的跟大家介绍一下spring自动装配相关的<strong>@Autowired,@Qualifier和@Primary注解</strong></p><p><strong>1,@Autowired注解的使用</strong></p><p>继续上文深入理解spring注解之@ComponentScan注解中的例子,现在我们需要在UserService中调用UserDao相关操作,那我们可以在UserService中增加如下代码:</p><section><pre><code class="hljs java"><span class=""><span class="hljs-keyword"><span class="hljs-keyword">import</span></span></span> com.zhang.dao.UserDao;<br><span class=""><span class="hljs-meta"><span class="hljs-meta">@Service</span></span></span><br><span class=""><span class="hljs-meta"><span class="hljs-meta">public</span></span></span> <span class=""><span class=""><span class="hljs-class"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword">class</span></span></span></span></span><span class="hljs-class"><span class="hljs-class"> </span></span><span class=""><span class="hljs-class"><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">UserService</span></span></span></span></span><span class="hljs-class"><span class="hljs-class"> </span></span></span>{<br> &nbsp; &nbsp;<span class=""><span class="hljs-meta"><span class="hljs-meta">@Autowired</span></span></span><br> &nbsp; &nbsp;<span class=""><span class="hljs-keyword"><span class="hljs-keyword">private</span></span></span> UserDao userDao;<br> &nbsp; &nbsp;<span class=""><span class="hljs-comment"><span class="hljs-comment">/**</span></span><br><span class="hljs-comment"><span class="hljs-comment"> &nbsp; &nbsp; * 增加一个tostring方法 方便测试</span></span><br><span class="hljs-comment"><span class="hljs-comment"> &nbsp; &nbsp; */</span></span></span><br> &nbsp; &nbsp;<span class=""><span class="hljs-meta"><span class="hljs-meta">@Override</span></span></span><br> &nbsp; &nbsp;<span class=""><span class=""><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public</span></span></span></span></span><span class="hljs-function"><span class="hljs-function"> String </span></span><span class=""><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">toString</span></span></span></span></span><span class=""><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">()</span></span></span></span></span><span class="hljs-function"><span class="hljs-function"> </span></span></span>{<br> &nbsp; &nbsp; &nbsp; &nbsp;<span class=""><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span> <span class=""><span class="hljs-string"><span class="hljs-string">"UserService [userDao="</span></span></span> + userDao + <span class=""><span class="hljs-string"><span class="hljs-string">"]"</span></span></span>;<br> &nbsp; &nbsp;}<br>}<br></code></pre></section><p>测试代码如下:</p><section><pre><code class="hljs scala"><span class="hljs-type"><span class="hljs-type">AnnotationConfigApplicationContext</span></span> applicationContext2 = <span class=""><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span> <span class="hljs-type"><span class="hljs-type">AnnotationConfigApplicationContext</span></span>(<span class="hljs-type"><span class="hljs-type">MainScanConfig</span></span>.<span class="hljs-keyword"><span class="hljs-keyword">class</span></span>);<br><span class="hljs-type"><span class="hljs-type">UserService</span></span> <span class=""><span class="hljs-class"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword">object</span></span></span></span></span><span class="hljs-class"><span class="hljs-class"> </span></span>= (<span class="hljs-type"><span class="hljs-type">UserService</span></span>) applicationContext2.getBean(<span class=""><span class="hljs-string"><span class="hljs-string">"userService"</span></span></span>);<br><span class="hljs-type"><span class="hljs-type">System</span></span>.<span class="">out</span>.println(<span class=""><span class="hljs-string"><span class="hljs-string">"实例bean为 === "</span></span></span>+<span class=""><span class="hljs-class"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword">object</span></span></span></span></span><span class="hljs-class"><span class="hljs-class">)</span></span>;<br></code></pre></section><p>运行结果如下:</p><section><pre><code class="hljs diff">实例bean为 <span class=""><span class="hljs-comment"><span class="hljs-comment">=== UserService [userDao=com.zhang.dao.UserDao@51b279c9]</span></span></span><br></code></pre></section><p>根据运行结果我们可以发现<strong>userDao已经成功注入到UserService</strong>中了</p><p>假设现在业务中有一种情况是UserDao是<strong>第三方提供的服务</strong>,我们也不能保证其是否可以成功加入到spring容器中,<strong>那我们也不能因为UserDao没能成功注入到spring容器而使我们整个UserService服务都不能使用</strong>,那这边我们就来演示一下这种情况,如下我们注释掉UserDao的@Repository注解:</p><section><pre><code class="hljs coffeescript"><span class=""><span class="hljs-keyword"><span class="hljs-keyword">import</span></span></span> org.springframework.stereotype.Repository;<br><span class=""><span class="hljs-regexp"><span class="hljs-regexp">//</span></span>@Repository</span><br><span class="">public</span> <span class=""><span class=""><span class="hljs-class"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword">class</span></span></span></span></span><span class="hljs-class"><span class="hljs-class"> </span></span><span class=""><span class="hljs-class"><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">UserDao</span></span></span></span></span><span class="hljs-class"><span class="hljs-class"> {</span></span></span><br><span class="hljs-class"><span class="hljs-class">}</span></span><br></code></pre></section><p>这个时候你再启动测试类会报如下错误:</p><section><pre><code class="hljs haskell">警告: <span class="hljs-type"><span class="hljs-type">Exception</span></span> encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.<span class="hljs-type"><span class="hljs-type">UnsatisfiedDependencyException</span></span>: <span class="hljs-type"><span class="hljs-type">Error</span></span> creating bean with name <span class="">'userService'</span>: <span class="hljs-type"><span class="hljs-type">Unsatisfied</span></span> dependency expressed through field <span class="">'userDao'</span>; nested exception <span class="">is</span> org.springframework.beans.factory.<span class="hljs-type"><span class="hljs-type">NoSuchBeanDefinitionException</span></span>: <span class="hljs-type"><span class="hljs-type">No</span></span> qualifying bean <span class="hljs-keyword"><span class="hljs-keyword">of</span></span> <span class="hljs-class"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword">type</span></span></span><span class="hljs-class"> </span></span><span class=""><span class="hljs-class"><span class="hljs-class">'com.zhang.dao.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">UserDao'</span></span></span></span></span><span class="hljs-class"><span class="hljs-class"> available: expected at least </span></span><span class=""><span class="hljs-class"><span class="hljs-class">1</span></span></span><span class="hljs-class"><span class="hljs-class"> bean which qualifies </span></span><span class=""><span class="hljs-class"><span class="hljs-class">as</span></span></span><span class="hljs-class"><span class="hljs-class"> autowire candidate. </span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">Dependency</span></span></span><span class="hljs-class"> annotations: {</span></span><span class=""><span class="hljs-class"><span class="hljs-class">@</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">org</span></span></span></span></span><span class="hljs-class"><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">springframework</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">beans</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">factory</span></span></span><span class="hljs-class">.</span></span><span class=""><span class="hljs-class"><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">annotation</span></span></span></span></span><span class="hljs-class"><span class="hljs-class">.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">Autowired</span></span></span><span class="hljs-class">(</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">required</span></span></span><span class="hljs-class">=</span></span><span class=""><span class="hljs-class"><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">true</span></span></span></span></span><span class="hljs-class"><span class="hljs-class">)}</span></span><br><span class="hljs-class"><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">Exception</span></span></span><span class="hljs-class"> </span></span><span class=""><span class="hljs-class"><span class="hljs-class">in</span></span></span><span class="hljs-class"><span class="hljs-class"> thread </span></span><span class=""><span class="hljs-class"><span class="hljs-class">"main"</span></span></span><span class="hljs-class"><span class="hljs-class"> org.springframework.beans.factory.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">UnsatisfiedDependencyException</span></span></span><span class="hljs-class">: </span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">Error</span></span></span><span class="hljs-class"> creating bean with name </span></span><span class=""><span class="hljs-class"><span class="hljs-class">'userService'</span></span></span><span class="hljs-class"><span class="hljs-class">: </span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">Unsatisfied</span></span></span><span class="hljs-class"> dependency expressed through field </span></span><span class=""><span class="hljs-class"><span class="hljs-class">'userDao'</span></span></span><span class="hljs-class"><span class="hljs-class">; nested exception </span></span><span class=""><span class="hljs-class"><span class="hljs-class">is</span></span></span><span class="hljs-class"><span class="hljs-class"> org.springframework.beans.factory.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">NoSuchBeanDefinitionException</span></span></span><span class="hljs-class">: </span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">No</span></span></span><span class="hljs-class"> qualifying bean of </span><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword">type</span></span></span><span class="hljs-class"> </span></span><span class=""><span class="hljs-class"><span class="hljs-class">'com.zhang.dao.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">UserDao'</span></span></span></span></span><span class="hljs-class"><span class="hljs-class"> available: expected at least </span></span><span class=""><span class="hljs-class"><span class="hljs-class">1</span></span></span><span class="hljs-class"><span class="hljs-class"> bean which qualifies </span></span><span class=""><span class="hljs-class"><span class="hljs-class">as</span></span></span><span class="hljs-class"><span class="hljs-class"> autowire candidate. </span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">Dependency</span></span></span><span class="hljs-class"> annotations: {</span></span><span class=""><span class="hljs-class"><span class="hljs-class">@</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">org</span></span></span></span></span><span class="hljs-class"><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">springframework</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">beans</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">factory</span></span></span><span class="hljs-class">.</span></span><span class=""><span class="hljs-class"><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">annotation</span></span></span></span></span><span class="hljs-class"><span class="hljs-class">.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">Autowired</span></span></span><span class="hljs-class">(</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">required</span></span></span><span class="hljs-class">=</span></span><span class=""><span class="hljs-class"><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">true</span></span></span></span></span><span class="hljs-class"><span class="hljs-class">)}</span></span><br><span class="hljs-class"><span class="hljs-class"> &nbsp; &nbsp;at org.springframework.beans.factory.</span></span><span class=""><span class="hljs-class"><span class="hljs-class">annotation</span></span></span><span class="hljs-class"><span class="hljs-class">.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AutowiredAnnotationBeanPostProcessor</span></span></span><span class="hljs-class">$</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AutowiredFieldElement</span></span></span><span class="hljs-class">.inject(</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AutowiredAnnotationBeanPostProcessor</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">java</span></span></span><span class="hljs-class">:</span></span><span class=""><span class="hljs-class"><span class="hljs-class">588</span></span></span><span class="hljs-class"><span class="hljs-class">)</span></span><br><span class="hljs-class"><span class="hljs-class"> &nbsp; &nbsp;at org.springframework.beans.factory.</span></span><span class=""><span class="hljs-class"><span class="hljs-class">annotation</span></span></span><span class="hljs-class"><span class="hljs-class">.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">InjectionMetadata</span></span></span><span class="hljs-class">.inject(</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">InjectionMetadata</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">java</span></span></span><span class="hljs-class">:</span></span><span class=""><span class="hljs-class"><span class="hljs-class">88</span></span></span><span class="hljs-class"><span class="hljs-class">)</span></span><br><span class="hljs-class"><span class="hljs-class"> &nbsp; &nbsp;at org.springframework.beans.factory.</span></span><span class=""><span class="hljs-class"><span class="hljs-class">annotation</span></span></span><span class="hljs-class"><span class="hljs-class">.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AutowiredAnnotationBeanPostProcessor</span></span></span><span class="hljs-class">.postProcessPropertyValues(</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AutowiredAnnotationBeanPostProcessor</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">java</span></span></span><span class="hljs-class">:</span></span><span class=""><span class="hljs-class"><span class="hljs-class">366</span></span></span><span class="hljs-class"><span class="hljs-class">)</span></span><br><span class="hljs-class"><span class="hljs-class"> &nbsp; &nbsp;at org.springframework.beans.factory.support.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AbstractAutowireCapableBeanFactory</span></span></span><span class="hljs-class">.populateBean(</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AbstractAutowireCapableBeanFactory</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">java</span></span></span><span class="hljs-class">:</span></span><span class=""><span class="hljs-class"><span class="hljs-class">1268</span></span></span><span class="hljs-class"><span class="hljs-class">)</span></span><br><span class="hljs-class"><span class="hljs-class"> &nbsp; &nbsp;at org.springframework.beans.factory.support.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AbstractAutowireCapableBeanFactory</span></span></span><span class="hljs-class">.doCreateBean(</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AbstractAutowireCapableBeanFactory</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">java</span></span></span><span class="hljs-class">:</span></span><span class=""><span class="hljs-class"><span class="hljs-class">553</span></span></span><span class="hljs-class"><span class="hljs-class">)</span></span><br><span class="hljs-class"><span class="hljs-class"> &nbsp; &nbsp;at org.springframework.beans.factory.support.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AbstractAutowireCapableBeanFactory</span></span></span><span class="hljs-class">.createBean(</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AbstractAutowireCapableBeanFactory</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">java</span></span></span><span class="hljs-class">:</span></span><span class=""><span class="hljs-class"><span class="hljs-class">483</span></span></span><span class="hljs-class"><span class="hljs-class">)</span></span><br><span class="hljs-class"><span class="hljs-class"> &nbsp; &nbsp;at org.springframework.beans.factory.support.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AbstractBeanFactory</span></span></span><span class="hljs-class">$</span></span><span class=""><span class="hljs-class"><span class="hljs-class">1.</span></span></span><span class="hljs-class"><span class="hljs-class">getObject(</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AbstractBeanFactory</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">java</span></span></span><span class="hljs-class">:</span></span><span class=""><span class="hljs-class"><span class="hljs-class">312</span></span></span><span class="hljs-class"><span class="hljs-class">)</span></span><br><span class="hljs-class"><span class="hljs-class"> &nbsp; &nbsp;at org.springframework.beans.factory.support.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">DefaultSingletonBeanRegistry</span></span></span><span class="hljs-class">.getSingleton(</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">DefaultSingletonBeanRegistry</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">java</span></span></span><span class="hljs-class">:</span></span><span class=""><span class="hljs-class"><span class="hljs-class">230</span></span></span><span class="hljs-class"><span class="hljs-class">)</span></span><br><span class="hljs-class"><span class="hljs-class"> &nbsp; &nbsp;at org.springframework.beans.factory.support.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AbstractBeanFactory</span></span></span><span class="hljs-class">.doGetBean(</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AbstractBeanFactory</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">java</span></span></span><span class="hljs-class">:</span></span><span class=""><span class="hljs-class"><span class="hljs-class">308</span></span></span><span class="hljs-class"><span class="hljs-class">)</span></span><br><span class="hljs-class"><span class="hljs-class"> &nbsp; &nbsp;at org.springframework.beans.factory.support.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AbstractBeanFactory</span></span></span><span class="hljs-class">.getBean(</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AbstractBeanFactory</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">java</span></span></span><span class="hljs-class">:</span></span><span class=""><span class="hljs-class"><span class="hljs-class">197</span></span></span><span class="hljs-class"><span class="hljs-class">)</span></span><br><span class="hljs-class"><span class="hljs-class"> &nbsp; &nbsp;at org.springframework.beans.factory.support.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">DefaultListableBeanFactory</span></span></span><span class="hljs-class">.preInstantiateSingletons(</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">DefaultListableBeanFactory</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">java</span></span></span><span class="hljs-class">:</span></span><span class=""><span class="hljs-class"><span class="hljs-class">761</span></span></span><span class="hljs-class"><span class="hljs-class">)</span></span><br><span class="hljs-class"><span class="hljs-class"> &nbsp; &nbsp;at org.springframework.context.support.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AbstractApplicationContext</span></span></span><span class="hljs-class">.finishBeanFactoryInitialization(</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AbstractApplicationContext</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">java</span></span></span><span class="hljs-class">:</span></span><span class=""><span class="hljs-class"><span class="hljs-class">867</span></span></span><span class="hljs-class"><span class="hljs-class">)</span></span><br><span class="hljs-class"><span class="hljs-class"> &nbsp; &nbsp;at org.springframework.context.support.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AbstractApplicationContext</span></span></span><span class="hljs-class">.refresh(</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AbstractApplicationContext</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">java</span></span></span><span class="hljs-class">:</span></span><span class=""><span class="hljs-class"><span class="hljs-class">543</span></span></span><span class="hljs-class"><span class="hljs-class">)</span></span><br><span class="hljs-class"><span class="hljs-class"> &nbsp; &nbsp;at org.springframework.context.</span></span><span class=""><span class="hljs-class"><span class="hljs-class">annotation</span></span></span><span class="hljs-class"><span class="hljs-class">.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AnnotationConfigApplicationContext</span></span></span><span class="hljs-class">.&lt;init&gt;(</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">AnnotationConfigApplicationContext</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">java</span></span></span><span class="hljs-class">:</span></span><span class=""><span class="hljs-class"><span class="hljs-class">84</span></span></span><span class="hljs-class"><span class="hljs-class">)</span></span><br><span class="hljs-class"><span class="hljs-class"> &nbsp; &nbsp;at com.zhang.</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">ApplicationTest</span></span></span><span class="hljs-class">.main(</span><span class="hljs-type"><span class="hljs-class"><span class="hljs-type">ApplicationTest</span></span></span><span class="hljs-class">.</span><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">java</span></span></span><span class="hljs-class">:</span></span><span class=""><span class="hljs-class"><span class="hljs-class">31</span></span></span><span class="hljs-class"><span class="hljs-class">)</span></span><br></code></pre></section><p>其实很简单这个时候我们只需要在<strong>@Autowired注解</strong>中加上如下属性:</p><section><pre><code class="hljs css">@<span class=""><span class="hljs-keyword"><span class="hljs-keyword">Autowired</span></span></span>(<span class=""><span class="hljs-keyword"><span class="hljs-keyword">required</span></span></span>=<span class=""><span class="hljs-keyword"><span class="hljs-keyword">false</span></span></span>)<br><span class="hljs-keyword"><span class="hljs-keyword">private</span></span> UserDao userDao;<br></code></pre></section><p>再次运行测试类你会发现错误已经消失只是这个时候userDao是null如下:</p><section><pre><code class="hljs javascript">实例bean为 === UserService [userDao=<span class=""><span class="hljs-literal"><span class="hljs-literal">null</span></span></span>]<br></code></pre></section><p>把UserDao代码修改为如下:</p><section><pre><code class="hljs cmake"><span class="">import</span> org.springframework.stereotype.Repository;<br><span class="">@Repository</span><br><span class="">public</span> <span class=""><span class="">class</span> <span class="">UserDao</span> </span>{<br> &nbsp; &nbsp;<span class="">// 给一个默认值</span><br> &nbsp; &nbsp;<span class="">private</span> Integer version = <span class=""><span class="hljs-number"><span class="hljs-number">0</span></span></span>;<br> &nbsp; &nbsp;<span class="">/**<br> &nbsp; &nbsp; * 增加tostring方便测试<br> &nbsp; &nbsp; */</span><br> &nbsp; &nbsp;<span class="">@Override</span><br> &nbsp; &nbsp;<span class=""><span class="">public</span> <span class="hljs-keyword"><span class="hljs-keyword">String</span></span> <span class="">toString</span><span class="">()</span> </span>{<br> &nbsp; &nbsp; &nbsp; &nbsp;<span class=""><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span> <span class=""><span class="hljs-string"><span class="hljs-string">"UserDao [version="</span></span></span> + version + <span class=""><span class="hljs-string"><span class="hljs-string">"]"</span></span></span>;<br> &nbsp; &nbsp;}<br> &nbsp; &nbsp;<span class="">/**<br> &nbsp; &nbsp; * <span class="">@<span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span> the version<br> &nbsp; &nbsp; */</span><br> &nbsp; &nbsp;<span class=""><span class="">public</span> Integer <span class="">getVersion</span><span class="">()</span> </span>{<br> &nbsp; &nbsp; &nbsp; &nbsp;<span class=""><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span> version;<br> &nbsp; &nbsp;}<br> &nbsp; &nbsp;<span class="">/**<br> &nbsp; &nbsp; * <span class="">@param</span> version the version to <span class="hljs-keyword"><span class="hljs-keyword">set</span></span><br> &nbsp; &nbsp; */</span><br> &nbsp; &nbsp;<span class=""><span class="">public</span> <span class="">void</span> <span class="">setVersion</span><span class="">(Integer version)</span> </span>{<br> &nbsp; &nbsp; &nbsp; &nbsp;<span class="">this</span>.version = version;<br> &nbsp; &nbsp;}<br>}<br></code></pre></section><p>同时在配置类中增加一个@Bean的UserDao配置如下:</p><section><pre><code class="hljs java"><span class="hljs-meta"><span class="hljs-meta">@Bean</span></span>(<span class="">value</span> = <span class=""><span class="hljs-string"><span class="hljs-string">"userDao2"</span></span></span>)<br><span class=""><span class=""><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public</span></span></span></span></span><span class="hljs-function"><span class="hljs-function"> UserDao </span></span><span class=""><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">getUserDao</span></span></span></span></span><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">(</span></span></span></span><span class=""></span><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">)</span></span></span></span></span>{<br> &nbsp; &nbsp; &nbsp; &nbsp;UserDao userDao = <span class=""><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span> UserDao();<br> &nbsp; &nbsp; &nbsp; &nbsp;userDao.setVersion(<span class=""><span class="hljs-number"><span class="hljs-number">2</span></span></span>);<br> &nbsp; &nbsp; &nbsp; &nbsp;<span class=""><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span> <span class=""></span>userDao;<br>}<br></code></pre></section><p>运行测试类结果如下:</p><section><pre><code class="hljs diff">实例bean为 <span class=""><span class="hljs-comment"><span class="hljs-comment">=== UserService [userDao=UserDao [version=0]]</span></span></span><br></code></pre></section><p>我们可以发现这个时候用的是默认的扫描到的UserDao,这个时候我们把UserService中注入的UserDao改成如下:</p><section><pre><code class="hljs css">@<span class=""><span class="hljs-keyword"><span class="hljs-keyword">Autowired</span></span></span>(<span class=""><span class="hljs-keyword"><span class="hljs-keyword">required</span></span></span>=<span class=""><span class="hljs-keyword"><span class="hljs-keyword">false</span></span></span>)<br><span class="hljs-keyword"><span class="hljs-keyword">private</span></span> UserDao userDao2;<br></code></pre></section><p>继续运行测试类结果如下:</p><section><pre><code class="hljs diff">实例bean为 <span class=""><span class="hljs-comment"><span class="hljs-comment">=== UserService [userDao=UserDao [version=2]]</span></span></span><br></code></pre></section><section><pre><code class="hljs less"><span class=""><span class="hljs-variable"><span class="hljs-variable">@Qualifier</span></span>(value=<span class=""><span class="hljs-string"><span class="hljs-string">"userDao"</span></span></span>)</span><br><span class=""><span class="hljs-variable"><span class="hljs-variable">@Autowired</span></span>(required=false)</span><br><span class="">private</span> UserDao userDao2;<br></code></pre></section><p>这个时候不管你UserDao定义什么名字永远只会注入userDao这个bean了</p><section><pre><code class="hljs java"><span class=""><span class="hljs-meta"><span class="hljs-meta">@Primary</span></span></span><br><span class=""><span class="hljs-meta"><span class="hljs-meta">@Bean</span></span></span>(value = <span class=""><span class="hljs-string"><span class="hljs-string">"userDao2"</span></span></span>)<br><span class=""><span class=""><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public</span></span></span></span></span><span class="hljs-function"><span class="hljs-function"> UserDao </span></span><span class=""><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">getUserDao</span></span></span></span></span><span class=""><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">()</span></span></span></span></span></span>{<br> &nbsp; &nbsp; &nbsp; &nbsp;UserDao userDao = <span class=""><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span> UserDao();<br> &nbsp; &nbsp; &nbsp; &nbsp;userDao.setVersion(<span class=""><span class="hljs-number"><span class="hljs-number">2</span></span></span>);<br> &nbsp; &nbsp; &nbsp; &nbsp;<span class=""><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span> userDao;<br>}<br></code></pre></section><p>这个时候运行测试类你会发现UserService注入的就是userDao2了</p><p> </p></div>
<div> </div>
</div>
<!-- 标签 -->
<div class="cat-box">
<div class="cat-wrap clearfix"> </div>
</div>
<!-- 推荐 --> </div>

原文地址:http://www.imooc.com/article/252878

    </div>

三分钟学会@Autowired@Qualifier@Primary注解的更多相关文章

  1. 三分钟学会使用Derby数据库

    Derby数据库是一个纯用Java实现的内存数据库,属于Apache的一个开源项目.由于是用Java实现的,所以可以在任何平台上运行:另外一个特点是体积小,免安装,java1.6开始集成了derby数 ...

  2. 20、自动装配-@Autowired&@Qualifier&@Primary

    20.自动装配-@Autowired&@Qualifier&@Primary 自动装配:Spring 利用依赖注入(DI),完成对IOC容器中各个依赖关系赋值 20.1 @Autowi ...

  3. [转]三分钟学会.NET Core Jwt 策略授权认证

    [转]三分钟学会.NET Core Jwt 策略授权认证 一.前言# 大家好我又回来了,前几天讲过一个关于Jwt的身份验证最简单的案例,但是功能还是不够强大,不适用于真正的项目,是的,在真正面对复杂而 ...

  4. 【Spring注解驱动开发】使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?

    写在前面 [Spring专题]停更一个多月,期间在更新其他专题的内容,不少小伙伴纷纷留言说:冰河,你[Spring专题]是不是停更了啊!其实并没有停更,只是中途有很多小伙伴留言说急需学习一些知识技能, ...

  5. Spring @Resource,@Autowired,@Qualifier的注解注入和区别

    spring2.5提供了基于注解(Annotation-based)的配置,我们可以通过注解的方式来完成注入依赖.在Java代码中可以使用 @Resource或者@Autowired注解方式来经行注入 ...

  6. 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问

    中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...

  7. 三分钟学会用SpringMVC搭建最小系统(超详细)_转载

    前言 做 Java Web 开发的你,一定听说过SpringMVC的大名,作为现在运用最广泛的Java框架,它到目前为止依然保持着强大的活力和广泛的用户群. 本文介绍如何用eclipse一步一步搭建S ...

  8. [计划任务 - Linux]三分钟学会cron

    cron——计划任务,是任务在约定的时间执行已经计划好的工作,是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业. 也就是说cron只适合于linux系统,用windows电脑的同学 ...

  9. 三分钟学会funsioncharts

    由于项目需求需要做一个报表,选择FusionCharts作为工具使用.由于以前没有接触过报表,网上也没有比较详细的fusionCharts教程,所以决定好好研究FusionCharts,同时做一个比较 ...

随机推荐

  1. HR招聘_(九)_招聘方法论(面试环节·薪资谈判和心理把控)

    .薪资谈判 薪资谈判在整个过程中非常重要,如果这一环出现问题前期的所有付出都功亏一篑,无法达成招聘目标. 谈判过程中需要遵循以下原则: 明确 通过面试后需要再次确认候选人的目前薪资和期望,虽然第一次电 ...

  2. 2-1 Numpy-数组

    (1) 数组的创建 # !usr/bin/env python # Author:@vilicute import numpy as np # 1.用array创建数组并查看数组的属性 arr1 = ...

  3. Node.js模拟发起http请求从异步转同步的5种方法

    使用Node.js模拟发起http请求很常用的,但是由于Node模块(原生和第三方库)提供里面的方法都是异步,对于很多场景下应用很麻烦,不如同步来的方便.下面总结了几个常见的库API从异步转同步的几种 ...

  4. 会话技术之Session(购物车加入、查看和清空)

    会话技术之Session session:服务器端会话技术 当我们第一次访问的服务器的时候,服务器获取id, 能获取id 要拿着这个id去服务器中查找有无此session 若查找到了:直接拿过来将数据 ...

  5. 多云混合云之多集群统一管理:基于阿里云ACK统一纳管多个不同Kubernetes集群

    目前阿里云云原生产品家族已经支持多集群管理功能,允许使用阿里云容器服务Kubernetes(简称ACK)控制台或kubectl命令接入.统一纳管其他公有云.客户IDC自建K8s集群,集中管理部署K8s ...

  6. 《2019上半年DDoS攻击态势报告》发布:应用层攻击形势依然严峻,海量移动设备成新一代肉鸡

    2019年上半年,阿里云安全团队平均每天帮助用户防御2500余次DDoS攻击,与2018年持平.目前阿里云承载着中国40%网站流量,为全球上百万客户提供基础安全防御.可以说,阿里云上的DDoS攻防态势 ...

  7. 【JZOJ4964】【GDKOI2017模拟1.21】Rhyme

    hafy 由于多次交换邮票没有满足所有人的需求,小Z被赶出了集邮部.无处可去的小Z决定加入音乐部,为了让音乐部的人注意到自己的才华,小Z想写一首曲子.为了让自己的曲子更好听,小Z找到了一些好听曲子作为 ...

  8. 通过IP地址訪问Jbossserver上的应用

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/liu765023051/article/details/28882533 环境介绍 Web项目中.在 ...

  9. Mysql数据库日志类型查询与配置详解

    在mysql中日志分为很多种,下面小编来给大家介绍Mysql数据库日志类型查询与使用,希望对各位同学会有所帮助 mysql常见的日志类型有五种:错误日志.二进制日志.查询日志.慢查日志和中继日志. 一 ...

  10. 洛谷 P1447 [NOI2010]能量采集 (莫比乌斯反演)

    题意:问题可以转化成求$\sum_{i=1}^{n}\sum_{j=1}^{m}(2*gcd(i,j)-1)$ 将2和-1提出来可以得到:$2*\sum_{i=1}^{n}\sum_{j=1}^{m} ...