![](/img/trans.png)
[英]Spring Application context is null in a ApplicationContextAware class
[英]Spring application context is null
我正在使用Spring Boot 1.3.3和JavaFX。 應用程序成功啟動Splash屏幕(此時applicationContext不為null)
@SpringBootApplication
public class PirconApplication extends Application{
@Bean(name = "primaryStage")
public Stage getPrimaryStage() {
return new Stage(StageStyle.DECORATED);
}
private ConfigurableApplicationContext applicationContext = null;
private static String[] args = null;
@Override
public void stop() throws Exception {
super.stop();
Platform.exit();
applicationContext.close();
}
@Override
public void start(Stage primaryStage) throws Exception {
Task<Object> worker = worker();
worker.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent event) {
try {
AppSplashController loader = applicationContext.getBean(AppSplashController.class);
Stage stage = applicationContext.getBean(Stage.class);
stage.setScene(loader.init());
stage.initStyle(StageStyle.UNDECORATED);
stage.show();
} catch (IOException e) {
e.printStackTrace();
System.exit(0);
}
}
});
worker.setOnFailed(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent event) {
// TODO Auto-generated method stub
System.exit(0);
}
});
worker.run();
}
public static void main(String[] args) {
PirconApplication.args = args;
launch(PirconApplication.class, args);
}
private Task<Object> worker() {
return new Task<Object>() {
@Override
protected Object call() throws Exception {
applicationContext = SpringApplication.run(PirconApplication.class, args);
return null;
}
};
}
}
問題在於AppSplashController applicationContext和primaryStage bean都是null。
@Component
public class AppSplashController implements BootInitializable {
@FXML
private ImageView imgLoading;
@FXML
private Text lblWelcome;
@FXML
private Text lblRudy;
@FXML
private VBox vboxBottom;
@FXML
private Label lblClose;
private Stage primaryStage;
private ApplicationContext springContainer;
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
System.out.println("applicationContext: "+springContainer);
System.out.println("primaryStage: "+primaryStage);
}
}
@Autowired
@Override
public void setPrimaryStage(Stage primaryStage) {
this.primaryStage = primaryStage;
}
@Override
public Scene init() throws IOException {
Parent root = FXMLLoader.load(getClass().getResource("/com/pircon/views/splash.fxml"));
return new Scene(root);
}
@Override
public void setApplicationContext(ApplicationContext ac) throws BeansException {
this.springContainer = ac;
}
}
BootInitializable接口
public interface BootInitializable extends Initializable, ApplicationContextAware {
public Scene init() throws IOException;
public void setPrimaryStage(Stage primaryStage);
}
這是我春季和春季靴子的第一個項目,所以請原諒我的無知。
我認為你需要指定spring來設置autowire這些bean。 例如
@Autowired
private ApplicationContext springContainer;
另一個建議是使用ApplicationContextProvider實現spring ApplicationContextAware接口。
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext context;
public static ApplicationContext getApplicationContext() {
return context;
}
@Override
public void setApplicationContext(ApplicationContext ctx) {
context = ctx;
}
}
您可以通過ApplicationContextProvider.getApplicationContext();
獲取應用程序上下文ApplicationContextProvider.getApplicationContext();
這是另一種方法,您可以在應用程序級別使用ApplicationContext實例。
import org.springframework.context.ApplicationContext;
/**
* @author Dinesh.Lomte
*
*/
public enum AppContext {
INSTANCE;
public static AppContext getInstance() {
return INSTANCE;
}
private ApplicationContext applicationContext;
/**
* Default constructor
*/
private AppContext() {
}
/**
*
*/
public void setContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
/**
*
* @return
*/
public ApplicationContext getContext() {
return applicationContext;
}
}
在服務器啟動或應用程序啟動期間設置ApplicationContext實例。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import com.app.logger.AppLogger;
import com.app.util.AppContext;
/**
* @author Dinesh.Lomte
*
*/
@SpringBootApplication
@ComponentScan ({"com.app"})
public class RunSpringApplication {
private static final AppLogger LOGGER =
new AppLogger(RunSpringApplication.class);
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(
RunSpringApplication.class, args);
// Setting the application context for further references
AppContext.getInstance().setContext(applicationContext);
LOGGER.info("------------------------------------------------");
LOGGER.info("App started successfully.");
}
}
最后根據您的需要在類中使用ApplicationContext實例。
ApplicationContext applicationContext = AppContext.getInstance().getContext();
AppConfigProp appConfigProp = applicationContext.getBean(AppConfigProp.class);
MailConfigProp mailConfigProp = AppContext.getInstance().getContext()
.getBean(MailConfigProp.class);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.