@Autowired 的奇怪情况

Strange situation with @Autowired

我和 @Autowired 有奇怪的情况 应用程序的主要 class:

@Configuration
@EnableAutoConfiguration
@SpringBootApplication
@ComponentScan({"khartn", "khartn.torrentsuploader.processor"})
public class NewMain implements CommandLineRunner {

    public static void main(String[] args) {

        SpringApplicationBuilder builder = new SpringApplicationBuilder(NewMain.class);
        builder.headless(false);
        ConfigurableApplicationContext context = builder.run(args);
    }

    @Override
    public void run(String... args) throws Exception {
    }
}

组件class:

@Component("MyDirectoryReader")
public class MyDirectoryReader {

    public  MyDirectoryReader ( ) {
        System.out.println("qqqqqqqqqqqqqqq");
    }

    public void readDir() {
        try {
            String initialPathStr = NewJFrame.jTextField1.getText();
            System.out.println("initialPathStr " + initialPathStr);

            Path dir = FileSystems.getDefault().getPath(initialPathStr);
            DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.{torrent}");
            for (Path path : stream) {
                System.out.println(path.getFileName());
            }
            stream.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

应用程序启动时,我看到初始化了 MyDirectoryReader class:

2015-04-11 21:42:29.405  INFO 9375 --- [.NewMain.main()] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@13d6044f: startup date [Sat Apr 11 21:42:29 SAMT 2015]; root of context hierarchy
qqqqqqqqqqqqqqq

配置class:

@Configuration
@ComponentScan({"khartn", "khartn.torrentsuploader.processor"})
public class AppConfig {

    @Bean(initMethod = "init")
    public NewJFrame mainForm() {
        System.out.println("init mainForm");
        return new NewJFrame();
    }

}

并且在 NewJFrame 中 class 有自动装配字段

public class NewJFrame extends javax.swing.JFrame {

    @Autowired 
    @Qualifier(value = "MyDirectoryReader")
    MyDirectoryReader myDirectoryReader;

但是当 NewJFrame 显示并按下按钮时,

 private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         

        if (myDirectoryReader == null) {
            System.out.println("myDirectoryReader is null");
        }
//        myDirectoryReader.readDir();
    }   

那么 myDirectoryReader 为空。

为什么 MyDirectoryReader 被初始化为组件,但没有自动连接到该字段?

根据 init 方法中的代码,您调用了 new NewJFrame().setVisible(true);,但是,当您自己创建一个对象时,Spring 并不知道并且自动装配不起作用。您必须使用 Spring bean 对象本身。我认为,如果将该行更改为 this.setVisible(true),它应该可以正常工作(因为在实例化 bean 时会执行 init 方法)。