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

一、Bean是啥

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

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

3、规律:凡是子类及带有方法或属性的类都要加上注册Bean到Spring IoC的注解;(@Component , @Repository , @ Controller , @Service , @Configration

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

3

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

12.Spring Bean是什么相关推荐

  1. [Spring实战系列](12)Bean的自动装配

    Spring提供了4种各具特色的自动装配策略: 类型 说明 no 默认方式,Bean的引用必须通过XML文件中的</ref>元素或者ref属性手动设定. byName 把与Bean的属性具 ...

  2. spring学习12 -Spring 框架模块以及面试常见问题注解等

    以下为spring常见面试问题: 1.Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式-在AOP和remoting中被用的比较 ...

  3. Spring Bean 中的线程安全

    在 使用Spring框架时,很多时候不知道或者忽视了多线程的问题.因为写程序时,或做单元测试时,很难有机会碰到多线程的问题,因为没有那么容易模拟多线 程测试的环境.但如果不去考虑潜在的漏洞,它就会变成 ...

  4. 【一步一步学习spring】spring bean管理(上)

    1. spring 工厂类 我们前边的demo中用到的spring 工厂类是ClassPathXmlApplicationContext,从上图可以看到他还有一个兄弟类FileSystemApplic ...

  5. Spring5源码 - 07 Spring Bean 生命周期流程 源码解读02

    文章目录 Pre 通俗流程 finishBeanFactoryInitialization Pre Spring5源码 - 06 Spring Bean 生命周期流程 概述 01 接上文 通俗流程 下 ...

  6. Spring8:一些常用的Spring Bean扩展接口

    前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...

  7. 带你读懂Spring Bean 的生命周期,嘿,就是玩儿~

    带你读懂Spring Bean 的生命周期,嘿,就是玩儿~ 一.前言 今天我们来说一说 Spring Bean 的生命周期,小伙伴们应该在面试中经常遇到,这是正常现象.因为 Spring Bean 的 ...

  8. coherence安装_在Oracle Coherence中分发Spring Bean

    coherence安装 本文展示了如何通过使用Oracle Coherence中的EntryProcessor和可移植对象格式(POF)功能来分发Spring Bean. Coherence通过Ent ...

  9. 如何在没有Springockito的情况下模拟Spring bean

    我在Spring工作了几年. 但是我总是对XML配置变得多么混乱感到沮丧. 随着各种注释和Java配置可能性的出现,我开始喜欢使用Spring进行编程. 这就是为什么我强烈使用Java配置的原因. 我 ...

最新文章

  1. 使用R语言对照片人物进行情绪分析
  2. git 恢复误删的分支
  3. idea验证失败_SVN提示https证书验证失败解决办法
  4. vue 添加完数据后刷新页面_vue form 表单提交后刷新页面的方法
  5. bootcss echarts_数据可视化插件使用(Echarts)
  6. .net core 中通过 PostConfigure 验证 Options 参数
  7. MapReduce改造fp-growth算法
  8. 2021年图灵奖公布!72岁的美国科学家 Jack Dongarra 获奖
  9. 对于访问IIS元数据库失败的解决
  10. 打过工、留过洋、创过业,一位中年IT老兵的反思
  11. 利用sender的Parent获取GridView中的当前行
  12. ROS安装教程(ubuntu16.04安装ROS Kinetic)
  13. 2021年终总结——脚踏实地,为下一次腾飞积蓄力量
  14. 消费者生产者问题,哲学家问题
  15. Java项目前后端文件简体转换繁体
  16. 蒙牛发言人香港发言措辞欠妥
  17. 台式机dp接口_了解笔记本电脑的各种视频接口
  18. 【杂谈】关于个人档案的机要邮寄
  19. Java中的同步方法
  20. lightroom安卓_如何将Lightroom从PC预设导入手机(安卓amp;iOS)

热门文章

  1. Matlab练习1:正方形的对称性群的乘法表
  2. yum报错: You could try using --skip-broken to work around the problem
  3. NetSuite Excel Export
  4. python照片转素描_python实现图片转素描效果代码
  5. 华为2018勇敢星实习软件类笔试(java)
  6. 在aspx.cs文件无法引用的aspx文件中的某个控件
  7. java理发店会员预约管理系统springboot+vue
  8. VUE Window 环境配置
  9. english questions
  10. 使用笔记本连接显示提示:输入信号超出有效范围,将设置改为1680*1050-60hz