你问我Spring(你问我爱你有多深我爱你有几分是什么歌)

你问我Spring构造方法注入自动注入(byName、byType)依赖检测
1、Ioc理论概要
在JAVA的世界中,一个对象A怎么才能调用对象B?通常有以下几种方法。 上表可以看到&#xff0

构造函数注入自动注入(byName,byType)依赖检测

1、Ioc理论概要

在JAVA世界中,对象A如何调用对象B呢?通常有以下几种方式:

从上表可以看出,对象引用可以在不同的地方(对其他引用对象)并在不同的时间通过不同的方法完成。例如,如果B是一个非常简单的对象比如直接new B(),创建字符串就不会感觉复杂。然而,如果B 是一个具有复杂依赖关系的Service 对象,那么在各个点引用B 就会变得非常复杂。

如果需要时刻维护B的复杂依赖关系,那么当项目中有数百个B对象时,系统的复杂度会呈指数级增长。 IOC容器的引入解决了这个问题,通过统一构造对象的方法并自动维护对象依赖关系,可以降低系统实现成本。作为先决条件,目标对象必须事先基于XML 进行声明。

2、实体Bean的构建

创建一个FactoryBean,它基于Class构造函数方法构建静态工厂方法

1. 基于ClassName 构建

这是最常见的方法,一般情况下springs底层都是根据类属性通过反射来构造的。

2、施工方法

如果需要基于参数构建,请使用构造方法构建。对应的属性为: **name:** 构造方法参数变量名**type:** 参数类型从**index:**开始的参数索引。 0 **value:* *参数值,spring自动将其转换为参数实际类型的值**ref:** 引用该字符串的任何其他对象

3.创建静态工厂方法

如果您想要对对象进行A/B 测试,您可以使用静态工厂方法来创建不同的对象并根据您的策略设置不同的属性。 在这种模式下,需要创建一个静态工厂方法,该方法返回一个实例,并调用静态方法来创建对象。

公共静态HelloSpring构建(字符串类型){

if (type.equals(\”A\”)) {

return new HelloSpring(\”鲁班\”, \”男人\”);

否则if (type.equals(\”B\”)) {

return new HelloSpring(\”diocan\”, \”女\”);

} 除此之外{

throw new IllegalArgumentException(\”类型必须是A 或B\”);

}

}

4.创建FactoryBean

当通过指定bean工厂创建对象时,对象的构造和初始化完全由工厂实现。配置bean时指定工厂类的类名。

公共类LubanFactoryBean 实现FactoryBean {

@覆盖

public Object getObject() 抛出异常{

返回一个新的HelloSpring()。

}

@覆盖

公开课?

返回HelloSpring.class。

}

@覆盖

公共布尔isSingleton() {

返回假。

}

}

3、bean的基本特性

作用域生命周期加载机制

a. 范围虽然bean对象通常是无状态的,并且一些有状态对象可以有单个实例,但是您可以使用scope=“prototype”scope=”singleton”创建有状态对象。

范围=原型

当一个bean被设置为原型时,您可以通过BeanFactoryAware检索BeanFactory对象,并且每次都获取一个新对象。

b. 生命周期bean 对象的创建、初始化和销毁就是bean 的生命周期。定期构建方法和初始方法可以分别使用init-method 和destroy-method 属性指定。

如果这太麻烦,您可以让您的bean 实现InitializingBean.afterPropertiesSet() 和DisposableBean.destroy() 方法。分别支持初始化方法和销毁方法

c. 加载机制指示Bean 何时加载。只需配置lazy-init即可。它的值为: true: Lazy loading,即延迟加载false: 非延迟加载,对象在容器启动时创建。 default: 默认,使用default-lazy-init中指定的值。如果未指定default-lazy-init 将为false

何时使用延迟加载?延迟加载可以使容器启动得更快,但非延迟加载可以让您在容器启动时更快地检测到程序中的错误。选择哪一种取决于您想要更快的启动速度还是更快的错误检测。为后者选择“依据”。

