spring boot在静态块中获取spring.profiles.active值

6yjfywim  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(1513)

是否可以在某个类的静态块中获取spring活动概要文件的值?
我试过了 @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;
    }
gj3fmq9x

gj3fmq9x1#

请在静态中使用下面的工具来获取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"));
    }

}
uqjltbpv

uqjltbpv2#

恐怕这是不可能的,不应该使用。。
混合静态上下文和依赖注入框架的上下文是一种反模式。
这取决于您希望将env注入到哪里,不会有太大的区别,因为spring将把您的组件/服务作为注入上下文上的一个单例来处理。
总结:不要在spring应用程序中使用大量静态上下文

相关问题