当前位置: 首页 > news >正文

Spring中除DI之外获取 BEAN 的方式​

前言

在 Spring 框架的开发实践中,获取 Bean 是极为重要的基础操作。我们熟知通过依赖注入能便捷地获取 Bean,不过在许多场景下,还需要借助其他方式来获取 Bean。本文将深入探讨在 Spring 中除了依赖注入之外获取 Bean 的多种方式,并结合实际代码示例进行详细讲解。

一、ApplicationContext 获取 Bean​

1.1 ApplicationContext 简介​

ApplicationContext 是 BeanFactory 的子接口,它为开发者提供了更为丰富的功能支持,涵盖国际化、资源访问以及事件传播等方面。在日常开发工作里,ApplicationContext 是使用最为广泛的 Spring 容器。常见的 ApplicationContext 实现类包括 ClassPathXmlApplicationContext(用于加载类路径下的 XML 配置文件)、FileSystemXmlApplicationContext(用于加载文件系统中的 XML 配置文件)以及 AnnotationConfigApplicationContext(用于加载基于注解的配置类)。​

1.2 使用 ClassPathXmlApplicationContext 获取 Bean​

假设我们有一个简单的 Spring 项目,其中包含一个 UserService 类,通过 XML 配置文件将其注册为 Bean。​

先定义 UserService 类:

public class UserService {public void sayHello() {System.out.println("Hello from UserService!");}
}

接着在 Spring 的 XML 配置文件(如 applicationContext.xml)中配置 UserService:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="userService" class="com.example.service.UserService"/>
</beans>

然后通过 ClassPathXmlApplicationContext 来获取 UserService 的 Bean 实例:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = (UserService) applicationContext.getBean("userService");userService.sayHello();}
}

在这段代码中,首先创建了一个 ClassPathXmlApplicationContext 对象,并加载了 applicationContext.xml 配置文件。随后,调用 applicationContext.getBean ("userService") 方法,依据 Bean 的 id 从容器中获取了 UserService 的实例,进而调用了其 sayHello 方法。

1.3 使用 AnnotationConfigApplicationContext 获取 Bean​

当项目采用基于注解的配置方式时,可以利用 AnnotationConfigApplicationContext 来获取 Bean。​

先定义一个配置类,以此替代 XML 配置文件:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic UserService userService() {return new UserService();}
}

接着通过 AnnotationConfigApplicationContext 来获取 UserService 的 Bean 实例:

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {public static void main(String[] args) {ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);UserService userService = applicationContext.getBean(UserService.class);userService.sayHello();}
}

这里创建了一个 AnnotationConfigApplicationContext 对象,并传入了配置类 AppConfig.class。通过 applicationContext.getBean (UserService.class) 方法,依据 Bean 的类型从容器中获取了 UserService 的实例。

1.4 applicationContext.getBean () 的更多使用方式​

按类型获取多个 Bean:若容器中有多个同一类型的 Bean,可以使用applicationContext.getBeansOfType(Class<T> type)方法获取一个 Map,其中键为 Bean 的名称,值为对应的 Bean 实例。例如:

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.util.Map;public class Main {public static void main(String[] args) {ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);Map<String, UserService> userServiceMap = applicationContext.getBeansOfType(UserService.class);userServiceMap.forEach((name, service) -> service.sayHello());}
}

通过名称和类型获取 Bean:可以使用applicationContext.getBean(String name, Class<T> requiredType)方法,同时指定 Bean 的名称和类型来获取 Bean,这样能确保获取到的 Bean 类型准确无误,避免类型转换异常。例如:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = applicationContext.getBean("userService", UserService.class);userService.sayHello();}
}

通过 BeanFactoryPostProcessor 获取 Bean 定义:​

BeanFactoryPostProcessor 允许我们在容器实例化 Bean 之前,对 Bean 的定义(BeanDefinition)进行修改。我们也可以利用它来获取 Bean 定义相关信息。首先定义一个实现了 BeanFactoryPostProcessor 接口的类:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {BeanDefinition userServiceDefinition = beanFactory.getBeanDefinition("userService");// 可以在这里对BeanDefinition进行操作,比如修改属性等System.out.println("获取到UserService的BeanDefinition,类名为:" + userServiceDefinition.getBeanClassName());}
}

然后在配置文件中注册这个 BeanFactoryPostProcessor:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="userService" class="com.example.service.UserService"/><bean class="com.example.config.CustomBeanFactoryPostProcessor"/>
</beans>