4、依赖注入

想象一下,如果IOC没有依赖注入,这个框架只能帮助你构建一些简单的bean,并不能解决前面提到的构建复杂bean的问题。如何在spring 中对ioc 进行依赖注入。有几种方法。

set方法注入构造方法注入自动注入(byName, byType) 方法注入(lookup-method)

2.设置方法注入

3. 插入构造函数方法

4.自动注入(byName\\byType\\constructor)

byName:基于相同的变量名和bean名称插入byType:基于变量类别和bean名称构造函数:根据IOC匹配bean和构造函数方法(由于语义模糊,不推荐)

5. 依赖方法注入(查找方法) 如果单实例bean依赖于多实例bean,传统的方法是只注入一次,但如果想每次都获取一个新的实例,可以使用查找方法。如何实现它。

#写一个抽象类

公共抽象类MethodInject {

公共无效处理程序请求(){

//调用这个抽象方法来获取最新的实例

getFine();

}

编写一个抽像方法

公共抽象FineSpring getFine();

}

//设置抽象方法实现

该操作的原理是基于动态代理技术,重新生成对目标类的继承,然后重写抽象方法,从而达到注入的目的。 前面提到,如果单个bean依赖于多个bean,还可以实现ApplicationContextAware和BeanFactoryAware接口来获取BeanFactory实例。这允许您直接调用getBean 方法来获取新实例。从语义的角度推荐这种方法。逻辑比Lookup方法更清晰。

二、IOC 设计原理与实现

知识点:

bean构建过程BeanFactory和ApplicationContext的区别

1、Bean的构建过程

spring.xml文件存储bean描述配置,BeanFactory读取这些配置并生成相应的bean。这是我们对IOC原则的一般理解。但如果我们深入挖掘,是否会出现更多问题?

JAVA中谁、什么对象最终承载了配置信息?谁读取XML文件并加载这些承载对象?

BeanDefinition 在IOC实现中,xml描述的bean信息最终存储在一个BeanDefinition对象中。这里,xml bean 与BeanDefinition 进程具有一对一的关系。

您可以看到XML bean 上设置的属性最终反映在BeanDefinition 中。等

总目录展示

这款笔记本共有八个节点(从浅到深),分为三个主要模块。

高性能。 闪购涉及大量并发读写,因此支持高并发访问非常重要。本篇笔记重点关注四个方面:设计数据的动静分离方案、热点检测与隔离、请求的削峰与分级过滤、服务器的最终优化。

一致性。 在闪购中,如何实现产品的库存减少也很重要。为了减少库存,您可能需要同时请求有限数量的商品。库存减少在大规模同步更新中可以分为“拍摄减少库存”和“付款减少库存”。在此过程中需要保护数据,您可以想象这有多么困难。因此,本节点专门讲解如何设计闪购库存削减计划。

高可用性。 虽然提出了很多极端的优化思路,但实际中总有无法考虑的情况。因此,为了保证系统的高可用性和准确性,还需要设计一个覆盖底线的PlanB。即使最坏的情况发生,也能保持冷静。在注释的最后,您需要考虑设计安全网计划的各个方面。

由于空间有限,无法详细展示每个模块(这里总结了这些要点《高并发秒杀顶级教程》)。请转发(让更多人看到!)。

由于内容太多,这里只摘录一部分。

,帮助您即使在最坏的情况发生时也保持冷静。在注释的最后,您需要考虑设计安全网计划的各个方面。

由于空间有限,无法详细展示每个模块(这里总结了这些要点《高并发秒杀顶级教程》)。请转发(让更多人看到!)。

[外部链接图像正在传输.(img-6qdZKnKO-1719187578147)]

[外部链接图片正在传输中.(img-ofDBKa6b-1719187578147)]

内容太多,我这里只摘录一部分。

以上#Ask Me Spring相关内容来源网络,仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91899.html

(0)
CSDN's avatarCSDN
上一篇 2024年6月24日 上午7:56
下一篇 2024年6月24日 上午9:01

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注