Spring Boot获取Bean的三种方式

博客主页: 南来_北往

系列专栏:Spring Boot实战


引言

在Spring Boot中,Bean是一个由Spring IoC容器管理的对象

Spring Bean是在Spring IoC容器中被实例化、组装和管理的对象,可以视为Spring应用的构建块。它通过提供一套丰富的注解和配置方式,极大地简化了Java应用的开发过程,特别是对于依赖注入和AOP等高级特性的支持,使得代码更加简洁且易于维护。

实战

在Spring Boot中,获取Bean的三种常见方式包括通过BeanFactory获取、实现BeanFactoryAware接口获取和通过ApplicationContext获取。具体介绍如下:

1、通过BeanFactory获取:尽管不推荐使用BeanFactory,但在某些情况下,人们可以通过BeanFactory来获取Bean。这种方式较为传统,适用于基于XML配置的较旧项目。需要注意的是,XmlBeanFactory已经被废弃,因为基于注解的配置已经取代了基于XML的配置。

java 复制代码
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.stereotype.Component;

@Component
public class MyBeanFactoryAware implements BeanFactoryAware {
    private BeanFactory beanFactory;

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

    public void doSomething() {
        // 使用beanFactory获取Bean
        MyService myService = (MyService) beanFactory.getBean("myService");
        myService.doSomething();
    }
}

在上面的代码中,我们创建了一个名为MyBeanFactoryAware的类,并实现了BeanFactoryAware接口。在setBeanFactory方法中,我们将传入的BeanFactory实例赋值给成员变量beanFactory。然后,我们可以在doSomething方法中使用beanFactory.getBean()方法来获取需要的Bean实例。

需要注意的是,这种方式并不推荐使用,因为现代的Spring Boot应用通常使用基于注解的配置方式,而不是直接操作BeanFactory。此外,从Spring 5开始,BeanFactory已经被废弃,推荐使用ApplicationContext来代替。

2、通过实现BeanFactoryAware接口:在Java配置类中实现BeanFactoryAware接口,该接口提供一个setBeanFactory方法,允许人们在方法内部直接访问BeanFactory,从而获取所需的Bean。这种方法更为现代,并且可以很好地融入Spring的依赖注入机制。

java 复制代码
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.stereotype.Component;

@Component
public class MyBeanFactoryAware implements BeanFactoryAware {
    private BeanFactory beanFactory;

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

    public void doSomething() {
        // 使用beanFactory获取Bean
        MyService myService = (MyService) beanFactory.getBean("myService");
        myService.doSomething();
    }
}

在上面的代码中,我们创建了一个名为MyBeanFactoryAware的类,并实现了BeanFactoryAware接口。在setBeanFactory方法中,我们将传入的BeanFactory实例赋值给成员变量beanFactory。然后,我们可以在doSomething方法中使用beanFactory.getBean()方法来获取需要的Bean实例。

需要注意的是,这种方式并不推荐使用,因为现代的Spring Boot应用通常使用基于注解的配置方式,而不是直接操作BeanFactory。此外,从Spring 5开始,BeanFactory已经被废弃,推荐使用ApplicationContext来代替。

3、通过ApplicationContext获取:ApplicationContext提供了更全面的框架功能,包括国际化支持和更完善的应用事件体系。在启动类中定义一个静态的ConfigurableApplicationContext变量,通过该变量调用getBean方法即可获得管理的Bean。

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class MyApplicationContextAware implements ApplicationContextAware {
    private ApplicationContext applicationContext;

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

    public void doSomething() {
        // 使用applicationContext获取Bean
        MyService myService = applicationContext.getBean(MyService.class);
        myService.doSomething();
    }
}

在上面的代码中,我们创建了一个名为MyApplicationContextAware的类,并实现了ApplicationContextAware接口。在setApplicationContext方法中,我们将传入的ApplicationContext实例赋值给成员变量applicationContext。然后,我们可以在doSomething方法中使用applicationContext.getBean()方法来获取需要的Bean实例。

需要注意的是,这种方式并不推荐使用,因为现代的Spring Boot应用通常使用基于注解的配置方式,而不是直接操作ApplicationContext。此外,从Spring 5开始,ApplicationContextAware接口已经被废弃,推荐使用@Autowired注解来注入需要的Bean。

总结

这些方式各有优势,选择哪一种取决于具体的应用场景和需求。通过BeanFactory的方式适合轻量级应用和移动设备,而BeanFactoryAware和ApplicationContext则更适合需要完整Spring功能的场合。

相关推荐
郝学胜-神的一滴21 分钟前
使用OpenGL绘制卡通效果的圣诞树
开发语言·c++·程序人生·游戏·图形渲染
想不明白的过度思考者24 分钟前
Spring Boot 配置文件深度解析
java·spring boot·后端
_OP_CHEN26 分钟前
【C++数据结构进阶】从B + 树 / B * 树到数据库索引:B树的进化之路与 MySQL 实战解析
数据结构·数据库·b树·mysql·innodb·b+树·mylsam
第二只羽毛27 分钟前
Java图书管理系统的设计与实现
java·大数据·安全·系统安全
敲敲了个代码5 小时前
从硬编码到 Schema 推断:前端表单开发的工程化转型
前端·javascript·vue.js·学习·面试·职场和发展·前端框架
想回家的一天5 小时前
ECONNREFUSED ::1:8000 前端代理问题
开发语言
cike_y5 小时前
Mybatis之解析配置优化
java·开发语言·tomcat·mybatis·安全开发
WanderInk6 小时前
刷新后点赞全变 0?别急着怪 Redis,这八成是 Long 被 JavaScript 偷偷“改号”了(一次线上复盘)
后端
云老大TG:@yunlaoda3606 小时前
华为云国际站代理商TaurusDB的成本优化体现在哪些方面?
大数据·网络·数据库·华为云
TG:@yunlaoda360 云老大6 小时前
华为云国际站代理商GeminiDB的企业级高可用具体是如何实现的?
服务器·网络·数据库·华为云