当前位置: 首页 > 知识库问答 >
问题:

在JavaFX中添加Spring依赖注入(JPA Repo,Service)

澹台新知
2023-03-14
@Autowired
EmployeeRepo employeeRepo;
public void start(Stage primaryStage) throws Exception {

// Some Code

employeeRepo.findAll() <- This is returning null

@PostConstruct
public void test() {
// Repo object is not giving null
}

有没有一种方法我可以手动注入依赖在我的按钮监听器或传递它到启动方法

如果有解决方案,请告诉我,因为我是JavaFX的新手

共有1个答案

孙宏扬
2023-03-14

JavaFX的依赖注入选项

有许多方法可以将依赖注入JavaFX应用程序。例如,Gluon有一个名为Gluon Ignite的项目,它为各种依赖注入框架(如Guice、Spring和Dagger)提供JavaFX应用程序。

由于您选择Spring作为依赖注入框架,并且希望使用一系列其他Spring工具,如Spring数据存储库,您可能希望考虑使用SpringBoot应用程序。

    null

该示例的一个关键部分是应用程序的init()方法(我刚刚复制、粘贴并在此复制以供参考):

@SpringBootApplication
public class DemoApplication extends Application {

    private ConfigurableApplicationContext springContext;
    private Parent root;

    @Override
    public void init() throws Exception {
        springContext = SpringApplication.run(DemoApplication.class);
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/sample.fxml"));
        fxmlLoader.setControllerFactory(springContext::getBean);
        root = fxmlLoader.load();
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("Hello World");
        Scene scene = new Scene(root, 800, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    @Override
    public void stop() throws Exception {
        springContext.stop();
    }


    public static void main(String[] args) {
        launch(DemoApplication.class, args);
    }
}

示例应用程序正在运行SpringBoot应用程序来启动Spring系统,并让它在init方法中提供应用程序上下文。然后,应用程序使用FXMLLoadersetControllerFactory()方法来允许Spring实例化FXML控制器,并在应用程序中注入对Spring bean的引用。

自动连接JavaFX控制器

fxmlLoader.setControllerFactory(springContext::getBean);
@Component
public class DemoController {
    @FXML
    private Label usernameLabel; 

    @Autowired
    public void mySpringService;

    public void initialize() {
        usernameLabel.setText(
            mySpringService.getLoggedInUsername()
        );
    }
}

因此,将Spring应用程序和JavaFX应用程序分开可能更好。这增强了应用程序的UI和服务部分之间的关注点的分离,并且使得测试更加容易,因为Spring应用程序可以独立于JavaFX应用程序的启动和关闭进行单元测试。

自动连接JavaFX应用程序类

注意,使用上面的设置,它不会自动连接JavaFX应用程序类实例化实例。如果您希望这样做,可以使用下面说明的技术在JavaFX实例化的应用程序类中注入bean:

    null
springContext
    .getAutowireCapableBeanFactory()
    .autowireBeanProperties(
        this,
        AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, 
        true
    );
    null

将命令行参数从JavaFX传递到SpringBoot

要将参数从JavaFX应用程序传递给SpringBoot应用程序,请使用:

SpringApplication.run(
    DemoApplication.class, 
    getParameters().getRaw().toArray(new String[0])
);

其他问题

ConfigurableApplicationContext startupContext =
        new SpringApplicationBuilder(DemoApplication.class)
                .web(WebApplicationType.NONE)
                .run(args);
 类似资料:
  • 问题内容: 我有一个具有简单场景(表单)的Java FX基本应用程序。我有一个Mysql Db,我正在使用Spring JPA(spring数据jpa,即存储库/实体)与之交互。 现在,由于我们知道javaFx有一些生命周期挂钩,即:init()start()和stop()。 假设我想使用JPA save() 方法在数据库中插入数据。通常,如果是我的控制器,则进行正常的数据库注入,例如: 本来可以

  • 我遇到了依赖注入周期问题。我请求重新设计建议。提前谢谢。 错误描述:应用程序上下文中某些bean的依赖关系形成一个循环: 这是两个班 第一类: 第二类:

  • 我正在编写一个应用程序,该应用程序与一个数据库通信,获取其他数据库的凭据,并连接到其他数据库。它使用在运行时构造的数据源和实体管理器工厂来执行此操作。 如果我想使用Spring Data Repositories,我想我需要自动连接它们,因此它们必须是Spring Beans。 如果在对第一个数据库运行查询之前没有构造的DataSource,我如何使用Spring Data?

  • 谢谢你。 更新:我找到了另一个解决方案,并在另一个帖子中发布了答案:https://stackoverflow.com/a/52021965/2580829

  • 在React中,想做依赖注入(Dependency Injection)其实相当简单。请看下面这个例子: // Title.jsx export default function Title(props) { return <h1>{ props.title }</h1>; } // Header.jsx import Title from './Title.jsx'; export defa

  • 依赖注入 Dependency Injection is a strong mechanism, which helps us easily manage dependencies of our classes. It is very popular pattern in strongly typed languages like C# and Java. 依赖注入是一个很强大的机制,该机制可以帮