前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在非Spring容器管理的类中注入/获取 Spring容器中的 Bean?

如何在非Spring容器管理的类中注入/获取 Spring容器中的 Bean?

作者头像
JanYork_小简
发布2023-03-18 16:23:32
3.8K0
发布2023-03-18 16:23:32
举报
文章被收录于专栏:小简技术栈

如何在非Spring容器管理的类中注入/获取 Spring容器中的 Bean

前言:此文仅限新手入行,大佬回避。

我们在使用Spring开发程序的时候,Spring提供了很方便的对象管理方式,即IOC,而且也提供了非常友好便捷的对象注入方式DI

只要是被Spring容器所管理的类,就可以使用@Resource或者@Autowired注解将其他被Spring容器管理的类注入进来。

什么是被Spring容器管理的类?

只要是被称之为Bean的类就是被Spring容器管理的类。

不了解的可以看看小简写的这一篇: 将Bean交给Spring容器管理的几种方式

在非Spring管理的类中怎么办?

有时候我们就是需要在非Spring管理的类中使用Bean怎么办呢?

“不可能的,很少见” “一般碰不到的”

很多入职的新人可能会这样想,但是!我告诉你,很多情况都会要使用到这个。

比如我这一篇:

踩坑篇之WebSocket实现类中无法使用@Autowired注入对象

解决方法

我们定义一个上下文类,在SpringBean全部扫描完成后,我们去使用类去实现ApplicationContextAware接口,重写setApplicationContext方法,获取到ApplicationContext数据后,放到静态属性中。

代码语言:javascript
复制
package cn.donglifeng.shop.common.context;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;

/**
 * @author JanYork
 * @date 2023/3/8 9:33
 * @description SpringBean上下文
 */
@Component
public class SpringBeanContext implements ApplicationContextAware {

    private static ApplicationContext context;

    @Override
    public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }

    /**
     * 获取上下文
     *
     * @return 上下文对象
     */
    public static ApplicationContext getContext() {
        return context;
    }

    /**
     * 根据beanName获取bean
     *
     * @param beanName bean名称
     * @return bean对象
     */
    public Object getBean(String beanName) {
        return context.getBean(beanName);
    }

    /**
     * 根据beanName和类型获取bean
     *
     * @param beanName bean名称
     * @param clazz    bean类型
     * @param <T>      bean类型
     * @return bean对象
     */
    public <T> T getBean(String beanName, Class<T> clazz) {
        return context.getBean(beanName, clazz);
    }

    /**
     * 根据类型获取bean
     *
     * @param clazz bean类型
     * @param <T>   bean类型
     * @return bean对象
     */
    public <T> T getBean(Class<T> clazz) {
        return context.getBean(clazz);
    }
}

代码很简单,自行研究。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023 年 03 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何在非Spring容器管理的类中注入/获取 Spring容器中的 Bean?
    • 什么是被Spring容器管理的类?
      • 在非Spring管理的类中怎么办?
        • 解决方法
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档