当 Spring 容器启动时,会调用 CustomBeanFactoryPostProcessor 的 postProcessBeanFactory 方法,从而获取到 UserService 的 BeanDefinition。

二、BeanFactory 获取 Bean​

2.1 BeanFactory 简介​

BeanFactory 是 Spring 框架中最基础的容器接口,它定义了 IOC 容器的基本功能规范,例如 Bean 的加载、实例化、获取等操作。尽管其功能相对简单,但却是 ApplicationContext 的基础。理解 BeanFactory 对于深入掌握 Spring 的 IOC 机制具有至关重要的意义。常见的 BeanFactory 实现类曾经是 XmlBeanFactory,但从 Spring 3.1 开始,XmlBeanFactory 已被废弃,如今推荐使用 DefaultListableBeanFactory。​

2.2 使用 DefaultListableBeanFactory 获取 Bean​

同样以 UserService 为例,假设使用 DefaultListableBeanFactory 来获取 Bean。​

首先创建一个 BeanDefinition 对象,用于定义 UserService 的 Bean 信息:

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;public class Main {public static void main(String[] args) {DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(UserService.class).getBeanDefinition();beanFactory.registerBeanDefinition("userService", beanDefinition);UserService userService = (UserService) beanFactory.getBean("userService");userService.sayHello();}
}

在这段代码中,先创建了一个 DefaultListableBeanFactory 对象。接着,通过 BeanDefinitionBuilder 创建了一个 BeanDefinition 对象,用于描述 UserService 的 Bean 信息。随后,使用 beanFactory.registerBeanDefinition ("userService", beanDefinition) 方法将 UserService 的 Bean 定义注册到容器中。最后,通过 beanFactory.getBean ("userService") 方法从容器中获取 UserService 的实例。

2.3 BeanFactory 获取 Bean 的特点

延迟加载:只有在调用 getBean 方法获取 Bean 时,才会实例化该 Bean,这种特性适合对资源消耗较大、使用频率较低的 Bean。

轻量级:与 ApplicationContext 相比,BeanFactory 的功能较为简单,资源占用少,适用于对功能要求不高的轻量级应用场景或者特定的底层框架开发。

三、在 Web 项目中高效使用这些容器获取 Bean​

3.1 在 Servlet 环境中使用 ApplicationContext 获取 Bean​

在基于 Servlet 的 Web 项目中,可以通过实现 ServletContextListener 接口来获取 ApplicationContext。首先在 web.xml 中配置 ContextLoaderListener:

<context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

然后在 Servlet 中获取 ApplicationContext 并获取 Bean:

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import java.io.IOException;public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext = getServletContext();WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);UserService userService = applicationContext.getBean(UserService.class);userService.sayHello();response.getWriter().println("Hello from Servlet with UserService");}
}

通过这种方式,在 Servlet 中就能高效地获取到 Spring 容器中的 Bean。

3.2 在 Spring MVC 项目中使用 ApplicationContext 获取 Bean​

在 Spring MVC 项目中,通常已经配置好了 ApplicationContext。可以通过 @Autowired 注解直接将 Bean 注入到 Controller 中,这种方式极为便捷高效。例如:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class MyController {@Autowiredprivate UserService userService;@GetMapping("/hello")@ResponseBodypublic String hello() {userService.sayHello();return "Hello from Controller with UserService";}
}

通过这种方式,Spring MVC 会自动从 ApplicationContext 中获取对应的 Bean 并注入,大大减少了手动获取 Bean 的繁琐过程。但这属于依赖注入方式,这里仅作对比说明。在 Spring MVC 中不通过注入获取 Bean 的话,也可以在 Controller 中通过如下方式获取:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class MyController {@Autowiredprivate ApplicationContext applicationContext;@GetMapping("/hello")@ResponseBodypublic String hello() {UserService userService = applicationContext.getBean(UserService.class);userService.sayHello();return "Hello from Controller with UserService";}
}

通过将 ApplicationContext 注入到 Controller,进而可以获取容器中的 Bean。

3.3 在 Web 项目中使用 BeanFactory 获取 Bean​

