1. autowire-candidate做什么事情? 上一篇文章primary能解决什么问题中遇到的问题,我们再来回顾一下,当容器中某种类型的bean存在多个实例的时候,此时我们如果从容器中查找这种类型的bean对象,会报下面这个异常: org.springframework.beans.factory.NoUniqueBeanDefinitionException 原因:当从容器中按照类型查找一个bean对象的时候,容器中却找到了多个匹配到的bean实例,此时spring也蒙圈了不知道该如何选择了,就会报这个异常。
1. spring容器查找bean存在的问题? spring容器中对外暴露一个 getBean(Class var1) throws BeansException;方法,意味着根据传入的指定类型,在IOC容器中获取该指定类型的bean对象。 实际上这个获取过程要求,当前传入的类型和被获取的对象必须满足isAssignableFrom关系,即传入的类型必须是目标对象的类型或者是其父类型。 因此,当我们传入的类型在整个Spring容器中存在多个子对象时,此时通过该方式获取对象将失败。
1. 什么是depend-on? depend-on用来设置bean之前的依赖关系,从而干预bean的创建和销毁顺序。
1. spring手动注入依赖的不足 之前已经知道,spring提供了手动注入依赖的方式:通过构造器注入和通过setter属性注入。 手动注入依赖需要我们显式编写bean xml配置,即采用硬编码的方式进行依赖注入。 手动注入依赖的方式存在如下不足: public class A{ private B b; private C c; private D d; private E e; ... private N n; //上面每个private属性的set和get方法 }
之前在引出spring时,就明确了如果要水平组装两个java对象的话,通过开发人员编程式组装是很不友好的。 所以,spring出现的目的就是解决了java对象的实例化问题,和java对象之间的组装问题。 我们把一个A对象需要依赖B对象去处理某些功能的场景,称之为A对象依赖B对象,也叫做向A对象中注入B对象。 我们很明确了,java对象之间的依赖就是我们所谓的委托机制。 一般而言,系统中的类和类之间都存在依赖关系,即一个类会委托另外一个类去处理某些功能。 这个时候我们就需要向目标类中注入被依赖的对象。 学习委托机制时,我们知道想让A对象持有B对象,总的来说有4种方式,而其中最常见的方式就是B对象作为A对象的成员变量,通过外部注入。即以成员变量的方式注入B对象。 而spring的DI依赖注入机制,实际上就是采用这种方式来注入依赖关系的。 这种以成员变量的方式注入B对象,一般有2种具体操作: 1. 外部直接通过构造方法向目标类注入成员变量,这要求目标类存在有参构造。 2. 外部直接通过setter方法向目标类注入成员变量,这要求目标类存在setter方法。 下面我们来详细介绍spring提供的DI!
1. 什么是bean scope? spring容器帮我们创建bean对象,有时候我们需要这个bean对象在整个spring容器中都是唯一的,有时候我们又希望每次使用时都是重新创建的新对象。 spring对我们的这种需求也提供了支持,在spring中这种诉求叫做bean的作用域,xml在定义bean的时候,可以通过bean元素的scope属性来指定bean的作用域。 比如: <bean id="createByFactoryBean" class="com.zeh.main.FactoryBeanImpl" scope="当前bean的作用域"/> spring容器中scope常见有5种,singleton、prototype、request、session、application。
1. spring创建bean实例 1.1 spring创建bean实例的方式 spring容器内部创建bean实例对象常见的有如下4种方式: 1. 通过反射调用构造方法创建bean对象。 2. 通过静态工厂方法创建bean对象。 3. 通过实例工厂方法创建bean对象。 4. 通过FactoryBean创建bean对象。 1.2 constructor-arg标签 标签是标签下的子标签。 其主要是用来定义构造器参数的,有如下3种使用方式: 通过构造器参数序号,来指定构造器参数的初始化方式。 ```xml 2. 通过构造器参数名称,来指定构造器参数的初始化方式。 ```xml <constructor-arg name="当前参数在构造器中的参数名称" value="当前属性如果是简单类型则表示当前属性的值" ref="当前属性如果是引用类型则表示引用的bean名称"/> 通过构造器参数类型,来指定构造器参数的初始化方式。 ```xml ``` 其中,value和ref只能二选一,当参数是简单类型时,通过value指定参数实际值;当参数是引用类型时,通过ref指定引用的bean名称。
1. xml中bean定义详解 被spring管理的java对象统称为java bean。 我们在程序中需要用到很多java对象,之前都是自己new出来然后使用;应用spring之后,spring就是个容器,可以将我们需要用到的java对象列一个清单,交给spring容器。 spring会帮我们创建、管理、组装清单中的bean对象,放置在IOC容器中。 当我们需要使用某个java对象时,我们只需要从spring容器中根据目标bean的名称进行获取即可。 也就是说,当我们向spring容器中提供这份清单时,是需要提供给spring一个目标bean的名称,这样spring才能将实例化好的bean对象和我们提供的bean名称之间进行映射绑定。 当我们需要使用某个目标bean时,我们只需要将我们提供的目标bean的名称提交给spring容器,spring就可以根据这个bean名称查找到指定的目标bean实例返回给我们使用。 我们提供给spring的bean名称,在整个spring容器中都必须是唯一的,否则spring容器将不知道该返回哪个bean实例。
1. IOC容器 IOC容器是具有依赖注入功能的容器,负责对象的实例化、对象的初始化、对象和对象之间的依赖关系组装、对象的销毁、对外提供对象的查找等操作。 对象的整个生命周期都由IOC容器进行控制,IOC容器就是spring容器。 我们需要的任何对象都可以交给IOC容器进行管理,不需要我们再手动通过new的方式创建对象,由IOC容器直接帮我们创建并组装好,当我们需要使用对象时,直接去IOC容器中进行查找就行了。
1. Spring的3个核心概念 Spring是个框架技术,其有3个核心的概念:控制反转(IOC)、依赖注入(DI)和面向切面编程(AOP)。 spring的其他技术都是依赖这三个核心技术建立起来的,因此学习spring,首先应该了解这三个技术。 AOP后续再讲,此处先讲解IOC和DI。
个人独立开发项目,基于springboot 3.x starter机制提供插拔式的插件功能
基于芋道最新源码二次开发