如何在Gatling仿真中使用Spring Boot Bean?
在Gatling仿真类中使用Spring Bean的解决方案
问题分析
Gatling的Simulation类由自身测试引擎实例化,完全脱离Spring容器的管理流程,所以直接用@Autowired注解无法完成依赖注入——Spring根本没机会处理这个类的实例,自然没法注入Bean。硬编码能正常运行也验证了这一点:问题核心就是Spring容器未参与Simulation对象的创建。
解决方案
通过手动初始化Spring上下文,从容器中主动获取所需Bean,替代自动注入的方式。具体步骤如下:
- 创建Spring上下文工具类:用于全局初始化和获取Spring容器实例,确保上下文只被初始化一次。
- 在Simulation类中手动加载上下文并获取Bean:在Simulation的构造方法或静态块中完成上下文初始化,再提取需要的Bean。
代码示例
1. Spring上下文工具类
import org.springframework.boot.SpringApplication; import org.springframework.context.ApplicationContext; public class SpringContextHolder { private static volatile ApplicationContext context; public static void initContext(Class<?> springBootApplicationClass) { if (context == null) { synchronized (SpringContextHolder.class) { if (context == null) { context = SpringApplication.run(springBootApplicationClass); } } } } public static <T> T getBean(Class<T> beanClass) { return context.getBean(beanClass); } }
2. 修改后的Simulation类
public class MySimulation extends Simulation { private JMSConnectionFactoryBeanClass myConnectionFactory; public MySimulation() { // 传入你的Spring Boot启动类,初始化上下文 SpringContextHolder.initContext(YourSpringBootApp.class); // 从容器中获取Bean myConnectionFactory = SpringContextHolder.getBean(JMSConnectionFactoryBeanClass.class); JmsProtocolBuilder jmsProtocol = jms.connectionFactory(myConnectionFactory); ScenarioBuilder scn = scenario("My Simulation Scenario") .exec( jms("test") .send() .queue("myQueue") .textMessage("message") ); setUp( scn.injectOpen(rampUsers(10).during(5)) ).protocols(jmsProtocol); } }
注意事项
- 确保你的Spring Boot启动类(带有
@SpringBootApplication的类)能扫描到JMSConnectionFactoryBeanClass所在的包,否则容器无法创建对应的Bean。 - 构建工具(Maven/Gradle)配置中,要确保Spring相关依赖(包括Spring Boot Starter、JMS相关依赖等)被包含在Gatling的运行时classpath中。比如Gradle中,需要在
gatling配置块中引入这些依赖。 - 上下文初始化用了双重校验锁,确保多线程环境下只初始化一次,避免重复启动Spring应用带来的资源浪费。
内容的提问来源于stack exchange,提问作者Simon E.
相关产品推荐
相关产品推荐

