首页 > 其他分享 >如何在非Spring容器管理的类中注入/获取 Spring容器中的 Bean?

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

时间:2023-03-17 17:57:30浏览次数:45  
标签:容器 return Spring beanName bean Bean context

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

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

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

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

image.png

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

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

不了解的可以看看小简写的这一篇:

将Bean交给Spring容器管理的几种方式

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

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

“不可能的,很少见”

“一般碰不到的”

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

比如我这一篇:

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

解决方法

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

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);
    }
}

代码很简单,自行研究。

标签:容器,return,Spring,beanName,bean,Bean,context
From: https://www.cnblogs.com/JanYork/p/17227680.html

相关文章

  • Springboot + Swagger 访问 404 的问题
    在继承了 WebMvcConfigurerAdapter或的类重写@OverridepublicvoidaddResourceHandlers(ResourceHandlerRegistryregistry){registry.addResourceH......
  • 解决springBoot整合knife4j报错的问题
    依赖:<!--引入knife4j依赖--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</ve......
  • Spring Boot + Activiti 快速实现工作流
     注:本文转自:https://mp.weixin.qq.com/s/w9-uXhm9QOXoas-h37cgFw1、概念工作流。通过计算机对业务流程自动化执行管理,主要解决的是“使在多个参与者之间按照某种预定义......
  • springboot
    自动配置Configuration注解+Bean注解//获取容器中所有的组件String[]allBean=run.getBeanDefinitionNames();for(Stringname:allBean){......
  • 【Bug】 Springboot 调用第三方接口报在 "请求目标中找到无效字符。有效字符在RFC 72
    错误信息问题原因tomcat高版本严格按照RFC3986规范解析地址。该规范只允许包含a-zA-Z0-9-_.~以及所有保留字符!*’();:@&=+$,/?#[......
  • SpringBoot---Controller
    控制器SpringBoot提供了@Controller和RestController两种注解来标识此类负责接收和处理HTTP请求。如果请求的是页面和数据,使用@Controller注解即可;如果只请求数据,可以......
  • spring cloud feign的使用
    1、引入依赖<!--远程调用feign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-o......
  • SpringBoot多数据源配置以及事务处理
    注:本文转自:https://www.toutiao.com/article/7204651968885686787/?log_from=4fd44355ebbb6_1679021148713背景在高并发的项目中,单数据库已无法承载大数据量的访问,因此需......
  • SpringMVC-Rest风格
    SpringMVC-Rest风格5,Rest风格REST简介REST入门案例REST快速开发案例:基于RESTful页面数据交互5.1REST简介REST(RepresentationalStateTransfer),表现形式状态转......
  • SpringMVC-请求与响应
    SpringMVC-请求与响应4,请求与响应SpringMVC是web层的框架,主要的作用是接收请求、接收数据、响应结果请求映射路径请求参数日期类型参数传递响应json数据4.1设置......