Java 原型Bean中的自动布线

Java 原型Bean中的自动布线,java,spring,swing,Java,Spring,Swing,我正在使用Swing with Spring创建一个金融应用程序。在我的应用程序的一部分中,我有一个JList,其中包含应用程序中每个帐户的JLabel。单击JLabel时,我想在JTabbedPane中显示类型为AccountTab的JPanel。这一切都在以下控制器中执行 @Component public class AccountListController extends MouseAdapter implements MouseListener { @Autowired

我正在使用Swing with Spring创建一个金融应用程序。在我的应用程序的一部分中,我有一个
JList
,其中包含应用程序中每个
帐户的
JLabel
。单击
JLabel
时,我想在
JTabbedPane
中显示类型为
AccountTab
JPanel
。这一切都在以下控制器中执行

@Component
public class AccountListController extends MouseAdapter implements MouseListener {

    @Autowired
    private AccountService accountService;

    @Autowired
    private MainFrameView mainFrameView;

    @Autowired
    private ApplicationContext context;

    @Override
    public void mouseClicked(MouseEvent e) {
        if (e.getSource() instanceof JList) {
            JList list = (JList) e.getSource();
            JTabbedPane tabbedPane = this.mainFrameView.getTabbedPane();

            SidebarItem item = (SidebarItem) list.getModel().getElementAt(list.getSelectedIndex());
            Account account = accountService.findById(item.getValue());

            if (tabbedPane.indexOfTab(account.getName()) == -1) {
                AccountTab panel = context.getBean(AccountTab.class);
                panel.addTransactions(account.getTransactions());
                panel.getSplitPane().setDividerLocation(500);
                tabbedPane.addTab(item.getTitle(), panel);
            }

            tabbedPane.setSelectedIndex(tabbedPane.indexOfTab(account.getName()));
        }
    }

}
AccountTab
对每个
JLabel
进行更改,因此我创建了
AccountTab
一个原型bean,因此我收到每个帐户的一个新实例。为了使原型作用域工作,我需要使用
context.getBean(AccountTab.class)
。以下是
account选项卡
代码:

@Component
@Scope("prototype")
public class AccountTab extends JPanel {

    @Autowired
    private AccountTransactionPane transactionPane;

    private static final long serialVersionUID = 1L;
    private JTable table = new JTable();
    private JSplitPane splitPane;

    public AccountTab() {
        this.setLayout(new BorderLayout());
        JScrollPane scrollPane = new JScrollPane(this.table);
        splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollPane, transactionPane);
        splitPane.setEnabled(false);
        this.add(splitPane, BorderLayout.CENTER);
    }

    public void addTransactions(List<AccountTransaction> transactions) {
        this.table.setModel(new AccountTransactionTableModel(transactions));
    }

    //omitted rest of code
}
我有一个具体问题和一个一般问题。首先,
AccountTransactionPane
不是在
AccountTab
bean中自动连接的。我不知道为什么,我如何才能使
AccountTransactionPane
bean在
AccountTab
中自动连接

我的第二个问题更一般,我是自动接线的一切。似乎所有的东西都应该是豆子。我陷入了创建一个控制器(bean),注入UI(bean),然后注入另一个用作侦听器的控制器(bean),在该控制器内注入一个服务(bean)的模式。这正常吗?我找不到任何使用Spring应用程序的大型Swing的好例子来指导我

更新:Spring Java配置

@Configuration
@EnableJpaRepositories(basePackages="rhcloud.blog.tothought.data.repositories")
@EnableTransactionManagement
@ComponentScan({"rhcloud.blog.tothought.data", "rhcloud.blog.tothought.controllers", "rhcloud.blog.tothought.view.ui"})
public class ApplicationConfiguration {

      private static final String H2_JDBC_URL_TEMPLATE = "jdbc:h2:file:~/MyFinances/data;TRACE_LEVEL_FILE=3;TRACE_LEVEL_SYSTEM_OUT=3";

      @Bean
      public DataSource dataSource(){
            JdbcDataSource ds = new JdbcDataSource();       
            ds.setURL(H2_JDBC_URL_TEMPLATE);
            ds.setUser("sa");
            ds.setPassword("sa");

            return ds;
      }

      @Bean
      public EntityManagerFactory entityManagerFactory() {

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);
        vendorAdapter.setShowSql(true);
        vendorAdapter.setDatabase(Database.H2);

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("rhcloud.blog.tothought.data.entities");
        factory.setDataSource(dataSource());
        factory.afterPropertiesSet();

        return factory.getObject();
      }

      @Bean
      public PlatformTransactionManager transactionManager() {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory());
        return txManager;
      }

      /**
       * See: http://stackoverflow.com/questions/8434712/no-persistence-exception-translators-found-in-bean-factory-cannot-perform-excep
       * @return
       */
      @Bean 
        public HibernateExceptionTranslator hibernateExceptionTranslator(){ 
          return new HibernateExceptionTranslator(); 
        }

      @Bean
      public Application application(){
          return new Application();
      }
}

