@Component和@Bean以及@Autowired、@Resource


1. 有這么一個故事,從xml配置文件的bean說起

  Spring用xml配置文件的時候(不知道閱讀這篇文章的你用沒用過,我用過一段時間,那是黑暗傷痛的回憶QQQ),一個xml配置文件里面有很多個bean。類似這樣:

<bean id="helloWorld" class="com.test.spring.beans.HelloWorld"> <property name="name" value="Spring"></property> </bean> 

  每個bean都對應着一個class,可能是controller,可能是service,可能是dao,xml配置文件就是告訴Spring,我這里有哪些bean,他們都叫啥名字(例如helloworld),他們的class文件在哪(com.test.spring.beans.HelloWorld),他們都有哪些屬性。這樣,當項目啟動時,Spring就回去管理這些類了。

2. 進入@Configuration時代

  你現在使用@Service@Repository@Component這些注解放在java的類上用來告訴Spring:“我標注的這些類請你來管理”。在以前就是要在xml配置文件里寫上面這樣的bean,有一個類寫一個bean(實在是太麻煩了。。。。。,不方便碼代碼,不方便閱讀,不方便修改),一個xml配置文件寫好多bean。
總結一下:

  • @Configuration注解就相當於xml配置文件,告訴Spring我這里有好多bean要交給你管理
  • @Bean注解就相當於xml配置文件里面的bean,告訴Spring這個被注解的類就交給你管理了
    到這里,Spring發展史中注解替換xml配置文件的故事就講完了,是不是很簡單!

=========十萬個為什么的分割線===============
那,既然問題都解決了,有@Component啥事???
年輕人,sometimes naive

3. @Component粉墨登場

  無名子曰過,偷懶是人類創造力的源泉。我都把class類寫好了,還要再寫個@Configuration注解的class去告訴Spring(除了通知Spring,這個class不產生其他價值),雖然這個class相比於xml配置文件寫起來方便又好閱讀,但是,這個時候總有但是,我為啥不直接就告訴Spring呢???
  @Controller@Service@Repository都是@Component的更具體一點的實現(這里如果說錯了,求大佬輕噴)。寫完class加上這些注解,其實就是加上@Component注解,Spring就懂了,奧奧,你小子太懶了,這么多類全部是讓我來管理的,不過話說回來誰讓我是你baba呢!
  是不是這就完事了呢,是的,沒有但是,真的就完事了。

4. “但是”又回來了

  是的,這里又有但是了。可能有人想到了,既然@Component跟Spring已經把問題解決了,那,@Bean這個注解為啥還沒退休啊,還在這站着地兒,咋不見新版Spring給加個@Deprecated???
  年輕人,有想法!!!
  假設這么一種情況,有幾個class,我自己也不是不能寫,但是寫了周末就沒時間去外灘閑逛了,就在這個時候,我發現alimama的老鐵們已經寫好了同樣功能的class,我在maven里import一下就完了,開心三秒,又有問題了,他們寫的時候沒用Spring:

  • 1)打好的jar包,我不能在class上面加@Component注解;
  • 2)我沒有他們的源碼,也不能把他們的代碼復制過來,假裝自己重寫了一遍QQQ

這時候@Bean的作用就體現出來了,請看:

@Configuration public class MyClass { // class1和class2就是jar包里寫好的 @Bean public Class1 getClass1() { return new Class1(); } @Bean public Class2 getClass1() { return new Class2(); } ..... } 

  雖然又回到了@Component出場之前的@Configuration時代。但是你也不需要經常使用這個對吧

4. 讓我們以一點小干貨結束今天的故事

  Spring管理的Bean我們需要通過@Autowired或者@Resource導入來使用,這兩的區別啥的你可以自己去搜索一下,這里只說一個問題。@Autowired是按照類型裝配的,@Resource是按照名稱裝配的,加入同一類型有多個bean,只是名字不一樣,@Autowired直接導入會報錯。這時候課題通過@Resource(name="name")或者@Autowired@Qualifier("name")來按名稱裝配,解決問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM