Spring bean是什么?

Spring有跟多概念,其中最基本的一个就是bean,那到底spring bean是什么?

Bean是Spring框架中最核心的两个概念之一(另一个是面向切面编程AOP)。 是否正确理解 Bean 对于掌握和高效使用 Spring 框架至关重要。 遗憾的是,网上不计其数的文章,却没有简单而清晰的解释。 那么,Spring bean 到底是什么? 接下来我们用图文方式来解析这一个概念。

1 定义

Spring 官方文档对 bean 的解释是:

In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.

翻译过来就是:

在 Spring 中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。bean是一个由Spring IoC容器实例化、组装和管理的对象。

概念简单明了,我们提取处关键的信息:

bean是对象,一个或者多个不限定
bean由Spring中一个叫IoC的东西管理
我们的应用程序由一个个bean构成
第1和3好理解,那么IoC又是什么东西?

2 控制反转(IoC)

控制反转英文全称:Inversion of Control,简称就是IoC。 控制反转通过依赖注入(DI)方式实现对象之间的松耦合关系。程序运行时,依赖对象由【辅助程序】动态生成并注入到被依赖对象中,动态绑定两者的使用关系。Spring IoC容器就是这样的辅助程序,它负责对象的生成和依赖的注入,让后在交由我们使用。 简而言之,就是:IoC就是一个对象定义其依赖关系而不创建它们的过程。 这里我们可以细分为两个点。

2.1 私有属性保存依赖

第1点:使用私有属性保存依赖对象,并且只能通过构造函数参数传入,构造函数的参数可以是工厂方法、保存类对象的属性、或者是工厂方法返回值。 假设我们有一个Computer类:

public class Computer {
private String cpu;     // CPU型号
private int ram;        // RAM大小,单位GBpublic Computer(String cpu, int ram) {this.cpu = cpu;this.ram = ram;}
}

我们有另一个Person类依赖于Computer类,符合IoC的做法是这样:

public class Person {private Computer computer;public Person(Computer computer) {this.computer = computer;}
}

不符合IoC的做法如下:

// 直接在Person里实例化Computer类
public class Person {private Computer computer = new Computer(AMD, 3);
}// 通过【非构造函数】传入依赖
public class Person {private Computer computer;public void init(Computer computer) {this.computer = computer;}
}

简单来说,person依赖Computer,但person不控制Computer的创建和销毁,仅使用Computer,那么Computer的控制权交给person之外处理,这叫控制反转(IOC),而person要依赖computer,必然要使用computer的instance,那么

通过a的接口,把b传入;
通过a的构造,把b传入;
通过设置a的属性,把b传入;

这个过程叫依赖注入(DI)。

2.2 让Spring控制类构建过程

第2点:不用new,让Spring控制new过程。在Spring中,我们基本不需要 new 一个类,这些都是让 Spring 去做的。 Spring 启动时会把所需的类实例化成对象,如果需要依赖,则先实例化依赖,然后实例化当前类。 因为依赖必须通过构建函数传入,所以实例化时,当前类就会接收并保存所有依赖的对象。 这一步也就是所谓的依赖注入。

2.3 这就是IoC

在 Spring 中,类的实例化、依赖的实例化、依赖的传入都交由 Spring Bean 容器控制, 而不是用new方式实例化对象、通过非构造函数方法传入依赖等常规方式。 实质的控制权已经交由程序管理,而不是程序员管理,所以叫做控制反转。

3 Bean?

至于bean,则是几个概念。

概念1:Bean容器,或称spring ioc容器,主要用来管理对象和依赖,以及依赖的注入。
概念2:bean是一个Java对象,根据bean规范编写出来的类,并由bean容器生成的对象就是一个bean。
概念3:bean规范。

bean规范如下:

所有属性为private
提供默认构造方法
提供getter和setter
实现serializable接口

参考文章
https://www.zhihu.com/question/19773379
https://www.awaimai.com/2596.html
bean的后置处理器https://cloud.tencent.com/developer/article/1562503

依赖注入有三种方式:

