前言:此文仅限老手入行,大佬回避。
咱们在应用 Spring 开发程序的适宜,Spring 提供了很不便的对象治理形式,即IOC
,而且也提供了十分敌对边界的对象注入形式DI
,
只有是被 Spring 容器所治理的类,就能够应用 @Resource
或者 @Autowired
注解将其余被 Spring 容器治理的类注入进来。
什么是被 Spring 容器治理的类?
只有是被称之为 Bean
的类就是被 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);
}
}
代码很简略,自行钻研。