在 Web 项目中使用 BeanFactory 获取 Bean 的情况相对较少,但在一些特定场景下仍有应用。可以通过创建一个自定义的 ServletContextListener,在其中初始化 DefaultListableBeanFactory,并注册 BeanDefinition。例如:

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.web.context.ServletContextAware;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;@WebListener
public class BeanFactoryInitializer implements ServletContextListener, ServletContextAware {private ServletContext servletContext;@Overridepublic void contextInitialized(ServletContextEvent sce) {DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(UserService.class).getBeanDefinition();beanFactory.registerBeanDefinition("userService", beanDefinition);servletContext.setAttribute("beanFactory", beanFactory);}@Overridepublic void contextDestroyed(ServletContextEvent sce) {}@Overridepublic void setServletContext(ServletContext servletContext) {this.servletContext = servletContext;}
}

然后在 Servlet 中获取 BeanFactory 并获取 Bean:

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import java.io.IOException;public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext = getServletContext();DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) servletContext.getAttribute("beanFactory");UserService userService = (UserService) beanFactory.getBean("userService");userService.sayHello();response.getWriter().println("Hello from Servlet with UserService from BeanFactory");}
}

不过,这种方式相对复杂,并且在 Web 项目中,ApplicationContext 通常能更好地满足需求,所以 BeanFactory 在 Web 项目中的使用相对受限。

3.4 在测试类中获取 Bean​

在进行单元测试或者集成测试时,我们也经常需要获取 Bean 来进行相关功能的测试。以 JUnit 和 Spring Boot 的测试为例:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.assertNotNull;@SpringBootTest
public class UserServiceTest {@Autowiredprivate ApplicationContext applicationContext;@Testpublic void testGetBean() {UserService userService = applicationContext.getBean(UserService.class);assertNotNull(userService);userService.sayHello();}
}

在这个测试类中,通过 @SpringBootTest 注解启动 Spring 应用上下文,然后将 ApplicationContext 注入到测试类中,进而可以获取到 UserService 的 Bean 实例并进行测试。这种方式在测试场景下为我们验证 Bean 的功能提供了便利。

四、ApplicationContext 与 BeanFactory 获取 Bean 的对比​

实例化时机:ApplicationContext 在容器启动时会实例化所有单例 Bean,而 BeanFactory 是在调用 getBean 方法时才实例化 Bean。​

功能丰富度:ApplicationContext 提供了更多的功能,如国际化、资源访问、事件发布等,而 BeanFactory 主要专注于 Bean 的基本管理功能。​

应用场景:ApplicationContext 适用于大多数企业级应用场景,尤其是对功能完整性要求较高的项目;BeanFactory 则适用于对资源消耗敏感、功能需求简单的轻量级应用或特定的底层框架开发。​

五、其他获取 Bean 的方式

5.1 使用 BeanLocatorFactoryBean

BeanLocatorFactoryBean是 Spring 提供的一个特殊的工厂 Bean,它可以通过指定的名称从当前或父容器中获取 Bean。首先,在配置文件中定义BeanLocatorFactoryBean:

<bean id="beanLocator" class="org.springframework.beans.factory.config.BeanLocatorFactoryBean"><property name="mappedName" value="userService"/>
</bean>

然后,在代码中获取beanLocator,实际上它返回的就是userService的 Bean 实例:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = (UserService) applicationContext.getBean("beanLocator");userService.sayHello();}
}

5.2 使用 ObjectFactory 接口​

ObjectFactory接口提供了一种延迟获取 Bean 的方式,特别适用于那些创建成本较高且可能不一定需要使用的 Bean。定义一个ObjectFactory:

import org.springframework.beans.factory.ObjectFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic ObjectFactory<UserService> userServiceObjectFactory() {return () -> new UserService();}
}

在需要使用UserService的地方,通过注入ObjectFactory<UserService>来获取 Bean 实例,只有在调用getObject()方法时才会创建 Bean:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class AnotherService {private final ObjectFactory<UserService> userServiceObjectFactory;@Autowiredpublic AnotherService(ObjectFactory<UserService> userServiceObjectFactory) {this.userServiceObjectFactory = userServiceObjectFactory;}public void doSomething() {UserService userService = userServiceObjectFactory.getObject();userService.sayHello();}
}

3.3 使用 BeanFactoryAware 和 ApplicationContextAware 接口​

实现BeanFactoryAware接口可以让一个 Bean 获取到所在的BeanFactory,从而通过BeanFactory来获取其他 Bean。同样,实现ApplicationContextAware接口可以获取到ApplicationContext。​