变量(filed)注入
spring官方和idea不推荐此注入方式原因:不具备外部可见性。会导致循环依赖。无法注入不可变对象

@Autowired
UserDao userDao;

构造器注入

 finalUserDao userDao;@Autowiredpublic UserServiceImpl(UserDao userDao) {this.userDao = userDao;}

set方法注入

private UserDao userDao;@Autowiredpublic void setUserDao (UserDao userDao) {this.userDao = userDao;}

相比较而言:

优点:变量方式注入非常简洁,没有任何多余代码,非常有效的提高了java的简洁性。即使再多几个依赖一样能解决掉这个问题。

缺点:不能有效的指明依赖。相信很多人都遇见过一个bug,依赖注入的对象为null,在启动依赖容器时遇到这个问题都是配置的依赖注入少了一个注解什么的,然而这种方式就过于依赖注入容器了,当没有启动整个依赖容器时,这个类就不能运转,在反射时无法提供这个类需要的依赖。
在使用set方式时,这是一种选择注入,可有可无,即使没有注入这个依赖,那么也不会影响整个类的运行。
在使用构造器方式时已经显式注明必须强制注入。通过强制指明依赖注入来保证这个类的运行。

另一个方面:
依赖注入的核心思想之一就是被容器管理的类不应该依赖被容器管理的依赖,换成白话来说就是如果这个类使用了依赖注入的类,那么这个类摆脱了这几个依赖必须也能正常运行。然而使用变量注入的方式是不能保证这点的。
既然使用了依赖注入方式,那么就表明这个类不再对这些依赖负责,这些都由容器管理,那么如何清楚的知道这个类需要哪些依赖呢?它就要使用set方法方式注入或者构造器注入。

总结下:
变量方式注入应该尽量避免,使用set方式注入或者构造器注入,这两种方式的选择就要看这个类是强制依赖的话就用构造器方式,选择依赖的话就用set方法注入。
————————————————

AOP全注解开发时再配置类上还要加上一句
@EnableAspectJAutoProxy(proxyTargetClass = true)

通过配置织入@Aspectj切面

虽然可以通过编程的方式织入切面,但是一般情况下,我们还是使用spring的配置自动完成创建代理织入切面的工作。

通过aop命名空间的<aop:aspectj-autoproxy
/>声明自动为spring容器中那些配置@aspectJ切面的bean创建代理,织入切面。当然,spring

在内部依旧采用AnnotationAwareAspectJAutoProxyCreator进行自动代理的创建工作,但具体实现的细节已经被<aop:aspectj-autoproxy
/>隐藏起来了

<aop:aspectj-autoproxy
/>有一个proxy-target-class属性,默认为false,表示使用jdk动态代理织入增强,当配为<aop:aspectj-autoproxy
poxy-target-class=“true”/>时,表示使用CGLib动态代理技术织入增强。不过即使proxy-target-class设置为false,如果目标类没有声明接口,则spring将自动使用CGLib动态代理。

注解模式下context.getBean操作第一个参数为类名首字母小写,也可以在Component中的value修改名字

getBean一共有以下四种方法原型:
(1)getBean(String name) :通过id或name去查找获取bean.
参数name表示IOC容器中已经实例化的bean的id或者name,且无论是id还是name都要求在IOC容器中是唯一的不能重名。

(2)getBean(Class type):通过类型去获取bean,要求类型必须唯一
参数Class type表示要加载的Bean的类型。如果该类型没有继承任何父类(Object类除外)和实现接口的话,那么要求该类型的bean在IOC容器中也必须是唯一的。比如applicationContext.xml配置两个类型完全一致的bean,且都没有配置id和name属性

我们可以总结getBean(String name)和getBean(Class type)的异同点。
相同点:都要求id或者name或者类型在容器中的唯一性。
不同点:getBean(String name)获得的对象需要类型转换而getBean(Class type)获得的对象无需类型转换。

(3)getBean(String name,Class type)
这种方式比较适合当类型不唯一时,再通过id或者name来获取bean。

