《探索 Spring 核心容器:Bean 的奇妙世界》

一、Spring 核心容器与 Bean 的关系

Spring 核心容器是 Spring 框架的重要组成部分,负责管理和组织应用程序中的对象,而 Bean 则是构成应用程序主干并由 Spring IoC 容器管理的对象,二者紧密相连。

Spring 的核心容器由多个模块组成,如 Spring-core、Spring-beans、Spring-context、Spring-context-support 和 Spring-expression 等。这些模块共同为 Bean 的管理提供了强大的支持。

Spring 核心容器中的 BeanFactory 和 ApplicationContext 是两个重要的接口,用于管理 Bean。BeanFactory 是基础类型的 IoC 容器,提供了完整的 IoC 服务支持,负责初始化各种 Bean,并调用它们的生命周期方法。而 ApplicationContext 是 BeanFactory 的子接口,不仅包含了 BeanFactory 的所有功能,还添加了对国际化、资源访问、事件传播等方面的支持。

在实际应用中,Bean 是 Spring 核心容器的基本单位。Spring 负责创建 Bean 的实例,并管理其生命周期。Spring 容器根据各种形式的 Bean 配置信息来创建 Bean 实例,并调用 Bean 实例的方法来完成 “依赖注入”。可以把 Spring 容器理解成一个大型工厂,Bean 就是该工厂的产品,工厂(Spring 容器)里能生产出来什么样的产品(Bean),完全取决于配置文件中的配置。而这个配置是由开发人员创建和维护的。

例如,在一个 Web 项目中,ApplicationContext 容器的实例化工作会交由 Web 服务器来完成。Web 服务器实例化 ApplicationContext 容器时,通常会使用基于 ContextLoaderListener 实现的方式,此种方式只需要在 web.xml 中添加相应代码即可。

总之,Spring 核心容器与 Bean 之间的关系密不可分,Spring 核心容器为 Bean 的管理提供了基础架构和功能支持,而 Bean 则是构成应用程序的主要组成部分,通过 Spring 核心容器的管理,实现了应用程序的高效运行和灵活扩展。

二、Bean 的定义与特点

(一)Bean 的概念与构成

Bean 是由 Spring IoC 容器实例化、组装和管理的对象。在 Java 中,一个 JavaBean 通常由属性、方法和事件组成。在 Spring 中,Bean 作为构成应用程序的主要对象,具有明确的定义和规范。

首先,Bean 的所有属性通常为 private,以保证数据的封装性。同时,Bean 必须提供默认构造方法,以便 Spring IoC 容器能够实例化该对象。此外,Bean 还需要提供 getter 和 setter 方法,用于访问和修改属性的值。最后,为了支持序列化和反序列化操作,Bean 应实现 Serializable 接口。

例如,一个简单的用户 Bean 可能如下所示:

public class User implements Serializable {private String username;private int age;public User() {}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

(二)依赖注入与控制反转

在 Spring 中,通过依赖注入方式实现对象之间的松耦合关系。控制反转(IoC)是实现依赖注入的核心概念。控制反转英文全称是 Inversion of Control,简称 IoC。

依赖注入是指当一个类需要另一个类时,就意味着依赖,一旦出现依赖,就可以把另一个类作为本类的成员变量,最终通过 Spring 配置文件进行注入(赋值)。而控制反转是指使用私有属性保存依赖对象,并且只能通过构造函数参数传入,构造函数的参数可以是工厂方法、保存类对象的属性、或者是工厂方法返回值。同时,不用 new,让 Spring 控制类构建过程。在 Spring 中,类的实例化、依赖的实例化、依赖的传入都交由 Spring Bean 容器控制,而不是用 new 方式实例化对象、通过非构造函数方法传入依赖等常规方式。

例如,有一个 Computer 类和一个 Person 类,符合 IoC 的做法是这样:

 
public class Computer {private String cpu;private int ram;public Computer(String cpu, int ram) {this.cpu = cpu;this.ram = ram;}}public class Person {private Computer computer;public Person(Computer computer) {this.computer = computer;}}

(三)注册 Bean 的注解

在 Spring 中,有许多注解可用于注册 Bean,放进 IoC 容器中,方便管理和解耦。

