我需要在启动应用程序之前执行代码。
我编写了以下监听器(在web.xml中注册):
Profile("test")
public class H2Starter extends ContextLoaderListener {
@Override
public void contextInitialized(ServletContextEvent event) {
System.out.println("invoked")
}
}
我希望只有在激活test
个人资料时才会调用侦听器
但它始终会调用。如何解决这个问题?
答案 0 :(得分:0)
根据文档@Profile
,注释只能应用于@Component
或@Configuration
。无论如何,您无法在ContextLoaderListener中获取有关配置文件的信息,因为尚未加载ApplicationContext。如果您想在应用程序启动时调用您的代码,我的建议是创建ApplicationListener
并听取ContextRefreshEvent
:
@Component
public class CustomContextListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
Environment environment = contextRefreshedEvent.getApplicationContext().getEnvironment();
if(environment.acceptsProfiles("test")){
System.out.print("Test profile is active");
}
}
}
首次在应用程序初始化之后调用此侦听器。 如果要在上下文启动之前获取配置文件信息,则可以创建新的上下文加载器:
public class ProfileContextListener extends ContextLoaderListener {
@Override
public void contextInitialized(ServletContextEvent event) {
if(isProfileActive("test", event.getServletContext())){
System.out.println("Profile is active");
}
}
private boolean isProfileActive(String profileName, ServletContext context) {
String paramName = "spring.profiles.active";
//looking in web.xml
String paramValue = context.getInitParameter(paramName);
if(paramValue==null) {
//if not found looking in -D param
paramValue = System.getProperty(paramName);
};
if(paramValue==null) return false;
String[] activeProfileArray = paramValue.split(",");
for(String activeProfileName : activeProfileArray){
if(activeProfileName.trim().equals(profileName)) return true;
}
return false;
}
}
要激活所需的配置文件,您需要添加到web.xml特殊的spring环境属性 - spring.profiles.active
:
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>default,test</param-value>
</context-param>
或者你可以设置profile throw -D jvm-option
-Dspring.profiles.active=default,test
请注意,您可以添加以逗号分隔的多个个人资料名称。
答案 1 :(得分:0)
根据我的理解,弹簧轮廓仅适用于配置
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html
似乎配置文件注释不适用于您提到的方案。