先定义一个实现BeanFactoryAware接口的类:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.stereotype.Component;@Component
public class BeanFactoryAwareComponent implements BeanFactoryAware {private BeanFactory beanFactory;@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {this.beanFactory = beanFactory;}public void doSomething() {UserService userService = (UserService) beanFactory.getBean("userService");userService.sayHello();}
}

再定义一个实现ApplicationContextAware接口的类:

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;@Component
public class ApplicationContextAwareComponent implements ApplicationContextAware {private ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}public void doSomething() {UserService userService = applicationContext.getBean(UserService.class);userService.sayHello();}
}

通过实现这些接口,在 Bean 初始化时 Spring 会自动注入对应的BeanFactory或ApplicationContext,方便在类内部获取其他 Bean。

六、总结​

在 Spring 开发过程中,除了依赖注入这种常用方式外,ApplicationContext 和 BeanFactory 为我们提供了多种获取 Bean 的有效途径。ApplicationContext 凭借其丰富的功能和强大的特性,在众多场景中发挥着重要作用。而 BeanFactory 的延迟加载和轻量级特性,也在特定场景下展现出独特优势。此外,在 Web 项目以及测试场景中,我们也有相应的方式高效获取 Bean。开发者应根据项目的实际需求,合理选择合适的方式来获取 Bean,从而实现高效、稳定的应用开发。通过本文的详细讲解,希望能帮助大家更好地理解和掌握 Spring 中除注入外获取 Bean 的多种关键方式。​

相关文章:

Spring中除DI之外获取 BEAN 的方式​

前言 在 Spring 框架的开发实践中&#xff0c;获取 Bean 是极为重要的基础操作。我们熟知通过依赖注入能便捷地获取 Bean&#xff0c;不过在许多场景下&#xff0c;还需要借助其他方式来获取 Bean。本文将深入探讨在 Spring 中除了依赖注入之外获取 Bean 的多种方式&#xff0c…...

屎上雕花系列-2nd

以下为“屎上雕花”的尝试2nd 使用Deepseek扩容而来&#xff0c;我竟然没有找到明显的错误&#xff0c;太强大了&#xff0c;工作改变生活了 LeCroy 以太网与 SAN 网络测试解决方案 硬件平台一&#xff1a;Xena 以太网流量生成器 Xena 以太网流量生成器是一款高性能的网络测…...

第十五章,SSL VPN

前言 IPSec 和 SSL 对比 IPSec远程接入场景---client提前安装软件&#xff0c;存在一定的兼容性问题 IPSec协议只能够对感兴趣的流量进行加密保护&#xff0c;意味着接入用户需要不停的调整策略&#xff0c;来适应IPSec隧道 IPSec协议对用户访问权限颗粒度划分的不够详细&…...

第四天 从CAN总线到Spark/Flink实时处理

前言 在智能网联汽车快速发展的今天&#xff0c;每辆汽车每天产生的数据量高达数GB。这些数据蕴藏着驾驶行为、车辆健康、道路状况等宝贵信息。本文将带您从零开始&#xff0c;系统学习车辆数据采集与分析的全流程技术体系&#xff0c;包含&#xff1a; CAN总线数据解析与采集…...

pandas中的数据聚合函数:`pivot_table` 和 `groupby`有啥不同?

pivot_table 和 groupby 是 pandas 中两种常用的数据聚合方法&#xff0c;它们都能实现数据分组和汇总&#xff0c;但在使用方式和输出结构上有显著区别。 0. 基本介绍 groupby分组聚合 groupby 是 Pandas 库中的一个功能强大的方法&#xff0c;用于根据一个或多个列对数据进…...

AI客服问答自动生成文章(基于deepseek实现)

小编一直在用AI做网站平台文章的润色或者二创。一直有一个想法&#xff0c;在自己网站加一个AI智能客服&#xff0c;通过文心或者deepseek来智能回答网友提出的问题&#xff0c;这样就能减少很多人工回复的麻烦&#xff0c;提高互动效率。 开发背景 其实很多网友提出的问题非…...

镜头内常见的马达类型(私人笔记)

① 螺杆式马达 驱动来源&#xff1a;机身内马达。镜头尾部有一个接收“螺杆”的接口&#xff0c;通过机械传动带动镜头对焦组。缺点&#xff1a;慢、吵、不能用于无机身马达的相机。✅ 典型镜头&#xff1a;尼康 AF、AF-D 系列&#xff1b;美能达老镜头。尼康传统的AF镜头通过…...

