Spring帮助我们管理Bean分为两个部分,

一个是注册Bean,

一个装配Bean。

完成这两个动作有三种方式,

一种是使用自动配置的方式、

一种是使用JavaConfig的方式,

一种就是使用XML配置的方式。

在自动配置的方式中,使用@Component去告诉Spring,我是一个bean,你要来管理我,然后使用@AutoWired注解去装配Bean(所谓装配,就是管理对象直接的协作关系)。

然后在JavaConfig中,@Configuration其实就是告诉spring,spring容器要怎么配置(怎么去注册bean,怎么去处理bean之间的关系(装配))。那么久很好理解了,@Bean的意思就是,我要获取这个bean的时候,你spring要按照这种方式去帮我获取到这个bean。

到了使用xml的方式,也是如此。君不见<bean>标签就是告诉spring怎么获取这个bean,各种<ref>就是手动的配置bean之间的关系。

Bean在Spring和SpringMVC中无所不在,将这个概念内化很重要,下面分享一下我的想法:

一、Bean是啥

1、Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化);

2、凡是有方法或属性的类都需要实例化,这样才能具象化去使用这些方法和属性;

3、规律:凡是子类及带有方法或属性的类都要加上注册Bean到Spring IoC的注解

4、把Bean理解为类的代理或代言人(实际上确实是通过反射、代理来实现的),这样它就能代表类拥有该拥有的东西了

5、我们都在微博上@过某某,对方会优先看到这条信息,并给你反馈,那么在Spring中,你标识一个@符号,那么Spring就会来看看,并且从这里拿到一个Bean或者给出一个Bean

二、注解分为两类:

1、一类是使用Bean,即是把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装;比如@Autowired , @Resource,可以通过byTYPE(@Autowired)、byNAME(@Resource)的方式获取Bean;

2、一类是注册Bean,@Component , @Repository , @ Controller , @Service , @Configration这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中,等你要用的时候,它会和上面的@Autowired , @Resource配合到一起,把对象、属性、方法完美组装。

三、@Bean是啥?

1、原理是什么?先看下源码中的部分内容:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Indicates that a method produces a bean to be managed by the Spring container.

 <h3>Overview</h3>

 <p>The names and semantics of the attributes to this annotation are intentionally

 similar to those of the {@code <bean/>} element in the Spring XML schema. For

 example:

 <pre class="code">

     @Bean

     public MyBean myBean() {

         // instantiate and configure MyBean obj

         return obj;

    }</pre>

  意思是@Bean明确地指示了一种方法,什么方法呢——产生一个bean的方法,并且交给Spring容器管理;从这我们就明白了为啥@Bean是放在方法的注释上了,因为它很明确地告诉被注释的方法,你给我产生一个Bean,然后交给Spring容器,剩下的你就别管了

2、记住,@Bean就放在方法上,就是产生一个Bean,那你是不是又糊涂了,因为已经在你定义的类上加了@Configration等注册Bean的注解了,为啥还要用@Bean呢?这个我也不知道,下面我给个例子,一起探讨一下吧:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

package com.edu.fruit;

  //定义一个接口

    public interface Fruit<T>{

        //没有方法

}

/*

*定义两个子类

*/

package com.edu.fruit;

     @Configuration

     public class Apple implements Fruit<Integer>{//将Apple类约束为Integer类型

}

package com.edu.fruit;

     @Configuration

     public class GinSeng implements Fruit<String>{//将GinSeng 类约束为String类型

}

/*

*业务逻辑类

*/

package com.edu.service;

       @Configuration

       public class FruitService {

          @Autowired

          private Apple apple;

          @Autowired

          private GinSeng ginseng;

    //定义一个产生Bean的方法

       @Bean(name="getApple")

       public Fruit<?> getApple(){

       System.out.println(apple.getClass().getName().hashCode);

         System.out.println(ginseng.getClass().getName().hashCode);

       return new Apple();

}

}

/*

*测试类

*/

@RunWith(BlockJUnit4ClassRunner.class)

public class Config {

    public Config(){

        super("classpath:spring-fruit.xml");

    }

    @Test

    public void test(){

        super.getBean("getApple");//这个Bean从哪来,从上面的@Bean下面的方法中来,返回

                                                          的是一个Apple类实例对象

        

    }

}

从上面的例子也印证了我上面的总结的内容:

1、凡是子类及带属性、方法的类都注册Bean到Spring中,交给它管理;

2、@Bean 用在方法上,告诉Spring容器,你可以从下面这个方法中拿到一个Bean

