@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 方法)。
我和 @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 方法)。