前语:此文仅限新手入行,大佬逃避。

咱们在运用Spring开发程序的合适,Spring供给了很便利的目标办理办法,即IOC,并且也供给了十分友爱边界的目标注入办法DI

只要是被Spring容器所办理的类,就能够运用@Resource或许@Autowired注解将其他被Spring容器办理的类注入进来。

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

什么是被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);
    }
}

代码很简单,自行研讨。