从 JMS 到 ActiveMQ:API 设计与扩展机制分析(一)

引言 在当今的分布式系统开发中&#xff0c;消息中间件扮演着举足轻重的角色&#xff0c;它为应用程序之间提供了可靠的异步通信机制。JMS&#xff08;Java Message Service&#xff09;作为 Java 平台上的消息服务规范&#xff0c;定义了一套通用的 API&#xff0c;使得开发者…...

第J7周:ResNeXt解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框 架: Tensorflow &#xff08;二&#xff09;具体…...

机器学习-无量纲化与特征降维(一)

一.无量纲化-预处理 无量纲&#xff0c;即没有单位的数据 无量纲化包括"归一化"和"标准化"&#xff0c;这样做有什么用呢&#xff1f;假设用欧式距离计算一个公司员工之间的差距&#xff0c;有身高&#xff08;m&#xff09;、体重&#xff08;kg&#x…...

Shiro(八):JWT介绍

1、什么是JWT&#xff1f; JWT&#xff08;JSON Web Token&#xff0c;JSON Web令牌&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络应 用环境间安全地传递声明&#xff08;claims&#xff09;作为JSON对象&#xff1b;JWT会按指定的加密算…...

linux0.11内核源码修仙传第十六章——获取硬盘信息

&#x1f680; 前言 书接第十四章&#xff1a;linux0.11内核源码修仙传第十四章——进程调度之fork函数&#xff0c;在这一节博客中已经通过fork进程创建了一个新的进程1&#xff0c;并且可以被调度&#xff0c;接下来接着主线继续走下去。希望各位给个三连&#xff0c;拜托啦&…...

画家沈燕的山水实验:在传统皴法里植入时代密码

导语&#xff1a;当宋代山水遇上AI算法&#xff0c;当青绿颜料邂逅生态数据&#xff0c;沈燕在宣纸与人工智能的交界处&#xff0c;开启了一场关于水墨基因的“基因突变”实验。她的画笔既似考古学家的洛阳铲&#xff0c;又似未来学家的扫描仪&#xff0c;在古今对话中重构山水…...

聊聊四种实时通信技术:短轮询、长轮询、WebSocket 和 SSE

这篇文章&#xff0c;我们聊聊 四种实时通信技术&#xff1a;短轮询、长轮询、WebSocket 和 SSE 。 1 短轮询 浏览器 定时&#xff08;如每秒&#xff09;向服务器发送 HTTP 请求&#xff0c;服务器立即返回当前数据&#xff08;无论是否有更新&#xff09;。 优点&#xff1…...

国联股份卫多多与北京经纬智诚签署战略合作协议

5月9日&#xff0c;北京经纬智诚电子商务有限公司&#xff08;以下简称“经纬智诚”&#xff09;总经理王学文一行到访国联股份卫多多&#xff0c;同卫多多/纸多多副总裁、产发部总经理段任飞&#xff0c;卫多多机器人产业链总经理郭碧波展开深入交流&#xff0c;双方就未来合作…...

在 Envoy 的配置文件中出现的 “@type“ 字段

在 Envoy 的配置文件中出现的 "type" 字段是 Protocol Buffers&#xff08;Protobuf&#xff09;的 JSON/YAML 编码规范的一部分&#xff0c;属于 Typed Struct 的表示方式。它的作用是明确指定当前配置对象的 Protobuf 类型&#xff0c;以便 Envoy 正确解析配置。以…...

编译原理实验 之 语法分析程序自动生成工具Yacc实验

文章目录 实验环境准备复现实验例子分析总的文件架构实验任务 什么是Yacc Yacc(Yet Another Compiler Compiler)是一个语法分析程序自动生成工具&#xff0c;Yacc实验通常是在编译原理相关课程中进行的实践项目&#xff0c;旨在让学生深入理解编译器的语法分析阶段以及掌握Yac…...

【大模型】LLM概念相关问题(上)

1.主流的大语言模型 截至2025年&#xff0c;主流的大型语言模型&#xff08;LLM&#xff09;体系涵盖了多个国家和机构的成果&#xff0c;具有多样的架构设计、参数规模和应用场景。以下是一些具有代表性的开源和闭源 LLM 体系&#xff1a; &#x1f1fa;&#x1f1f8; OpenA…...