(4)getBean(String name,Object[] args)
这种方式本质还是通过bean的id或者name来获取bean,通过第二个参数Object[] args可以给bean的属性赋值,赋值的方式有两种:构造方法和工厂方法。但是通过这种方式获取的bean必须把scope属性设置为prototype,也就是非单例模式。
在这里插入图片描述
https://www.cnblogs.com/dubhlinn/p/10764845.html

JoinPoint:https://blog.csdn.net/qq_15037231/article/details/80624064

在这里插入 图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1618526.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

什么是bean

什么是bean&#xff1f; bean是计算机自动生成的类&#xff0c;bean是一个由Spring IoC容器实例化、组装和管理的对象。也就是说&#xff0c;bean并不是程序员编辑的&#xff0c;而是程序运行时&#xff0c;由spring通过反射生成的。在程序中&#xff0c;我们并不使用代码去ne…

Bean介绍

1.Bean 简介 在 Spring 中&#xff0c;所有被IOC 容器管理的&#xff0c;构成应用核心骨架的对象都被成为 Bean&#xff0c;它是由容器来实例化、装配、管理的对象。此外&#xff0c;它也是你应用中众多对象的一个。Bean 以及依赖的实例化和装配等工作全部是由容器中的配置元信…

Bean专题——什么是Bean?怎么注册、使用?生命周期?作用域?

1.什么是Bean&#xff1f; Bean是被实例的、组装的、及被Spring容器管理的Java对象。Spring容器会自动完成Bean对象的实例化。创建应用对象之间的协作关系的行为被称为&#xff1a;装配&#xff0c;这就是依赖注入的本质。 2.Spring三种装配方案 1.隐式的bean发现机制和自动…

【Spring第三篇】什么是Bean?

在Spring 中&#xff0c;构成应用程序主干并由Spring IoC容器管理的对象称为bean。bean是一个由Spring IoC容器实例化、组装和管理的对象。 我们总结如下&#xff1a; 1.bean是对象&#xff0c;一个或者多个不限定 2.bean由Spring中一个叫IoC的东西管理 3.我们的应用程序由一个…

大数据-玩转数据-Flink窗口函数

一、Flink窗口函数 前面指定了窗口的分配器, 接着我们需要来指定如何计算, 这事由window function来负责. 一旦窗口关闭, window function 去计算处理窗口中的每个元素. window function 可以是ReduceFunction,AggregateFunction,or ProcessWindowFunction中的任意一种. Reduc…

软考:中级软件设计师:网络类型与拓扑结构,网络规划与设计,ip地址与子网划分,特殊含义的IP地址

软考&#xff1a;中级软件设计师:网络类型与拓扑结构 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准…

Qt入门教程【Core篇】Layout布局(布局管理器、手动布局)

&#x1f608;「编程小鱼酱秘密基地」&#xff1a;传送门 &#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「网易云课堂」&#xff1a;传送门 &#x1f608;「CSDN学院」&#xff1a;传送门 &#x1f608;「51CTO学…

前端布局 Flex(弹性)布局

1. flex布局优点 操作方便&#xff0c;布局极为简单&#xff0c;移动端应用很广泛 pc端浏览器支持情况较差 IE11或者更低版本&#xff0c;不支持或仅部分支持 2. flex布局原理 flex意为“弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性&#xff0c;任何一个容器都…

Java BorderLayout(边框布局)布局管理器

BorderLayout BorderLayout 将容器分为 EAST 、 SOUTH 、 WEST 、 NORTH 、 CENTER五个区域&#xff0c;普通组件可以被放置在这 5 个区域的任意一个中 。 BorderLayout布局 管理器的布局示意图如图所示 。 当改变使用 BorderLayout 的容器大小时&#xff0c; NORTH 、 SOUTH …

java:布局方法(网格布局)

网格布局 一、简单说明二、关键代码三、流程图四、例子说明1. 有17个“按钮”排列&#xff08;1&#xff09;源码A&#xff08;2&#xff09;运行效果 2. 有36个“按钮”排列&#xff08;1&#xff09;源码B&#xff08;2&#xff09;源码B运行效果 3. 有12个“按钮”排列&…

