【Spring】Spring容器对象的那些事

【Spring】Spring容器对象的那些事

开篇词:

最近开发时,遇到一个场景,需要运行时获取用户的环境信息,借此跟大家唠唠spring容器对象

附上获取环境信息的代码示例

bash 复制代码
 @Autowired
private ApplicationContext context;

public void printAllBeans() {
    String[] beanNames = context.getBeanDefinitionNames();
    Arrays.stream(beanNames).forEach(System.out::println);
}

public void getEnvironmentProperty() {
    Environment env = context.getEnvironment();
    String value = env.getProperty("xxx.config");
}

干货篇:

一.获取spring容器对象有哪些常用方式

1.实现BeanFactoryAware接口
bash 复制代码
@Service
public  class OrderService implements BeanFactoryAware {
    private BeanFactory beanFactory;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

    public void add() {
        Order order = (Order) beanFactory.getBean("order");
    }
}

实现BeanFactoryAware接口,然后重写setBeanFactory方法,就能从该方法中获取到spring容器对象。

2.实现ApplicationContextAware接口
bash 复制代码
@Service
public  class PersonService2 implements ApplicationContextAware {
    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public void add() {
        Order order = (Order) applicationContext.getBean("order");
    }

}

实现ApplicationContextAware接口,然后重写setApplicationContext方法,也能从该方法中获取到spring容器对象。

3.实现ApplicationListener接口
bash 复制代码
@Service
public  class PersonService3 implements ApplicationListener<ContextRefreshedEvent> {
    private ApplicationContext applicationContext;


    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        applicationContext = event.getApplicationContext();
    }

    public void add() {
        Order order = (Order)applicationContext.getBean("order");
    }

}

需要注意的是,实现ApplicationListener接口,接收的泛型是ContextRefreshedEvent类,然后重写onApplicationEvent方法,也能从该方法中获取到spring容器对象。

Spring的Aware接口是一组特殊的标记接口(空接口),它们本身不包含任何方法,但通过实现这些接口,Spring容器会在初始化Bean时自动注入对应的依赖对象。这种设计模式被称为回调机制,它为Bean提供了与容器底层能力交互的通道,常用于需要突破依赖注入限制或实现容器级功能扩展的场景

二.那还有其他什么场景会用到spring容器对象?

未被spring托管代码,访问spring bean

当部分代码无法被Spring管理(如第三方库的回调类),但需要访问Spring Bean时。

示例:

bash 复制代码
java
public class LegacyCallback implements SomeThirdPartyCallback {
    private ApplicationContext context;

    public LegacyCallback(ApplicationContext context) {
        this.context = context;
    }

    @Override
    public void onEvent() {
        MyService service = context.getBean(MyService.class);
        service.handleEvent();
    }
}
单元测试

在单元测试或集成测试中,手动创建或获取ApplicationContext以模拟容器环境。

示例(使用Spring TestContext框架):

bash 复制代码
java
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = TestConfig.class)
public class MyTest {
    @Autowired
    private ApplicationContext context;

    @Test
    public void testBeanExists() {
        assertTrue(context.containsBean("myService"));
    }
}

手动创建容器(不推荐生产使用):

bash 复制代码
java
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MyService service = context.getBean(MyService.class);

我是杰叔叔,一名沪漂的码农,下期再会!

相关推荐
2601_96387021几秒前
【计算机毕业设计】基于Spring boot+Vue系统的健身俱乐部管理系统的设计与实现
spring boot·后端·课程设计
倔强的石头_1 分钟前
TextIn xParse + WorkBuddy实战,零门槛轻松打造财报解析助手
后端
andongni2039 分钟前
Spring Boot基础应用开发与部署
java·spring boot·后端
lupai14 分钟前
增值税发票 OCR 识别 API 新手接入指南
java·前端·ocr
TELL52115 分钟前
Sonar质量门禁
java
java修仙传19 分钟前
从网页禅道到 AI 能调用的工具:我的禅道 MCP 实现思路分享
java·人工智能·python·ai应用·mcp开发
HAYDENR19 分钟前
依赖数据迁移工具做增量同步有哪些易错点?调整数据迁移工具策略怎么保证断点续传可靠?
java·大数据·数据库
IT利刃出鞘31 分钟前
SpringBoot--解决@Valid放在接口的List上时无效的问题
java·spring
mqiqe35 分钟前
AgentScope Java Harness:2. 上下文压缩:让长期 Agent 永不“失忆“
java·开发语言
梦想的旅途239 分钟前
企业微信API实战:Python自动化消息推送
java·前端·python·自动化·企业微信