AWS IoT Core与MSK集成实战:打造高可靠实时IoT数据管道

在物联网快速发展的今天,如何高效、安全地处理海量设备数据成为企业面临的一大挑战。本文将带您深入探索AWS IoT Core与Amazon MSK(Managed Streaming for Apache Kafka)的集成方案,手把手教您搭建一个可靠、可扩展的实时IoT数据处理管道。无论您是IoT开发者、大数据工程师还是…...

智慧交通-车门开关状态检测数据集VOC+YOLO格式1006张2类

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1006 标注数量(xml文件个数)&#xff1a;1006 标注数量(txt文件个数)&#xff1a;1006 …...

【传感器】代码——DHT11温湿度传感器

目录 一、代码流程 二、模块.c代码 三、模块.h代码 四、主函数代码 一、代码流程 1.模块复位&#xff1a;主机发送开始通信时序&#xff0c;从机做出响应&#xff08;需检测是否有响应&#xff09; 2.MCU读取1Bit数据 3.MCU读取1Byte数据 4.MCU读取8Byte数据组成完整Dat…...

MySQL 的事务(Transaction)

1. 什么是事务&#xff1f;​​ 事务是​​一组原子性的数据库操作序列​​&#xff0c;这些操作要么​​全部执行成功​​&#xff0c;要么​​全部失败回滚​​。事务的目的是确保数据库从一个一致状态转换到另一个一致状态&#xff0c;即使在执行过程中发生错误或中断。 ​…...

vue知识点总结 依赖注入 动态组件 异步加载

一 依赖注入 使用场景&#xff1a;当需要多层组件需要传值 如 祖宗-》父亲-》儿子-》孙子如祖宗的数据需要直接传给孙子 在祖宗组件中写&#xff1a; data(){return {}} provide(){ return {shujukey:数据值 } }在孙子组件中接收,模板代码中直接使用{{shujukey}}获取数据 dat…...

【软件设计师:存储】16.计算机存储系统

一、主存储器 存储器是计算机系统中的记忆设备,用来存放程序和数据。 计算机中全部信息,包括输入的原始数据、计算机程序、中间运 行结果和最终运行结果都保存在存储器中。 存储器分为: 寄存器Cache(高速缓冲存储器)主存储器辅存储器一、存储器的存取方式 二、存储器的性…...

快速开发-基于gin的中间件web项目开发

一、概述 在 Gin 框架中&#xff0c;中间件&#xff08;Middleware&#xff09;是一种在处理 HTTP 请求之前或之后执行的函数。使用中间件可以方便地实现诸如身份验证&#xff08;Auth&#xff09;、日志记录、请求限流等功能。 二、编写中间件 // 中间件 func StartCost1(c …...

耀圣-气动带刮刀硬密封法兰球阀:攻克颗粒高粘度介质的自清洁 “利器”

气动带刮刀硬密封法兰球阀&#xff1a;攻克颗粒高粘度介质的自清洁 “利器” 在化工、矿业、食品加工等行业中&#xff0c;带颗粒高粘度介质、料浆及高腐蚀性介质的输送与控制一直是行业难题。普通阀门极易因介质附着、颗粒堆积导致卡阻失效&#xff0c;密封面磨损加剧&#x…...

MySQL + Elasticsearch:为什么要使用ES,使用场景与架构设计详解

MySQL Elasticsearch&#xff1a;为什么要使用ES&#xff0c;使用场景与架构设计详解 前言一、MySQL Elasticsearch的背景与需求1.1 为什么要使用Elasticsearch&#xff08;ES&#xff09;&#xff1f;1.2 为什么MySQL在某些场景下不足以满足需求&#xff1f;1.3 MySQL Elas…...

【C语言】--指针超详解(三)

目录 一.数组名的理解 二.使用指针访问数组 三.一维数组传参的本质 四.冒泡排序 五.二级指针 六.指针数组 6.1--指针数组的定义 6.2--指针数组模拟二维数组 &#x1f525;个人主页&#xff1a;草莓熊Lotso的个人主页 &#x1f3ac;作者简介&#xff1a;C方向学习者 &…...

污水处理厂逆袭:Ethernet/IP 转 CANopen 开启“智净”时代

