关于后端:如何在非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数据后,放到动态属性中。

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

代码很简略,自行钻研。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理