Bean在Spring和SpringMVC中无所不在相关推荐

  1. cdi 2.7.5_集成测试CDI 1.0和Spring 3.1中的作用域bean

    cdi 2.7.5 在这篇博客文章中,我描述了如何在Spring和CDI中使用作用域bean进行集成测试. 一切都用小代码示例进行说明. 使用范围进行集成测试并不是特别容易. 想象一下存在于会话范围内 ...

  2. 集成测试CDI 1.0和Spring 3.1中的作用域bean

    在这篇博客文章中,我描述了如何在Spring和CDI中使用作用域bean进行集成测试. 一切都用小代码示例进行说明. 使用范围进行集成测试并不是特别容易. 想象一下存在于会话范围内的bean,例如Us ...

  3. [转]spring入门(六)【springMVC中各数据源配置】

    在使用spring进行javaWeb开发的过程中,需要和数据库进行数据交换,为此要经常获取数据库连接,使用JDBC的方式获取数据库连接,使用完毕之后再释放连接,这种过程对系统资源的消耗无疑是很大的,这 ...

  4. Spring和SpringMVC父子容器关系初窥

    一.背景 最近由于项目的包扫描出现了问题,在解决问题的过程中,偶然发现了Spring和SpringMVC是有父子容器关系的,而且正是因为这个才往往会出现包扫描的问题,我们在此来分析和理解Spring和 ...

  5. spring和springMVC配置文件中的扫描包如何配置

    我的项目大概文件路径: 然后进入主题: spring的配置文件名称为applicationContext.xml springMVC的配置文件名称为dispatcherServlet-servlet. ...

  6. 头条一面:Spring IOC容器中只存放单例Bean吗?

    最近,很多小伙伴出去面试,感觉自己面的不是很理想,回来后,不少小伙伴把面试题做了记录发给我,让我给大家解析下,然后发出来.当我看到这些面试题时,快速在脑海中构建起了整个知识体系,从基础到框架.从分布式 ...

  7. Spring的工具类,方便在非spring管理环境中获取bean

    场景 在SpringBoot的后台项目中,如果想要引入并且调用某个bean,可以直接通过注解的方式. 比如在单元测试中引入某业务的Controller @RunWith(SpringJUnit4Cla ...

  8. Bean 在 Spring 中代表什么含义,为什么这样命名?

    Bean 在 Spring 中代表什么含义,为什么这样命名?   Bean 是 Spring 框架中的一个很基础的概念,而单词 bean 在英语中是"豆子"的意思.从 Bean 在 ...

  9. Spring基础——在 Spring Config 文件中基于 XML 的 Bean 的自动装配

    一.Spring IOC 容器支持自动装配 Bean,所谓自动装配是指,不需要通过 <property> 或 <constructor-arg> 为 Bean 的属性注入值的过 ...

  10. Spring在多线程中bean的注入问题

    Spring 在多线程中,bean的注入问题 使用SSM框架,在Service层需要另开一个线程,在线程中使用@Resource或者@Autowired注入全部为NULL, @Component pu ...

最新文章

  1. Git简介以及与SVN的区别
  2. 机器“血液”登上Nature:一条假鱼靠它续航36小时,无需固态电池
  3. 用户请求接口信息日志记录
  4. Py之Kivy:Python库之Kivy的简介、安装、使用方法之详细攻略
  5. 1065 A+B and C (64bit) (20 分)【难度: 简单 / 思维 高精度】
  6. eclipse占用内存过大_MySQL 服务占用cpu 100%,如何排查问题? (MySQL面试第七弹)...
  7. 1070 Bash游戏 V4
  8. 1、Keepalived及VRRP原理介绍
  9. SQL Server高级查询之T-SQL编程(流程控制语句)
  10. 【学习】如何用jQuery获取iframe中的元素
  11. ES_BoolQueryBuilder
  12. qq一注销账号就服务器繁忙,qq熊熊怎样解除服务器繁忙的问题
  13. word文档目录样式如何设置
  14. R语言单因素分析案例
  15. 猴子香蕉问题——枚举
  16. FINAUNCE金融业增速反弹信贷投放创新高叠加股市回暖
  17. 计算机最最最底层的工作原理是怎么运行的
  18. 撤销性CP-ABE方案研究现状总结 - 2021
  19. 京东到家自动化测试平台的探索与实践
  20. Ubuntu、stm32下的C程序各变量的分配地址分析

热门文章

  1. iOS底层探索之KVO(四)—自定义KVO
  2. 【更新】Essential Studio for ASP.NET MVC更新至2018 v4(三)
  3. jenkins 设置 gitlab web hooks
  4. 图形化升级单机oracle 11.2.0.1 到 11.2.0.4
  5. Vue.js-----轻量高效的MVVM框架(五、计算属性)
  6. debian8 qemu中KVM对rbd的支持
  7. 总结几种简单实用的数据恢复技巧
  8. 「leetcode」450. 删除二叉搜索树中的节点:【递归】【迭代】详解
  9. hdu Train Problem I 栈的基本应用
  10. 苹果mac Dock窗口预览工具:DockView