@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 102.Binary Tree Level Order Traversal 二叉树的层次遍历
基础为用队列实现二叉树的层序遍历,本题变体是分别存储某一层的元素,那么只要知道,每一层的元素都是上一层的子元素,那么只要在while循环里面加个for循环,将当前队列的值(即本层元素)全部访问后再执行 ...
- MAVEN打包时跳过Junit测试
我们知道,通常情况下使用maven package命令打包时,会自动执行test包下的各个单元测试. 这是因为spring-boot-maven-plugin插件已经集成了maven-surefire ...
- 【Java安全】关于Java中常用加密/解密方法的实现
安全问题已经成为一个越来越重要的问题,在Java中如何对重要数据进行加密解密是本文的主要内容. 一.常用的加密/解密算法 1.Base64 严格来说Base64并不是一种加密/解密算法,而是一种编码方 ...
- linux 查看汉字编码方式
hexdump -C b.bcp 09 为\t 0a 为\n 一个汉字占三位为utf-8 占两位的不对
- 惠普IPMI登陆不上
[问题描述] IPMI登陆不上(HP),点击无反应. 浏览器使用IE,java版本使用32位1.7版本. [问题原因] 保护此网站的证书使用弱加密,即 SHA1.此网站应该在 SHA1 被禁用之前将该 ...
- 第十三周学习总结 Java的异常
java的核心思想 面向对象的编程思想 类和类的关系 类中成员的描述 对象创建 Java工具类 包装类 数学相关 日期相关 字符串相关 集合相关的类 考试机 学生 老师 --------------- ...
- Java内存结构详解
Java内存结构详解 Java把内存分成:栈内存,堆内存,方法区,本地方法区和寄存器等. 下面分别介绍栈内存,堆内存,方法区各自一些特性: 1.栈内存 (1)一些基本类型的变量和对象的引用变量都是在函 ...
- Lucky Boy
Lucky Boy Problem Description Recently, Lur have a good luck. He is also the cleverest boy in his sc ...
- linux中断处理上下部分
一.linux中断处理为什么要分为上下部 1.1. 中断处理的上半部(top half,又叫顶半部)和处理的下半部(bottom half,又叫底半部) 1.1. linux中断处理不参与调度,故中断 ...
- Luogu P4040 [AHOI2014/JSOI2014]宅男计划
题目 显然存活天数与叫外卖次数的函数是凸函数. 所以三分买外卖的次数. 然后把食品按保质期升序排序. 并且单调栈搞一下,把又贵又保质期短的丢掉. 那么随着保质期的增加,食品的价格一定上涨. 所以我们从 ...