12.Spring Bean是什么
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是什么相关推荐
- [Spring实战系列](12)Bean的自动装配
Spring提供了4种各具特色的自动装配策略: 类型 说明 no 默认方式,Bean的引用必须通过XML文件中的</ref>元素或者ref属性手动设定. byName 把与Bean的属性具 ...
- spring学习12 -Spring 框架模块以及面试常见问题注解等
以下为spring常见面试问题: 1.Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式-在AOP和remoting中被用的比较 ...
- Spring Bean 中的线程安全
在 使用Spring框架时,很多时候不知道或者忽视了多线程的问题.因为写程序时,或做单元测试时,很难有机会碰到多线程的问题,因为没有那么容易模拟多线 程测试的环境.但如果不去考虑潜在的漏洞,它就会变成 ...
- 【一步一步学习spring】spring bean管理(上)
1. spring 工厂类 我们前边的demo中用到的spring 工厂类是ClassPathXmlApplicationContext,从上图可以看到他还有一个兄弟类FileSystemApplic ...
- Spring5源码 - 07 Spring Bean 生命周期流程 源码解读02
文章目录 Pre 通俗流程 finishBeanFactoryInitialization Pre Spring5源码 - 06 Spring Bean 生命周期流程 概述 01 接上文 通俗流程 下 ...
- Spring8:一些常用的Spring Bean扩展接口
前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...
- 带你读懂Spring Bean 的生命周期,嘿,就是玩儿~
带你读懂Spring Bean 的生命周期,嘿,就是玩儿~ 一.前言 今天我们来说一说 Spring Bean 的生命周期,小伙伴们应该在面试中经常遇到,这是正常现象.因为 Spring Bean 的 ...
- coherence安装_在Oracle Coherence中分发Spring Bean
coherence安装 本文展示了如何通过使用Oracle Coherence中的EntryProcessor和可移植对象格式(POF)功能来分发Spring Bean. Coherence通过Ent ...
- 如何在没有Springockito的情况下模拟Spring bean
我在Spring工作了几年. 但是我总是对XML配置变得多么混乱感到沮丧. 随着各种注释和Java配置可能性的出现,我开始喜欢使用Spring进行编程. 这就是为什么我强烈使用Java配置的原因. 我 ...
最新文章
- 使用R语言对照片人物进行情绪分析
- git 恢复误删的分支
- idea验证失败_SVN提示https证书验证失败解决办法
- vue 添加完数据后刷新页面_vue form 表单提交后刷新页面的方法
- bootcss echarts_数据可视化插件使用(Echarts)
- .net core 中通过 PostConfigure 验证 Options 参数
- MapReduce改造fp-growth算法
- 2021年图灵奖公布!72岁的美国科学家 Jack Dongarra 获奖
- 对于访问IIS元数据库失败的解决
- 打过工、留过洋、创过业,一位中年IT老兵的反思
- 利用sender的Parent获取GridView中的当前行
- ROS安装教程(ubuntu16.04安装ROS Kinetic)
- 2021年终总结——脚踏实地,为下一次腾飞积蓄力量
- 消费者生产者问题,哲学家问题
- Java项目前后端文件简体转换繁体
- 蒙牛发言人香港发言措辞欠妥
- 台式机dp接口_了解笔记本电脑的各种视频接口
- 【杂谈】关于个人档案的机要邮寄
- Java中的同步方法
- lightroom安卓_如何将Lightroom从PC预设导入手机(安卓amp;iOS)
热门文章
- Matlab练习1:正方形的对称性群的乘法表
- yum报错: You could try using --skip-broken to work around the problem
- NetSuite Excel Export
- python照片转素描_python实现图片转素描效果代码
- 华为2018勇敢星实习软件类笔试(java)
- 在aspx.cs文件无法引用的aspx文件中的某个控件
- java理发店会员预约管理系统springboot+vue
- VUE Window 环境配置
- english questions
- 使用笔记本连接显示提示:输入信号超出有效范围,将设置改为1680*1050-60hz