在我们的日常生活中&#xff0c;污水处理厂发挥着至关重要的作用&#xff0c;它们处理着城市污水&#xff0c;确保我们的水源安全。然而&#xff0c;这些关键设施的运行和管理并非易事&#xff0c;尤其是在数字化转型的大潮中。现在&#xff0c;我们有了一款创新的解决方案——…...

ROS导航局部路径规划算法

在导航功能包中&#xff0c;局部路径规划器的位置如图红框所示。它接受全局路径规划器生成的全局路径以及里程计信息和局部代价地图&#xff0c;最后输出速度控制信息 一、DWA&#xff08;Dynamic Window Approach&#xff09; 原理介绍 DWA 是一种基于动态窗口采样的局部路…...

《深挖Java中的对象生命周期与垃圾回收机制》

大家好呀&#xff01;&#x1f44b; 今天我们要聊一个Java中超级重要的话题——对象的生命周期和垃圾回收机制。 一、先来认识Java世界的"居民"——对象 &#x1f476; 在Java世界里&#xff0c;一切皆对象。就像现实世界中的人一样&#xff0c;每个Java对象也有自…...

Java——包装类

目录 3.5 包装类 3.5 包装类 有时需要把基本类型转换为对象。所有基本类型都有一个与之对应的类。这些类称为包装器/类。这些类是不可变类&#xff0c;即一旦构造了包装器/类&#xff0c;就不允许改变包装在其中的值。其次包装类还是final&#xff0c;不用可以被继承。 为什么要…...

【谭浩强】第七章第14题

实验结果&#xff1a;当M1时输出的结果 实验总结&#xff1a;用define定义要频繁使用的值可以节省时间&#xff1b;求完一门课平均成绩之后要让sum重新等于0&#xff1b;求最高分对应的学生和对应的课程要循环完一遍覆盖一遍r和c的值&#xff1b; 程序代码 #include <stdi…...

Linux 内核中的 security_sk_free:安全模块与 Socket 释放机制解析

引言 在 Linux 内核中,网络通信和进程间交互(IPC)的核心数据结构之一是 struct sock(即 socket)。其生命周期管理涉及复杂的资源分配与释放逻辑。本文聚焦于 security_sk_free 这一函数,探讨其作用、调用场景以及与安全模块的交互机制,并解答一个常见疑问:在单机间 TC…...

学习笔记:黑马程序员JavaWeb开发教程(2025.4.1)

11.10 案例-配置文件-yml配置文件 Yml语法&#xff1a; 数据格式&#xff1a; 11.11 案例-配置文件-ConfigurationProperties 配置项自动注入&#xff0c;需要保持KEY的属性名一样&#xff0c;需要在文件中加上Data注解&#xff0c;要将这个类交给IOC容器管理&#xff0c;使其成…...

深度学习-161-Dify工具之对比使用工作流和聊天流生成图表可视化的html文件

文章目录 1 任务背景2 使用chatflow聊天流2.1 开始节点2.2 文档提取器2.3 LLM2.4 参数提取器2.5 代码执行2.6 直接回复2.7 应用展示3 生成html文件可视化图表3.1 使用workflow工作流3.1.1 LLM3.1.2 效果展示3.2 使用chatflow聊天流3.2.1 LLM3.2.2 效果展示4 参考附录分别使用聊…...

关于VScode的调试

调试代码要有这么几个工具&#xff1a;源代码、带调试符号的程序、MAP表&#xff0c;调试器。 在启动调试器之前&#xff0c;要首先编译带有符号表的程序&#xff0c;生成对应map。然后启动调试器。 不同的语言有不同的特性&#xff0c;比如解释型语言不需要编译成可执行程序…...

(x ^ 2 + 2y − 1) ^ 3 − x ^ 2 * y ^ 3 = 1

二元高次方程 EquationSolver20250509.java package math;import org.apache.commons.math3.analysis.MultivariateFunction; import org.apache.commons.math3.optim.InitialGuess; import org.apache.commons.math3.optim.MaxEval; import org.apache.commons.math3.optim.P…...

弹窗表单的使用,基于element-ui二次封装

el-dialog-form 介绍 基于element-ui封装的弹窗式表单组件 示例 git地址 https://gitee.com/chenfency/el-dialog-form.git 更新日志 2021-8-12 版本1.0.0 2021-8-17 优化组件&#xff0c;兼容element原组件所有Attributes及Events 2021-9-9 新增tip提示 安装教程 npm install …...

