问题
- 有一个 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);