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

Spring中Bean的理解以及@Bean的作用相关推荐

  1. Spring中ref local与ref bean区别

    为什么80%的码农都做不了架构师?>>>    Spring中ref local与ref bean区别 今天在做SSH框架Demo实例时,在ApplicationResources. ...

  2. Spring中IOC的理解(通俗易懂版)

    文章目录 1.IOC提出背景 2:IOC的核心概念 3:IOC的实现方式 4:IOC的入门案例 (1):思路分析 (2):代码解析 5:DI入门案例 (1):思路分析 (2):代码解析 6:DI依赖注 ...

  3. Spring中,修改注入的bean名称

    2019独角兽企业重金招聘Python工程师标准>>> 案例: 1).源码 UserService.java public interface UserService {} User ...

  4. Spring中的IOC理解

    相关概念 Spring 通过一个配置文件描述 Bean 及 Bean 之间的依赖关系,利用 Java 语言的反射功能实例化 Bean 并建立 Bean 之间的依赖关系. Spring 的 IoC 容器 ...

  5. 对spring 中IOC 的理解

    IOC 即"控制反转" 不是技术, 是一种思想.使用ioc 意味着将你设计好的对象交给容器来管理,而不是传统的在你的对象内部直接进行管理.而spring通过我们在xml 中的配置和 ...

  6. Spring中WebApplicationInitializer的理解

    现在JavaConfig配置方式在逐步取代xml配置方式.而WebApplicationInitializer可以看做是Web.xml的替代,它是一个接口.通过实现WebApplicationInit ...

  7. java spring源码_spring源码分析-spring中的bean

    接触过spring的人都知道,在spring中我们称java对象为bean,我们在spring的debug日志或者报错日志也能看到各种bean的描述.其实,spring的bean和java的对象之间是 ...

  8. Spring源码分析-如何获取Bean对象

    导语   在上篇博客中 介绍了关于BeanFactory和FactoryBean相关的操作,并且查看了在两个操作中他们具体的代码有那些,这篇博客主要就是顺着上篇博客思路继续来分析Bean对象的获取.下 ...

  9. Spring - BeanDefinitionRegistryPostProcessor 扩展接口 动态注册bean

    文章目录 Pre org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor 接口的继承关系 BeanD ...

最新文章

  1. PHP exec xargs 不执行,关于 ‘--exec’ 参数( find 命令)及介绍 ‘xargs ’命令区别(新版)...
  2. c++STL中的find()函数 有两种使用方法
  3. 用VBA去除Excel工作表保护密码
  4. 苹果cms V10模板 秘趣响应式高端在线影视视频模板
  5. nginx 在ubuntu 上的启动,停止,重启
  6. 西瓜书+实战+吴恩达机器学习(十八)降维(主成分分析 PCA)
  7. 逻辑回归详解及Python实现
  8. Atitit java webservice客户端v2 目录 1.1. 生成stub代码wsimport.exe 1 1.2. Wsimport 2 1.3. clienttest 3 1.1
  9. ajax异步下载文件并判断状态
  10. oracle sqlldr命令6,oracle sqlldr命令
  11. mac下bin格式文件解压
  12. ubuntu和kubuntu换源
  13. 自然辩证法对计算机科学技术的应用,自然辩证法与计算机科学技术
  14. Intel编译器安装WRF-CMAQ
  15. C++中如何获取一个文件夹下带有指定文件后缀名的文件绝对路径
  16. 拜托,面试别再问我 TCC 分布式事务的原理了…
  17. c# winform 解决PictureBox 无法打印全部图片的问题
  18. WuThreat身份安全云-TVD每日漏洞情报-2023-01-31
  19. 死亡搁浅 服务器不稳定,[收集]死亡搁浅现有bug临时解决方案
  20. 两名老人接力营救轻生女子一人溺亡

热门文章

  1. NetSuite Transaction字典
  2. C++传递参数给Python
  3. python照片转素描_python如何将图片转换素描画
  4. Java switch()括号内参数的类型要求
  5. 从Q3财报看百度被低估的内容生态
  6. 【Python爬虫】爬取猫眼电影排行榜并存放至csv文件
  7. SQL数据库收缩日志设置步骤(手动)
  8. 利用Matlab读取Excel数据并进行拟合
  9. 任务二:停电停多久问题关键算法
  10. OpenCV安装教程(全网最细,小白直接上手!!!)