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")
來按名稱裝配,解決問題。