Had I not seen the Sun[我本可以忍受黑暗]
I could have borne the shade[如果我不曾见过太阳]
But Light a newer Wilderness[然而阳光已使我的荒凉]
My Wilderness has made[成为更新的荒凉]
——Emily Dickinson
之前我们引用spring
里的bean
都是通过@Autowired
或者@Resource
注解获取
这里可以使用第三种方式
首先写个工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| package com.ruben.utils;
import org.springframework.beans.BeansException; import org.springframework.beans.factory.DisposableBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service;
import java.util.Optional;
@Lazy(false) @Component("SpringContextHolder") public class SpringContextHolder implements ApplicationContextAware, DisposableBean {
private static ApplicationContext applicationContext; private static final String ERROR_MESSAGE = "applicationContext尚未注入";
@Override public void destroy() { applicationContext = null; }
@Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringContextHolder.applicationContext = applicationContext; }
public static <T> T getBean(Class<T> type) { return Optional.ofNullable(applicationContext).orElseThrow(() -> new IllegalStateException(ERROR_MESSAGE)).getBean(type); }
@SuppressWarnings("unchecked") public static <T> T getBean(String name) { return (T) Optional.ofNullable(applicationContext).orElseThrow(() -> new IllegalStateException(ERROR_MESSAGE)).getBean(name); }
}
|
然后就可以通过
1
| private static final UserService userService = SpringContextHolder.getBean(UserService.class);
|
获取到注入到spring
容器的bean
注意,如果是单体架构项目需要在引用时在对应的组件上加@DependsOn("SpringContextHolder")
注解
或者是分布式项目的话,直接写到最顶层依赖部分就行