美文网首页
@Component、@Configuration和@Bean以

@Component、@Configuration和@Bean以

作者: 猫尾草 | 来源:发表于2019-04-21 15:55 被阅读0次

    前言

    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")来按名称装配,解决问题。

    相关文章

      网友评论

          本文标题:@Component、@Configuration和@Bean以

          本文链接:https://www.haomeiwen.com/subject/qutugqtx.html