为什么@autowired 不实例化我的领域?

why @autowired doos not instanciate my field?

我用的是Spring引导注解样式,查了几次都不明白,为什么注解字段returns为null。

请在我的java代码下方:

package app.ui;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.WindowConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

@Service
public class MyFrame extends JFrame {
  private JMenu     fileMenu;
  private JMenuBar  menuBar;
  private JMenuItem openMenuItem;

  @Autowired
  MyDialog myDialog;

  @Autowired
  JdbcTemplate jdbcTemplate;


  public MyFrame() {
    initComponents();
    setVisible(true);
  }


  private void initComponents() {
    jdbcTemplate.toString();
    this.setTitle("Vue de ma fenêtre");
    this.setSize(new Dimension(300, 150));
    this.setLocationRelativeTo(null);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    this.getContentPane().setLayout(new FlowLayout());

    menuBar = new JMenuBar();
    fileMenu = new JMenu();
    openMenuItem = new JMenuItem();
    fileMenu.setText("File");
    openMenuItem.setText("Inscription");
    openMenuItem.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        myDialog.setVisible(true);
      }
    });
    fileMenu.add(openMenuItem);
    menuBar.add(fileMenu);
    setJMenuBar(menuBar);
    //
    final JButton cmd1 = new JButton("Créer Table");
    getContentPane().add(cmd1);
    cmd1.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        jdbcTemplate.execute("DROP TABLE customers IF EXISTS");
        jdbcTemplate.execute(
            "CREATE TABLE customer(id bigint(11), nom VARCHAR(55), prenom VARCHAR(55), dnaiss date)");
        cmd1.setEnabled(false);
      }
    });

    //

在此示例中,jdbcTemplate.toString() returns 为空,我不明白为什么,因为它在下面的操作执行方法中起作用

感谢您的帮助。

这是 Java 初始化 class 的方式,第一个构造函数稍后执行 class 变量被初始化。直到并且除非变量是静态块的一部分。相同的逻辑后跟spring。

在您的示例中,jdbcTemplate 是一个 class 变量,jdbcTemplate.toString();通过默认构造函数调用,而 actionperformed 在 MyFrame 的实例上调用。

要了解更多关于 class 初始化的信息,请查看下面 link

http://www.javaworld.com/article/2075796/java-platform/java-101--class-and-object-initialization.html?nsdr=true