是否可以在某个类的静态块中获得弹簧活动轮廓的值?
我已经尝试过@value("$(spring.profiles.active)")
和@Autowired Environment env;
来获取值,但在静态块中都是null。
我知道静态块是在bean加载期间的spring初始化之前执行的,那么有没有任何变通方法可以在静态块内获取活动概要文件值或application.yml中的任何值?
样本代码:
@Value("$(spring.profiles.active)")
private String env;
static {
URL url = null;
WebServiceException e = null;
try {
ClassPathResource wsdlLoc = new ClassPathResource("/wsdl/Transaction_"+env+".wsdl");
url = new URL(wsdlLoc.getURL().toString());
} catch (IOException ex) {
e = new WebServiceException(ex);
}
TRANSACTIONPROCESSOR_WSDL_LOCATION = url;
TRANSACTIONPROCESSOR_EXCEPTION = e;
}
AFAIK这是不可能的,也不应该使用。。
混合静态上下文和依赖注入框架的上下文是一种反模式。
根据您想要注入env的位置,这应该不会有太大的区别,因为Spring将在注入上下文中作为Singleton处理您的组件/服务。
总结:不要在Spring应用程序中使用大量静态上下文
请在static中使用以下工具来获取env变量
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.DisposableBean;
@Service
@Lazy(false)
public class SpringContextHolder implements ApplicationContextAware, DisposableBean{
private static ApplicationContext applicationContext = null;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static void clearHolder() {
applicationContext = null;
}
@Override
public void destroy() throws Exception {
SpringContextHolder.clearHolder();
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextHolder.applicationContext = applicationContext;
}
}
如何使用
import org.springframework.core.env.Environment;
//--- pass some code
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
Environment environment = SpringContextHolder.getApplicationContext().getEnvironment();
System.out.println(environment.getProperty("spring.profiles.active"));
}
}