Grid布局介绍

1、什么是Grid布局 ​     Grid布局即网格布局&#xff0c;是一种新的css模型&#xff0c;一般是将一个页面划分成几个主要的区域&#xff0c;定义这些区域的大小、位置和层次等关系&#xff0c;是目前唯一一种css二维布局。 2、和flex布局的区别 ​     Grid布局和fle…

Java GridLayout(网格布局)布局管理器

GridLayout&#xff08;网格布局&#xff09; ​ GridLayout 布局管理器将容器分割成纵横线分隔的网格 &#xff0c; 每个网格所占的区域大小相同。当向使用 GridLayout 布局管理器的容器中添加组件时&#xff0c; 默认从左向右、 从上向下依次添加到每个网格中 。 与 FlowLay…

css经典布局——圣杯布局

圣杯布局和双飞翼布局一直是前端面试的高频考点&#xff0c;圣杯布局的出现是来自由 Matthew Levine 在 2006 年写的一篇文章 《In Search of the Holy Grail》。 比起双飞翼布局&#xff0c;它的起源不是源于对页面的形象表达。在西方&#xff0c;圣杯是表达“渴求之物”的意思…

CSS响应式布局(自适应布局)

CSS 响应式布局也称自适应布局&#xff0c;是 Ethan Marcotte 在 2010 年 5 月份提出的一个概念&#xff0c;简单来讲就是一个网站能够兼容多个不同的终端&#xff08;设备&#xff09;&#xff0c;而不是为每个终端做一个特定的版本。这个概念是为解决移动端浏览网页而诞生的。…

flex布局(详解)

目录 前言 一、何为Flex布局 二、基本概念 三、容器的属性 3.1 flex-direction属性 3.2 flex-wrap属性 3.3 flex-flow 3.4 justify-content属性 3.5 align-items属性 3.6 align-content属性 四、项目的属性 4.1 order属性 4.2 flex-grow属性 4.3 flex-shrink属性 …

Redis各类数据结构应用场景总结

Redis各类数据结构应用场景总结 引言String应用场景 List应用场景 Hash应用场景 Set应用场景 ZSet应用场景 小结 引言 实际面试过程中更多看重的是对Redis相关数据结构的活学活用&#xff0c;同时也可能会引申出Redis相关底层数据结构原理的实现&#xff0c;笔者最近面试过程中…

CSS基本布局——grid布局

grid布局简介&#xff1a; Grid布局是将容器划分成“行”和“列”&#xff0c;产生单元格&#xff0c;然后指定“项目所在”的单元格&#xff0c;可以看作是二维布局。 基本概念&#xff1a; 容器&#xff08;container&#xff09;——有容器属性项目&#xff08;items&…

【CSS布局】—— flex(弹性)布局

赶快悄悄的努力起来吧&#xff0c;不苒在这里衷心祝愿各位大佬都能顺利通过面试。 面试专栏分享&#xff0c;感觉有用的小伙伴可以点个订阅&#xff0c;不定时更新相关面试题&#xff1a;面试专栏 。 文章目录 &#x1f33c;前言&#x1f33b;正文1、弹性盒子模型是什么&#x…

火列星屯--最强大的CSS布局方案

一、总论 首先给出结论&#xff1a;网格布局&#xff08;Grid&#xff09;是最强大的 CSS 布局方案。 虽说如此&#xff0c;但是仍要重视具体的应用场景&#xff0c;如果有其他写法可以提高代码的简洁和可读性&#xff0c;未必非要选择Gird不可。 网格布局就如同它的字面意思…

常见的布局方式

1.弹性布局---flex布局 弹性布局是一种常见且好用的布局方式&#xff0c;它可以让结构中的内容自适应不同的分辨率&#xff0c;简化的代码的书写。 使用方法 给父盒子加上display:flex;默认子元素不换行&#xff0c;如果装不开&#xff0c;子元素会缩小元素的宽度。 父级元…