如何在非Spring容器管理的类中注入/获取 Spring容器中的 Bean?
如何在非Spring容器管理的类中注入/获取 Spring容器中的 Bean
?
前言:此文仅限新手入行,大佬回避。
我们在使用Spring开发程序的适合,Spring提供了很方便的对象管理方式,即IOC
,而且也提供了非常友好边界的对象注入方式DI
,
只要是被Spring容器所管理的类,就可以使用@Resource
或者@Autowired
注解将其他被Spring容器管理的类注入进来。
什么是被Spring容器管理的类?
只要是被称之为Bean
的类就是被Spring
容器管理的类。
不了解的可以看看小简写的这一篇:
在非Spring管理的类中怎么办?
有时候我们就是需要在非Spring
管理的类中使用Bean
怎么办呢?
“不可能的,很少见”
“一般碰不到的”
很多入职的新人可能会这样想,但是!我告诉你,很多情况都会要使用到这个。
比如我这一篇:
踩坑篇之WebSocket实现类中无法使用@Autowired注入对象
解决方法
我们定义一个上下文类,在Spring
将Bean
全部扫描完成后,我们去使用类去实现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);
}
}
代码很简单,自行研究。