关系模式-无损连接和保持函数依赖的判断

1、怎样判断一个关系模式的分解是否是无损连接&#xff1f; 方法一&#xff1a;公式定理法 关系模式R<U,F>的一个分解具有无损连接的充分必要条件是&#xff1a; 或 方法二&#xff1a;表格法&#xff08;常用与分解成3个及以上关系模式&#xff09; a. 通过立一张j…...

Vmware 最新下载教程和安装教程,外带免下载文件

一、VMware 的简介 VMware 是一款功能强大的桌面虚拟计算机软件&#xff0c;提供用户可在单一的桌面上同时运行不同的操作系统&#xff0c;和进行开发、测试 、部署新的应用程序的最佳解决方案。VMware可在一部实体机器上模拟完整的网络环境&#xff0c;以及可便于携带的虚拟机…...

开平机:从原理到实践的全面技术剖析

一、开平机核心模块技术解析 1. 校平辊系的力学建模与辊型设计 校平机精度核心在于辊系设计&#xff0c;需通过弹塑性力学模型计算变形量。典型校平辊配置参数&#xff1a; 辊径比&#xff1a;校平辊直径&#xff08;D&#xff09;与板材厚度&#xff08;t&#xff09;需满足…...

Edu教育邮箱申请2025年5月

各位好&#xff0c;这里是aigc创意人竹相左边 如你所见&#xff0c;这里是第3部分 现在是选择大学的学科专业 选专业的时候记得考虑一下当前的时间日期。 比如现在是夏天&#xff0c;所以你选秋天入学是合理的。...

文本框碰撞测试

1.核心代码: // 初始化舞台和变量 var stage, textField, bounds, velocity;function init() {// 创建舞台stage = new createjs.Stage("canvas");// 设置矩形边界bounds = {x: 50, y: 50, width: 400, height: 300};// 绘制边界矩形var border = new createjs.Shap…...

LeRobot 项目部署运行逻辑(六)——visualize_dataset_html.py/visualize_dataset.py

可视化脚本包括了两个方法&#xff1a;远程下载 huggingface 上的数据集和使用本地数据集 脚本主要使用两个&#xff1a; 目前来说&#xff0c;ACT 采集训练用的是统一时间长度的数据集&#xff0c;此外&#xff0c;这两个脚本最大的问题在于不能裁剪&#xff0c;这也是比较好…...

Python函数:从基础到进阶的完整指南

在Python编程中&#xff0c;函数是构建高效、可维护代码的核心工具。无论是开发Web应用、数据分析还是人工智能模型&#xff0c;函数都能将复杂逻辑模块化&#xff0c;提升代码复用率与团队协作效率。本文将从函数基础语法出发&#xff0c;深入探讨参数传递机制、高阶特性及最佳…...

图灵爬虫练习平台第七题千山鸟飞绝js逆向

题目七&#xff1a;千山鸟飞绝 还是先进入开发者模式&#xff0c;一进来还是一个无限debugger&#xff0c;直接右键点击一律不在此处停留 然后点击下一页&#xff0c;复制curl进行代码生成&#xff0c;然后就会发现加密内容是headers中的m,ts&#xff0c;还有参数中的x&#xf…...

使用Python和OpenCV实现实时人脸检测与识别

前言 在计算机视觉领域&#xff0c;人脸检测与识别是两个非常重要的任务。人脸检测是指在图像中定位人脸的位置&#xff0c;而人脸识别则是进一步识别出人脸的身份。随着深度学习的发展&#xff0c;这些任务的准确性和效率都有了显著提升。OpenCV是一个开源的计算机视觉库&…...

Excel实现单元格内容拼接

一、应用场景&#xff1a; 场景A&#xff1a;将多个单元格拼接&#xff0c;比如写测试用例时&#xff0c;将多个模块拼接&#xff0c;中间用“-”隔开 场景B&#xff1a;将某单元格内容插入另一单元格固定位置&#xff08;例如在B1中添加A1的内容&#xff09; 二、实际应用&a…...

C语言实现:打印素数、最大公约数

本片博客起源于作者在经历了学校的测试之后猛然发现自己居然忘记了一些比较基础的代码&#xff0c;因此写了本片博客加强记忆 以下算法仅供参考 打印素数 打印&#xff1a;0到200之间所有的素数 #define _CRT_SECURE_NO_WARNINGS#include<stdio.h> #include<math.h&…...