注射过程是这样的

  • 获取要为其创建bean的类的
    Class
    实例
  • 获取
    构造函数
    或使用
    类#newInstance()
    创建bean
  • 将bean的所有
    @Autowired
    目标注入bean
类的构造函数类似于

@Autowired
private AccountTransactionPane transactionPane;

...

public AccountTab() {
    this.setLayout(new BorderLayout());
    JScrollPane scrollPane = new JScrollPane(this.table);
    splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollPane, transactionPane);
    splitPane.setEnabled(false);
    this.add(splitPane, BorderLayout.CENTER);
}
很明显,
transactionPane
在构造函数中将是
null
。斯普林还没来得及给它注射。如果需要对注入的bean进行初始化,请考虑使用<代码> @ PrimeStudio< /Cord>注释方法。< /P>
我的第二个问题更一般,我是自动接线的一切。信息技术 似乎所有的东西都应该是豆子。我陷入了困境 创建一个控制器(bean),注入UI(bean),然后注入 另一个用作侦听器的控制器(bean),位于 控制器I注入服务(bean)。这正常吗


应该有一个应用程序入口点加载Spring
ApplicationContext
。其他每个组件(及其依赖项)都应该由该
ApplicationContext

管理注入过程如下

  • 获取要为其创建bean的类的
    Class
    实例
  • 获取
    构造函数
    或使用
    类#newInstance()
    创建bean
  • 将bean的所有
    @Autowired
    目标注入bean
类的构造函数类似于

@Autowired
private AccountTransactionPane transactionPane;

...

public AccountTab() {
    this.setLayout(new BorderLayout());
    JScrollPane scrollPane = new JScrollPane(this.table);
    splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollPane, transactionPane);
    splitPane.setEnabled(false);
    this.add(splitPane, BorderLayout.CENTER);
}
很明显,
transactionPane
在构造函数中将是
null
。斯普林还没来得及给它注射。如果需要对注入的bean进行初始化,请考虑使用<代码> @ PrimeStudio< /Cord>注释方法。< /P>
我的第二个问题更一般,我是自动接线的一切。信息技术 似乎所有的东西都应该是豆子。我陷入了困境 创建一个控制器(bean),注入UI(bean),然后注入 另一个用作侦听器的控制器(bean),位于 控制器I注入服务(bean)。这正常吗


应该有一个应用程序入口点加载Spring
ApplicationContext
。其他每个组件(及其依赖项)都应该由该
ApplicationContext

管理注入过程如下

  • 获取要为其创建bean的类的
    Class
    实例
  • 获取
    构造函数
    或使用
    类#newInstance()
    创建bean
  • 将bean的所有
    @Autowired
    目标注入bean
类的构造函数类似于

@Autowired
private AccountTransactionPane transactionPane;

...

public AccountTab() {
    this.setLayout(new BorderLayout());
    JScrollPane scrollPane = new JScrollPane(this.table);
    splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollPane, transactionPane);
    splitPane.setEnabled(false);
    this.add(splitPane, BorderLayout.CENTER);
}
很明显,
transactionPane
在构造函数中将是
null
。斯普林还没来得及给它注射。如果需要对注入的bean进行初始化,请考虑使用<代码> @ PrimeStudio< /Cord>注释方法。< /P>
我的第二个问题更一般,我是自动接线的一切。信息技术 似乎所有的东西都应该是豆子。我陷入了困境 创建一个控制器(bean),注入UI(bean),然后注入 另一个用作侦听器的控制器(bean),位于 控制器I注入服务(bean)。这正常吗


应该有一个应用程序入口点加载Spring
ApplicationContext
。其他每个组件(及其依赖项)都应该由该
ApplicationContext

管理注入过程如下

  • 获取要为其创建bean的类的
    Class
    实例
  • 获取
    构造函数
    或使用
    类#newInstance()
    创建bean
  • 将bean的所有
    @Autowired
    目标注入bean
类的构造函数类似于

@Autowired
private AccountTransactionPane transactionPane;

...

public AccountTab() {
    this.setLayout(new BorderLayout());
    JScrollPane scrollPane = new JScrollPane(this.table);
    splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollPane, transactionPane);
    splitPane.setEnabled(false);
    this.add(splitPane, BorderLayout.CENTER);
}
很明显,
transactionPane
在构造函数中将是
null
。斯普林还没来得及给它注射。如果需要对注入的bean进行初始化,请考虑使用<代码> @ PrimeStudio< /Cord>注释方法。< /P>
我的第二个问题更一般,我是自动接线的一切。信息技术 似乎所有的东西都应该是豆子。我陷入了困境 创建一个控制器(bean),注入UI(bean),然后注入 另一个控制器(bean),用作