@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")来按名称装配,解决问题。
@Component和@Bean以及@Autowired、@Resource的更多相关文章
- @Autowired & @Resource 区别  & 解读@Bean
		
一样 Autowired & @Resource 都可以用来Bean的注入,可以写在属性(字段)上.也可以写在setter方法上 不一样 1.来源不一样 @Autowired 由Spr ...
 - Spring通过注解@Autowired/@Resource获取bean实例时为什么可以直接获取接口而不是注入的类
		
问: 这个问题困扰了我好久,一直疑问这个接口的bean是怎么注入进去的?因为只看到使用@Service注入了实现类serviceImpl,使用时怎么却获取的接口,而且还能调用到实现类的方法,难道这个接 ...
 - @Autowired @Resource @Qualifier的区别
		
参考博文: http://www.cnblogs.com/happyyang/articles/3553687.html http://blog.csdn.net/revent/article/det ...
 - [转载]Spring下IOC容器和DI(依赖注入) @Bean及@Autowired
		
Spring下IOC容器和DI(依赖注入) @Bean及@Autowired自动装配 bean是什么 bean在spring中可以理解为一个对象.理解这个对象需要换一种角度,即可将spring看做一门 ...
 - @Required @Autowired @Resource注解详解
		
一.@Required注解用于检查特定的属性是否设置 1.RequiredAnnotationBeanPostProcessor 为该注解的处理器,即bean后置处理器,检查所有带有该解的bean属性 ...
 - Spring中@Component与@Bean的区别
		
@Component和@Bean的目的是一样的,都是注册bean到Spring容器中. @Component VS @Bean @Component 和 它的子类型(@Controller, @S ...
 - [转载]@Component 和 @Bean 的区别
		
@Component 和 @Bean 的区别 @Component 和 @Bean 的区别 Spring帮助我们管理Bean分为两个部分,一个是注册Bean,一个装配Bean. 完成这两个动作有三种方 ...
 - component和bean区别
		
@Component and @Bean do two quite different things, and shouldn't be confused. @Component (and @Serv ...
 - Difference between @Bean and @Autowired
		
Demo01 1 @SpringBootApplication 2 public class Application { 3 4 @Autowired 5 BookingService booking ...
 
随机推荐
- leetcode-mid-backtracking -78 Subsets
			
mycode 86.06% class Solution(object): def subsets(self, nums): """ :type nums: List ...
 - GoldenGate—AUTORESTART配置
			
AUTORESTART Valid For Manager Description Use the AUTORESTART parameter to start one or more Extract ...
 - python - 代码调试的好帮手sys._getframe()
			
python 的调试,令人非常忧伤,通过将输出路径打印的方式,可以提高很大的方便性: import sys #coding=utf-8 def get_cur_info(): print sys._g ...
 - Collector解读以及自定义
			
一.Collector接口解读: Collector接口解读: public interface Collector<T, A, R> { Supplier<A> suppli ...
 - robotframework之常用系统关键字
			
常用系统关键字此处做些记录,后续根据实际应用陆续补充 1.变量声明 ${a} Set Variable hello 2.表单嵌套 Select Frame Xpath=//* [@] Unselect ...
 - robot framework UI自动化之登录
			
前面已写环境的搭建,接下来就可以直接进行UI自动化的编写工作了 目录 1.准备工作 2.了解定位 3.一个登录案例 1.准备工作 第一步:需要使用chrome浏览器来测试,因此首先要有一个驱动,下载好 ...
 - windows 的cmd设置代理的问题
			
今天给公司一同事用cmd来安装gulp(npm install -g gulp), 死活安装不上,一直报一大堆的错误:经仔细查阅是代理的问题,故总结如下: 若公司的电脑是通过设置代理来访问外网,则需要 ...
 - /etc/syscofig/network 修改主机名
			
[root@mysql ~]# cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=mysql
 - OracleOraDb11g_home1TNSListener服务无法启动
			
作者:伪墨 来源:CSDN 原文:https://blog.csdn.net/qq997404392/article/details/73296429 今天遇到OracleOraDb11g_home1 ...
 - 防抖和节流  lodash插件
			
lodash.debounce lodash.debounce(function(){ },1000) 函数防抖原理 调用函数时,马上清理定时器.然后再设置一个定时器包含函数