什么是被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); } }
代码很简单,自行研究。