@Component、@Configuration和@Bean以及@Autowired、@Resource——Spring配置bean的不同方案

前言

Spring配置bean的三种方案:

  • 在XML中显式配置;
  • 在Java代码中显式配置;
  • 隐式的bean发现机制和自动装配。

        ——《Spring In Action》
下文主要围绕这三点讲一段轻松的故事,如果非常了解,可以不看了。

1. 有这么一个故事,从xml配置文件说起

  Spring用xml配置文件的时候(不知道阅读这篇文章的你用没用过,我用过一段时间,写起来读起来巨难受),一个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和@Bean。
总结一下:

  • @Configuration注解就相当于xml配置文件,告诉Spring我这里有好多bean要交给你管理
  • @Bean注解就相当于xml配置文件里面的bean,告诉Spring这个被注解的类就交给你管理了
    到这里,Spring发展史中注解取代xml配置文件的故事就讲完了,是不是很简单!

=========十万个为什么的分割线===============
那,既然问题都解决了,有@Component和其他XXX啥事???
年轻人,sometimes naive

3. @Component粉墨登场

  无名子曰过,偷懒是人类创造力的源泉。我都把Java类写好了,还要再专门创建一个类,上面加上@Configuration注解去告诉Spring(除了通知Spring,这个class不产生其他价值)有bean需要管理了,虽然这个Java文件相比于xml配置文件写起来方便又好阅读,但是,这个时候总有但是,我为啥在不直接就告诉Spring而是非要通过额外的这个配置呢???
  @Controller@Service@Repository都是@Component的更具体一点的实现(这里如果说错了,求轻喷)。写完java类加上这些注解,其实就是加上@Component注解,Spring就懂了。这就是上面说的第三种方式,隐式的bean发现机制和自动装配
  Spring内心OS:奥奥,你小子太懒了,这么多类全部是让我来管理的,还要我自己去找,自己去看,不过话说回来谁让我是你baba呢!
  是不是这就完事了呢,是的,没有但是,真的就完事了。

4. 因为历史遗留问题,“但是”他又回来了

  是的,这里又有但是了。可能有人想到了,既然@Component跟Spring已经把问题解决了,那,@Bean@Configuration这些注解为啥没退休啊,还在这站着地儿,咋不见新版Spring给加个@Deprecated???
  年轻人,有想法!!!
  假设这么一种情况,有几个java类,我自己也不是不能写,但是写了周末就没时间去外滩闲逛了,就在这个时候,我发现alimama的老铁们已经写好了同样功能的java类,我在maven里import一下就完了,开心三秒,又有问题了,他们写的时候没用Spring:

  • 1)打好的jar包,我不能在java类上面加@Component注解;
  • 2)我没有他们的源码,也不能把他们的代码复制过来,假装自己重写了一遍。

这时候@Bean的作用就体现出来了,请看(上述第二种方式):

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

  虽然又回到了@Component出场之前的@Configuration时代。但是你也不需要经常使用这个对吧 。
  这其实也是一种处理历史代码的手段,你以前写好的打好jar包的java类上不一定都加好了@Component这一系列注解。而且可能源码也不好找,只有jar包。

4. 让我们以一点小干货结束今天的故事

  Spring管理的Bean我们需要通过@Autowired或者@Resource导入来使用,这两的区别啥的你可以自己去搜索一下,这里只简单说一个问题。@Autowired是按照类型装配的,@Resource是按照名称装配的,加入同一类型有多个bean,只是名字不一样,@Autowired直接导入会报错。这时候课题通过@Resource(name="name")或者@Autowired@Qualifier("name")来按名称装配,解决问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 本来是准备看一看Spring源码的。然后在知乎上看到来一个帖子,说有一群**自己连Spring官方文档都没有完全读...
    此鱼不得水阅读 6,926评论 4 21
  • 转 Spring****基于 Annotation 的简单介绍 2011年03月29日 15:07:00 阅读数:...
    fd649cf896c0阅读 344评论 1 0
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan阅读 4,128评论 2 7
  • 本章内容: 声明Bean 构造器注入和Setter方法注入 装配Bean 控制bean的创建和销毁 任何一个成功的...
    谢随安阅读 1,627评论 0 9
  • 25个经典的Spring面试问答 本人收集了一些在大家在面试时被经常问及的关于Spring的主要问题,这些问题有可...
    杀小贼阅读 682评论 0 2