  1. @Component:通用注解,用于将类标记为 Spring 上下文中的组件,即 Spring 管理的 Bean。可以在任何类上使用,包括控制器、服务、DAO 等。当 Spring 容器启动时,会自动扫描并实例化被 @Component 注解标记的类,并将其注册到 Spring 上下文中。
  1. @Repository:专门用于将数据访问对象(DAO)类标记为 Spring 管理的 Bean。除了具有 @Component 的基本功能外,它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。通常在数据访问层(如 JPA、MyBatis 的 Mapper 接口)上使用。
  1. @Service:专门用于将业务逻辑服务类标记为 Spring 管理的 Bean。通常在服务层(Service Layer)的类上使用。标注的类通常负责处理业务逻辑,调用 DAO 层进行数据操作。
  1. @Controller:专门用于将 MVC 控制器类标记为 Spring 管理的 Bean。通常在 Web 层(MVC 的 Controller 层)的类上使用。标注的类负责处理 HTTP 请求,并返回视图或数据。通常与 @GetMapping、@PostMapping 等注解一起使用来定义请求映射。
  1. @Configuration:相当于以前 Spring 的 xml 配置文件,作用在类上面,此类中可以添加一些 bean 实例,被 spring IOC 管理,可以使用 @ComponentScan 注解自行配置组件扫描,类似于以前 xml 中的<bean>标签。

例如,一个简单的服务类可以使用 @Service 注解进行注册:

@Servicepublic class UserService {// 业务逻辑代码}

(四)使用 Bean 的注解

在 Spring 中,@Autowired、@Resource 等注解用于从 IoC 容器中获取已有的 Bean,实现对 Bean 的使用。

  1. @Autowired:来自于 Spring,可用于 Setter 注入、构造函数注入和属性注入。默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许 null 值,可以设置它的 required 属性为 false。
  1. @Resource:来自于 JDK 的注解,支持更多的参数设置,例如 name 设置,根据名称获取 Bean。只能用于 Setter 注入和属性注入,不能用于构造函数注入。

例如,在一个控制器类中,可以使用 @Autowired 注解注入服务类:

 
@Controllerpublic class UserController {@Autowiredprivate UserService userService;// 控制器方法}

三、Spring 核心容器中的 Bean 生命周期

(一)创建阶段

在 Spring 核心容器中,创建 Bean 的实例是一个关键步骤。Spring 可以通过反射机制来创建 Bean 的实例。当 Spring 容器启动时,它会扫描指定的包路径,查找被特定注解(如@Component、@Service等)标记的类。对于这些类,Spring 会根据其构造函数来创建实例。例如,如果一个类有一个默认的无参构造函数,Spring 会调用这个构造函数来创建实例。如果没有默认构造函数,但提供了 Supplier 或者工厂方法,Spring 也可以通过这些方式来创建 Bean 的实例。此外,在选择构造方法时,Spring 会考虑多种因素,比如构造函数的参数个数、参数类型等,以确保能够正确地创建 Bean 的实例。

(二)merged BeanDefinition 阶段

这个阶段是 Spring 提供的一个重要拓展点。在这个阶段,开发者可以通过后置处理器对 BeanDefinition 进行修改。BeanDefinition 是 Spring 中用于描述 Bean 的元数据,包括 Bean 的类名、属性、构造函数参数等信息。通过后置处理器,可以在 Bean 实例化之前对 BeanDefinition 进行修改,从而实现对 Bean 的定制化。Spring 自身也利用这个拓展点进行一些初始化操作。例如,Spring 会在这个阶段对一些内置的 BeanDefinition 进行处理,以确保它们能够正确地被实例化和初始化。

(三)暴露工厂对象阶段

在这个阶段,Spring 将早期的 bean 对象提前放入到三级缓存singletonFactories中。这是为了支持循环依赖的情况。循环依赖是指两个或多个 Bean 之间相互依赖的情况。例如,Bean A 依赖于 Bean B,而 Bean B 又依赖于 Bean A。在这种情况下,如果没有适当的处理机制,就会导致创建 Bean 的过程出现死锁。通过将早期的 bean 对象放入到三级缓存中,Spring 可以在创建 Bean 的过程中,当遇到循环依赖时,从缓存中获取已经创建的 bean 对象,从而避免死锁的发生。

(四)Aware 接口阶段

实现了 Aware 接口的 bean 具有被 Spring 容器通知的能力。Spring 容器会在适当的时候回调这些 bean 的 set 方法,将相关的资源注入到 bean 中。例如,实现了BeanNameAware接口的 bean,可以通过setBeanName方法获取自己在 Spring 容器中的名称。实现了ApplicationContextAware接口的 bean,可以通过setApplicationContext方法获取 Spring 应用上下文对象,从而可以访问 Spring 容器中的其他 bean 和资源。常见的 Aware 接口还有BeanFactoryAware、MessageSourceAware等。

(五)BeanPostProcessor 阶段

BeanPostProcessor 也称为 Bean 后置处理器,在 Spring 容器的创建过程中起着重要的作用。它回调其定义的两个方法,实现对 Bean 的进一步处理。在 Spring 框架中,BeanPostProcessor是一个用于在容器初始化时对 bean 的创建过程进行扩展和自定义的接口。其作用主要体现在以下几个方面:

