Java 原型Bean中的自动布线
我正在使用Swing with Spring创建一个金融应用程序。在我的应用程序的一部分中,我有一个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
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)。这正常吗
应该有一个应用程序入口点加载SpringApplicationContext
。其他每个组件(及其依赖项)都应该由该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)。这正常吗
应该有一个应用程序入口点加载SpringApplicationContext
。其他每个组件(及其依赖项)都应该由该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)。这正常吗
应该有一个应用程序入口点加载SpringApplicationContext
。其他每个组件(及其依赖项)都应该由该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),用作