問題
- 有一個 zk 配置,通過 @ConfigurationProperties 註釋由 spring 容器自動初始化
@ConfigurationProperties(prefix = "jingwei.zookeeper")
public class ZkConfig {
private String hosts;
private String namespace;
private int sessionTimeout;
private int connectionTimeout;
}
- 但是我們要使用 ZkConfig 的地方是一個普通類 ZkManager,它沒有 @controller 、@service、@repository 註解,也就不會被 spring 容器自動初始化。
- 如果在 ZkManager 中使用下面代碼,然後 new ZkManager(),可以發現 zkConfig 爲 null。
@Resource
private ZkConfig zkConfig;
方案1
- 在 ZkManager 類上加 @Component 註解。
- 使用 Resource 註解
@Resource
private ZkConfig zkConfig;
@PostConstruct
public void init() {
System.out.println(zkConfig.getHosts());
}
方案2
@Component
public final class SpringUtils implements BeanFactoryPostProcessor {
private static ConfigurableListableBeanFactory beanFactory;
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
SpringUtils.beanFactory = beanFactory;
}
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException {
return (T) beanFactory.getBean(name);
}
public static <T> T getBean(Class<T> clz) throws BeansException {
@SuppressWarnings("unchecked")
T result = (T) beanFactory.getBean(clz);
return result;
}
public static boolean containsBean(String name) {
return beanFactory.containsBean(name);
}
public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
return beanFactory.isSingleton(name);
}
public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
return beanFactory.getType(name);
}
public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
return beanFactory.getAliases(name);
}
}
this.zkConfig = SpringUtils.getBean(ZkConfig.class);