  • 前置处理:在调用 bean 的初始化方法(例如,带有@PostConstruct注解的方法)之前,对 bean 实例进行额外的处理。
  • 后置处理:在调用 bean 的初始化方法之后,对 bean 实例进行额外的处理。
  • 属性填充:可以在 bean 初始化之前或之后,对 bean 的属性进行动态填充。
  • 代理创建:通过BeanPostProcessor可以创建代理对象,例如 AOP 代理。
  • 自定义初始化逻辑:可以在 bean 初始化过程中插入自定义逻辑。
  • 增强 Bean 的功能:对 bean 的功能进行增强,比如添加额外的逻辑处理。

Spring 框架提供了一些内置的BeanPostProcessor实现,以下是一些常见的内置BeanPostProcessor:

  • ApplicationContextAwareProcessor:用于处理ApplicationContextAware接口的实现,确保实现了该接口的 bean 能够接收到应用程序上下文的引用。
  • ApplicationListenerDetector:检测实现了ApplicationListener接口的 bean 并注册它们为事件监听器。
  • BeanPostProcessorChecker:检查 bean 是否实现了BeanPostProcessor接口,如果没有实现,则抛出异常。
  • BeanValidationPostProcessor:处理 JSR - 303 / JSR - 349 注解(Bean Validation),在 bean 初始化后进行验证。
  • CommonAnnotationBeanPostProcessor:处理一些常见的注解,如@Autowired、@Value、@Inject等。
  • CustomAutowireConfigurer:用于注册自定义的自动装配处理器。
  • DelegatingIntroductionInterceptor:用于处理带有@Aspect注解的类,实现 AOP 的引介(introduction)功能。
  • DependencyDescriptorRegistryPostProcessor:用于注册DependencyDescriptor相关的后置处理器。
  • EventListenerMethodProcessor:处理带有@EventListener注解的方法。
  • MBeanExportListener:用于注册 Jmx 导出的 bean。
  • PersistenceAnnotationBeanPostProcessor:处理 JPA 相关的注解,如@PostLoad、@PrePersist等。
  • AutowiredAnnotationBeanPostProcessor:处理@Autowired注解,用于自动装配。

这些内置的BeanPostProcessor使得 Spring 容器在 bean 的创建和初始化过程中具有很高的灵活性和强大的功能。开发者也可以根据自己的需求实现自定义的BeanPostProcessor,以满足特定的处理逻辑。

(六)InitializingBean 和 init - method 阶段

实现了InitializingBean接口的 Bean 会在 Bean 初始化之前调用afterPropertiesSet()方法。此外,也可以使用@PostConstruct注解标注的方法或者init - method属性指定的方法来完成 Bean 的初始化。这些方法可以用于执行一些初始化逻辑,比如数据库连接的建立、资源的加载等。例如,可以在一个服务类中使用@PostConstruct注解标注一个方法,在这个方法中进行一些初始化操作:

 
@Servicepublic class MyService implements InitializingBean {@Overridepublic void afterPropertiesSet() throws Exception {// 初始化逻辑}@PostConstructpublic void init() {// 初始化逻辑}}

(七)销毁阶段

实现了DisposableBean接口的 Bean 会在 Bean 销毁之前调用destroy()方法。也可以使用@PreDestroy注解标注的方法或者destroy - method属性指定的方法来完成 Bean 的销毁。这些方法可以用于执行一些清理资源的操作,比如关闭数据库连接、释放文件句柄等。例如,可以在一个服务类中使用@PreDestroy注解标注一个方法,在这个方法中进行一些清理资源的操作:

 
@Servicepublic class MyService implements DisposableBean {@Overridepublic void destroy() throws Exception {// 清理资源逻辑}@PreDestroypublic void cleanup() {// 清理资源逻辑}}

四、Spring 核心容器的类型及特点

(一)BeanFactory

BeanFactory 作为 Spring 容器的基本形式,在 Spring 框架中占据着重要的地位。它是一个工厂类,用于实例化、配置和管理 Bean 的生命周期。

BeanFactory 提供了最基本的控制反转(IoC)功能,能够读取 Bean 的配置文档,管理 Bean 的加载、实例化,控制 Bean 的生命周期,维护 Bean 之间的依赖关系。例如,在一个小型项目中,如果资源受限或者对启动速度有较高要求,可以选择使用 BeanFactory。

BeanFactory 采用延迟初始化方式,即只有在需要使用某个 Bean 时(通过调用 getBean()方法),才会对该 Bean 进行加载实例化。这种方式在一定程度上可以提高性能和减少内存占用,特别是当应用程序中存在大量 Bean 但并非所有都在启动时就需要使用的情况下。然而,这种延迟加载也有其不足之处,那就是我们不能在容器启动时就发现一些存在的 Spring 配置问题。如果 Bean 的某一个属性没有注入,BeanFactory 加载后,直至第一次使用调用 getBean方法才会抛出异常。

此外,BeanFactory 通常以编程的方式被创建,这就需要开发者手动编写代码来创建和配置 BeanFactory。例如:

 
BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("config.xml"));

(二)ApplicationContext

ApplicationContext 是 BeanFactory 的扩展,它在 Spring 框架中扮演着更为重要的角色,提供了更多企业级功能。

ApplicationContext 在应用程序启动时就实例化所有单实例 Bean,这种方式虽然可能会在启动时占用更多的内存,但在运行时性能更好。因为当需要使用某个 Bean 时,它已经被创建好了,无需等待实例化过程,直接可以获取使用。例如,在一个大型企业级应用中,对性能要求较高,且希望在启动时就发现潜在的配置错误,ApplicationContext 是一个更好的选择。

ApplicationContext 支持事件传播,允许发布事件到注册的监听器,实现松耦合组件之间的通信。比如,当某个重要业务流程完成时,可以发布一个事件,其他相关组件可以通过监听这个事件来执行相应的操作。

它还支持国际化功能,通过 MessageSource接口的实现,可以根据用户的语言环境提供不同语言的消息。这对于面向全球用户的应用程序非常重要。

此外,ApplicationContext 提供了统一的资源文件访问方式,通过 Resource接口和 ResourceLoader接口实现,可以方便地访问文件、URL 等外部资源。

ApplicationContext 可以以声明的方式创建,如使用 ContextLoader。这使得配置更加灵活和方便,减少了编程的工作量。例如,可以通过 XML 配置文件、注解等方式来创建和配置 ApplicationContext。以下是通过 XML 配置文件创建 ClassPathXmlApplicationContext的示例:

 
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

五、Bean 在 Spring 核心容器中的作用与优势

(一)松耦合性

在 Spring 核心容器中,Bean 的管理通过依赖注入和控制反转实现了松耦合。这意味着各个组件之间的依赖关系不是通过硬编码的方式建立,而是由 Spring 容器在运行时动态地注入。例如,一个服务类依赖于一个数据访问对象(DAO),在传统的开发方式中,服务类可能会直接实例化 DAO 对象,这样就导致了服务类和 DAO 类之间的紧密耦合。而在 Spring 中,服务类只需要定义一个 DAO 类型的属性,并通过注解(如@Autowired)表明这个属性需要由 Spring 容器注入。这样,当需要更换 DAO 的实现时,只需要修改配置文件,而不需要修改服务类的代码。这种松耦合性使得应用程序更加灵活,易于维护和扩展。

(二)可测试性

Spring 管理的 Bean 使得应用程序的测试更加容易。由于依赖是通过配置文件或注解注入的,在测试时可以轻松地模拟这些依赖对象,而不需要实际创建整个应用程序的环境。例如,对于一个使用了 Spring 的服务类进行单元测试,可以使用模拟框架(如 Mockito)创建一个模拟的 DAO 对象,并将其注入到服务类中。这样就可以独立地测试服务类的功能,而不依赖于实际的数据库访问等外部资源。这种可测试性提高了开发效率,保证了代码的质量。

(三)可维护性

Bean 的管理方式使得应用程序的维护更加简单。当应用程序的功能需要修改或扩展时,只需要修改相应的 Bean 的配置或代码,而不会影响到其他部分的功能。例如,如果需要添加一个新的业务逻辑模块,只需要创建新的 Bean,并在配置文件中进行适当的配置,就可以将其集成到应用程序中。同时,Spring 提供了丰富的注解和配置选项,可以方便地对 Bean 的生命周期、属性等进行管理,进一步提高了可维护性。

(四)可扩展性

Spring 的 Bean 管理机制为应用程序的扩展提供了良好的支持。通过使用 Bean 的继承、组合等方式,可以轻松地扩展现有 Bean 的功能。例如,可以创建一个新的 Bean,继承自一个现有的 Bean,并在新的 Bean 中添加额外的功能。或者,可以将多个 Bean 组合成一个更复杂的 Bean,以满足特定的业务需求。此外,Spring 还支持自定义 BeanPostProcessor 和 BeanFactoryPostProcessor 等扩展点,可以在 Bean 的创建和初始化过程中进行自定义的处理,进一步增强了应用程序的可扩展性。

总之,Bean 在 Spring 核心容器中发挥着重要的作用,具有松耦合、可测试性、可维护性和可扩展性等优势,为 Java 应用程序的开发带来了极大的便利。

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

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

相关文章

基于卷积神经网络的航空发动机剩余寿命预测Matlab实现

本文利用NASA提供的涡扇发动机退化数据集&#xff0c;进行数据预处理&#xff0c;构建训练样本和测试样本&#xff0c;然后搭建卷积神经网络&#xff08;Convolutional Neural Network,CNN&#xff09;&#xff0c;学习训练数据&#xff0c;最后利用测试数据&#xff0c;分析神…

day02(单片机高级)单片机控制ESP8266连接阿里云

目录 单片机控制ESP8266连接阿里云物联平台 MQTT协议简介 订阅和发布 cJSON简介 云平台搭建 注册和登录 实例的开通和创建 产品和设备的创建 创建产品 添加设备 功能定义 发布上线 MQTTFX工具使用 发布和订阅 订阅 发布 MQTT固件烧录 AT指令验证 调试验证订阅 单片机控制ESP826…

社交电商的优势及其与 AI 智能名片小程序、S2B2C 商城系统的融合发展

摘要&#xff1a;本文深入分析了社交电商相较于传统电商的优势&#xff0c;包括门槛低、易操作、更生活化和可团队化运作等特点。同时&#xff0c;探讨了 AI 智能名片小程序和 S2B2C 商城系统在社交电商发展中的作用&#xff0c;以及它们与社交电商融合所带来的新机遇和发展前景…

uni-app快速入门(八)--常用内置组件(上)

uni-app提供了一套基础组件&#xff0c;类似HTML里的标签元素&#xff0c;不推荐在uni-app中使用使用div等HTML标签。在uni-app中&#xff0c;对应<div>的标签是view&#xff0c;对应<span>的是text&#xff0c;对应<a>的是navigator&#xff0c;常用uni-app…

Jmeter的后置处理器(二)

5--JSR223 PostProcessor 功能特点 自定义后处理逻辑&#xff1a;使用脚本语言编写自定义的后处理逻辑。支持多种脚本语言&#xff1a;支持 Groovy、JavaScript、BeanShell 等脚本语言。动态参数传递&#xff1a;将提取的数据存储为变量&#xff0c;供后续请求使用。灵活性高…

基于SpringBoot3+mybatis搭建的历史上的今天API接口服务 及 Mybatis 应该有个更好的方法来隐藏 Pojo 类中的字段

一、Mybatis有没有比较好的方法隐藏 Pojo 类中的字段 使用 Mybatis 时&#xff0c;为了实现通用的CURD&#xff0c;在定义实体类pojo时&#xff0c;会尽量将能用得上的数据库字段都定义到 pojo中&#xff0c;但是在查询的时候却有不一样的需求。mybatis的文档地址链接&#xff…

SLAM-evo 评估

文章目录 1.evo介绍1.1.evo安装1.1.2.evo的安装(evo共有两种安装方式)1.1.2.1.采用pip安装&#xff0c;直接安装最新的稳定发行版&#xff08;在翻墙的情况下可以使用&#xff09;将路径添加到系统 PATH 中1.1.2.2.源码安装 &#xff0c;下载源码进行安装&#xff08;必须翻墙&…

【机器学习chp3】判别式分类器:线性判别函数、线性分类器、广义线性分类器、分段线性分类器

前言&#xff1a; 本文遗留问题&#xff1a;&#xff08;1&#xff09;对最小平方误差分类器的理解不清晰.&#xff08;2&#xff09;分段线性判别函数的局部训练法理解不清晰。 推荐文章1&#xff0c;其中有关于感知机的分析 【王木头从感知机到神经网络】-CSDN博客 推荐文…

04 搭建linux驱动开发环境

虽然 petalinux 功能很全面&#xff0c;但是其编译速度较慢&#xff0c;不适用于驱动调试阶段&#xff08;因为驱动调试阶段会频繁修改驱动模块、内核、设备树等&#xff09;&#xff0c;因此本章将采用分步编译的方式来编译启动开发板所需要的各种镜像文件&#xff0c;虽然步骤…

Linux性能优化之火焰图的起源

Linux火焰图的起源与性能优化专家 Brendan Gregg 密切相关&#xff0c;他在 2011 年首次提出这一工具&#xff0c;用于解决性能分析过程中可视化和数据解读的难题。 1. 背景&#xff1a;性能优化的需求 在现代计算中&#xff0c;性能优化往往需要对程序执行中的热点和瓶颈进行…

半桥驱动芯片调试中的问题

结论&#xff1a;低于12V的场景应用分立的MOS驱动电路压根不合适&#xff0c;选用集成桥臂的芯片合适。 HIN的输入电平不能是长时间的高电平&#xff0c;否则自举电容没法充放电从而没办法自举升压&#xff0c;上管无法控制&#xff1a; 电容C2的容值应该尽可能大&#xff…

【C++】类和对象-深度剖析默认成员函数-上

> &#x1f343; 本系列为初阶C的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:[小编的个人主页])小编的个人主页 > &#x1f380; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 > ✌️ &#x1f91e; &#x1…

RabbitMQ黑马笔记

目录 1.初识MQ 1.1.同步和异步通讯 1.1.1.同步通讯 1.1.2.异步通讯 1.2.技术对比&#xff1a; 2.快速入门 2.1.安装RabbitMQ 2.2.RabbitMQ消息模型 2.3.导入Demo工程 2.4.入门案例 2.4.1.publisher实现 2.4.2.consumer实现 2.5.总结 3.SpringAMQP 3.1.Basic Queu…

麒麟KylinServer的网站,并部署一套主从DNS服务器提供域名解析服务

一、KylinServer网站搭建 ifconfig Copy 注意:根据实际网卡设备名称情况调整代码!不同环境下网卡名称略有不同! 获取本机IP地址,记住IP地址用于之后的配置填写。 ifconfig enp0s2 Copy 下载nginx源码包,并解压缩 wget http://10.44.16.102:60000/allfiles/Kylin/ng…

解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件

勾选Auto-detect proxy setting并填入 https://plugins.jetbrains.com 代理URL&#xff0c;可以先做检查连接&#xff1a;

AWTK-WIDGET-WEB-VIEW 发布

awtk-widget-web-view 是通过 webview 提供的接口&#xff0c;实现的 AWTK 自定义控件&#xff0c;使得 AWTK 可以方便的显示 web 页面。 项目网址&#xff1a; https://gitee.com/zlgopen/awtk-widget-web-view webview 提供了一个跨平台的 webview 接口&#xff0c;是一个非…

Pandas教程之Pandas 简介

Pandas 简介 接下来一段时间&#xff0c;我会持续发布并完成Pandas教程 Pandas 是一个功能强大的开源 Python 库。Pandas 库用于数据操作和分析。Pandas 由数据结构和函数组成&#xff0c;可对数据执行有效的操作。 本免费教程将概述 Pandas&#xff0c;涵盖 Python Pandas 的基…

【linux】网络基础 ---- 数据链路层

用于两个设备(同一种数据链路节点)之间进行传递 数据链路层解决的问题是&#xff1a;直接相连的主机之间&#xff0c;进行数据交付 1. 认识以太网 "以太网" 不是一种具体的网络, 而是一种技术标准&#xff1a; 既包含了数据链路层的内容, 也包含了一些物理层的内容…

i春秋-FUZZ(python模板注入、base64编码命令执行)

练习平台地址 竞赛中心 题目描述 题目内容 很直接就是要fuzz参数 参数字典 dpaste/eH2Z1 (Plain Text) BP爆破参数 发现存在name参数 尝试sql注入 发现输入啥就回显啥&#xff0c;猜测是模板注入 测试是不是模板注入 虽然9*9没有被执行&#xff0c;但是config执行了&#…

另外一种缓冲式图片组件的用法

文章目录 1. 概念介绍2. 使用方法2.1 基本用法2.2 缓冲原理3. 示例代码4. 内容总结我们在上一章回中介绍了"FadeInImage组件"相关的内容,本章回中将介绍CachedNetworkImage组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的CachedNetwo…