# 说明
项目中涉及到 dubbo 服务,在项目中需要将这个服务作为一个 bean 注入,由于本人需要在静态方法中使用这个 bean,所以如果使用类似 @Autowire 等注解注入时会编译报错。
# 解决方法
自己写一个工具类,通过 spring 上下文获取这个 bean。转成静态的。
import org.springframework.beans.BeansException; | |
import org.springframework.context.ApplicationContext; | |
import org.springframework.context.ApplicationContextAware; | |
import org.springframework.stereotype.Component; | |
/** | |
* <p> | |
* <code>SpringContextHelper</code> | |
* </p> | |
* Description: | |
* | |
* @author xxx | |
* @date 2017/12/28 10:34 | |
*/ | |
/* | |
* @Component 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 | |
* 标记为组件后在启动服务时,会将此类实例化到 spring 容器中,相当于配置文件中的 & lt;bean id=""class=""/> | |
*/ | |
@Component | |
public class SpringContextHelper implements ApplicationContextAware{ | |
/** | |
* Spring 应用上下文环境 | |
*/ | |
private static ApplicationContext applicationContext; | |
/** | |
* 重写并初始化上下文 | |
* @param applicationContext 应用上下文 | |
* @throws BeansException bean 异常 | |
*/ | |
@Override | |
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { | |
// 初始化 applicationContext | |
SpringContextHelper.applicationContext = applicationContext; | |
} | |
/** | |
* 通过类获取 | |
* @param clazz 注入的类 | |
* @param <T> 返回类型 | |
* @return 返回这个 bean | |
* @throws BeansException bean 异常 | |
*/ | |
@SuppressWarnings("unchecked") | |
public static <T> T getBean(Class clazz) throws BeansException { | |
return (T)applicationContext.getBean(clazz); | |
} | |
/** | |
* 通过名字获取 | |
* @param name 名字 | |
* @param <T> 返回类型 | |
* @return 返回这个 bean | |
* @throws BeansException bean 异常 | |
*/ | |
@SuppressWarnings("unchecked") | |
public static <T> T getBean(String name) throws BeansException { | |
return (T) applicationContext.getBean(name); | |
} | |
} |
在需要使用的类中注入你的 bean 使用即可
private static EmployeeService employeeService = SpringContextHelper.getBean(EmployeeService.class); |
网上还有类似的解决办法,例如使用 @PostConstruct 等,或是直接先实例化这个类,再调用,如 new TestClass ().employeeService(在这里肯定不适用),我都尝试了下,没有成功。